Apollo又稱阿波羅設定中心,在前兩年還是挺火的,但阿里SpringCloud套件席捲國內之後,nacos就成為了最被親睞的分散式設定中心,nacos是設定中心和註冊中心二合一的產品,單純功能上Apollo其實更強大一些。本篇就把Apollo的安裝及使用分享給大家。
1)、GitHub下載:https://github.com/nobodyiam/apollo-build-scripts
2)、網路硬碟下載:https://github.com/ctripcorp/apollo/wiki/Quick-Start(看這個檔案下面給的網路硬碟連結)
虛擬機器器:記憶體2G+
JDK:java1.8k環境
資料庫:mysql在5.7+(如果在低版本資料庫執行阿波羅結構時,預設是不能支援在一個表中有兩個時間戳型別欄位,所以建議大家使用mysql在5.7以上。)
去Github上下載最新的apollo-build-scripts-master 整個阿波羅環境包
建立兩個資料庫
在apollo-build-scripts-master\sql目錄下有兩個SQL檔案:分別為:apolloconfigdb(存放組態檔資訊)、apolloportaldb(入口網站),在資料庫中執行建立;
修改apollo安裝指令碼demo.sh,修改其中的資料庫連線資訊和相關服務地址資訊。
執行命令:./demo.sh start
PS:記得關閉防火牆,如果連的是遠端資料庫,記得開放mysql使用者的許可權,root@'%',也別用本機資料庫,虛擬機器器可能ping不通本機,連不上本機資料庫。
啟動後,存取地址:http://192.168.121.129:8070
預設賬號密碼:apollo admin
注意:
1)、這裡範例使用的是renren-fast,是單一專案,所以就建立一個apollo專案即可,然後可以建立多個namespace,存放不同環境的組態檔(開發、測試、生產);
2)、如果是微服務專案,那麼給每一個微服務都建立一個apollo專案,應用ID是每個微服務的appId,應用名稱也儘量見名知意。
可以建立不同環境的組態檔名稱空間,並且可以展開伸縮。
PS:這裡是測試,真實環境最好按照規範比如renren.user這樣來命名。
如果是yml名稱空間,就直接文字拷貝進來。
如果是預設的properties名稱空間,自己專案的設定是yml格式,就要先進行轉換,然後拷貝到文字中。
yml轉properties轉換工具:yml轉properties工具
拷貝到文字中
它會自己轉換
最後點選釋出即可
使用阿波羅注意事項:
1)、本地快取地址:windows:C:\opt\data\,Linux:/opt/data
2)、本地環境設定地址:windows:C:\opt\settings,Linux:/opt/settings
3)、如果設定完成後可以讀取到apollo釋出的設定資訊,但是修改後再發布,發現專案獲取不到最新的,需要檢查一下本地快取地址data目錄下的組態檔是否更新,或者是否存在這個快取檔案,如果不存在,說明根本沒有快取成功,這個名稱空間大概有問題。
PS:這裡筆者出現的問題就是本地根本沒快取application-dev這個名稱空間的設定資訊,因為我建立的時候用的是yml格式,刪掉後我改用properties格式,然後就可以了。
在前面搭建Apollo環境OK的前提下,這是案例環境的截圖,有四個名稱空間。
1)、Apollo使用指南:https://github.com/ctripcorp/apollo/wiki/Apollo使用指南
2)、java樣例使用者端啟動:https://github.com/ctripcorp/apollo/wiki/Apollo開發指南#23-java樣例使用者端啟動
3)、spring-boot整合方式推薦:https://github.com/ctripcorp/apollo/wiki/Java使用者端使用指南#3213-spring-boot整合方式推薦
<!-- apollo依賴 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-core</artifactId>
<version>1.1.0</version>
</dependency>
刪掉專案原本的application.yml等組態檔,在resources下新建一個application.properties檔案。
app.id=renren-fast
apollo.meta=http://192.168.1.128:8080
# 注入非預設application namespace或多個namespace的設定範例
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application,application-dev,application-prod,application-test
啟動類加上開啟Apollo的註解:@EnableApolloConfig
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableApolloConfig
public class RenrenApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(RenrenApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
return app.sources(RenrenApplication.class);
}
}
可選項,這個settings/server.properties也可以不建立,在需要切換不同環境時才需要。
修改/opt/settings/server.properties(Mac/Linux)或 C:\opt\settings\server.properties(Windows)檔案,沒有目錄就新建出來,設定env為DEV:env=DEV
說明:
1)、這個環境設定的意義,可以參考:https://github.com/ctripcorp/apollo/wiki/Java使用者端使用指南#3213-spring-boot整合方式推薦,搜尋鍵碼env=DEV,也可以自己去網上找資料;
2)、這個C:\opt\settings\server.properties是需要自己建立的,不會自己生成。
阿波羅在原生的快取地址,快取的其實就是這些組態檔,如果阿波羅掛掉了,專案會存取這個快取檔案,也不影響專案執行。
測試一個介面看是否能獲取到設定資訊
啟動後存取介面
檢視是否有列印出資料來源url
修改一下設定後再發布,看是否會重新整理:發現刪掉的部分已經沒了。
此案例參考了每特教育的案例:
閘道器內整合了swagger檔案,把swagger寫死的部分作為json儲存在apollo中,閘道器服務通過java程式碼動態獲取apollo儲存的json資訊,賦給swagger檔案實現。
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableSwagger2Doc
@EnableApolloConfig
public class AppGateWay {
// 獲取ApolloConfig
@ApolloConfig
private Config appConfig;
public static void main(String[] args) {
SpringApplication.run(AppGateWay.class, args);
}
// 新增檔案來源
@Component
@Primary
class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
// 開啟監聽,組態檔發生改變需要更改
appConfig.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
get();
}
});
return resources();
}
/**
* 從阿波羅伺服器中獲取resources
*
* @return
*/
private List<SwaggerResource> resources() {
List resources = new ArrayList<>();
// app-itmayiedu-order
// 閘道器使用服務別名獲取遠端服務的SwaggerApi
String swaggerDocJson = swaggerDocument();
JSONArray jsonArray = JSONArray.parseArray(swaggerDocJson);
for (Object object : jsonArray) {
JSONObject jsonObject = (JSONObject) object;
String name = jsonObject.getString("name");
String location = jsonObject.getString("location");
String version = jsonObject.getString("version");
resources.add(swaggerResource(name, location, version));
}
return resources;
}
/**
* 獲取swaggerDocument設定
* 這裡使用apollo提供的config來獲取mayikt.zuul.swaggerDocument這個key對應的json值
* @return
*/
private String swaggerDocument() {
String property = appConfig.getProperty("mayikt.zuul.swaggerDocument", "");
return property;
}
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
}
在apollo中對應的名稱空間內新建一個key-value:mayikt.zuul.swaggerDocument,對應上面config.getProperty("mayikt.zuul.swaggerDocument",""),後面空表示沒取到就返回空串。
key:mayikt.zuul.swaggerDocument
value是如下內容:
[
{
"name": "app-mayikt-member",
"location": "/app-mayikt-member/v2/api-docs",
"version": "2.0"
},
{
"name": "app-mayikt-weixin",
"location": "/app-mayikt-weixin/v2/api-docs",
"version": "2.0"
}
]
PS:這個監聽類會在專案啟動後自動開啟一個執行緒和apollo建立長連線,監聽apollo設定的變化並列印出紀錄檔。切忌使用AOP或者放在get方法裡面,這樣會開啟很多執行緒和apollo連線,導致系統CPU飆高。
新增下面一個監聽類即可:
@Component
@Slf4j
public class MyCommandLineRunner implements CommandLineRunner {
@ApolloConfig
private Config config;
@Override
public void run(String... args) throws Exception {
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
log.debug("分散式設定中心監聽: {}", changeEvent.changedKeys().toString());
}
});
}
}
Apollo設定中心是攜程團隊精心創作的開源產品,哪怕現在Nacos如日中天,Apollo也依然受到很多專案團隊的歡迎。有些公司的研發團隊開發專案並不一定會使用阿里微服務套件,像Apollo這樣的元件就會成為選項之一,大家感興趣的話可以嘗試一下新版本的使用,也可以收藏本篇,以後若用到翻出來參考即可。
8年多工作及學習過程中在雲筆記中記錄了很多內容,我閒暇之餘都做了下整理,本篇只是其中之一,有感興趣的朋友可以私信我獲取,什麼時候用到了翻開說不定就能節省很多時間。
本人原創文章純手打,覺得有一滴滴幫助就請點個推薦吧~
本人持續分享實際工作經驗和主流技術,喜歡的話可以關注下哦~