1. 程式人生 > 程式設計 >高效Springboot配置管理,Apollo快速上手

高效Springboot配置管理,Apollo快速上手

技術選型

微服務架構中Springboot配置檔案繁多,Apollo統一高效的管理Springboot配置檔案。

簡單說就是說所有Springboot專案本地不再需要配置檔案,所有配置檔案由Apollo統一管理,講的高大上點叫做雲配置。

Apollo優點:

  • 開源,由Springboot開發,支援叢集部署。
  • 提供了良好WebUI體驗,角色許可權控制,環境區分,灰度釋出等等細粒度的配置檔案管控。
  • 唯一依賴是Mysql,Apollo將配置檔案儲存到Mysql。
  • 中文檔案極為豐富,學習起來及其容易,github.com/ctripcorp/a…

其他的技術

  • SpringConfig:原生不自帶WebUI,配置檔案通過Git託管,需要通過Git來管理配置檔案。
  • Zookeeper:沒有WebUI,檔案由Zookeeper自己管理。(好像沒啥用)
  • nacos: 阿里巴巴開源的配置檔案管理中心,容易和SpringCloud Alibaba整合,有WebUI。

1分鐘搭建一個單機的

不用docker搭建,docker搭建有問題的,需要調節一些引數。
百度網盤下載

  • 解壓後,把sql資料夾裡的兩條SQl懟到你mysql裡面去(Docker快速搭建Mysql)
  • 修改demo.sh裡的jdbc配置。其他的都不要改,確保本機8080,8070埠可用,呼叫demo.sh。
  • 瀏覽器訪問 你的主機Ip:8070,賬戶密碼分別為apollo admin。即可搭建成功
  • 由於這個是快速上手的版本,Apollo裡的有些功能是砍掉的(不影響我們管理的我們的Springboot檔案)。體驗全部功能請參考github裡的分散式搭建指南。

SpringBoot對其整合

簡單整合

在你的Apollo介面中,新建一個專案,配置中只有AppId重要,其他隨意選。在你的Springboot新增Maven依賴,2019年11為止最新的Apollo client jar包版本。

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.5.0</version>
</dependency
>
複製程式碼

和Springboot和Spring整合有兩種方式(xml, 註解配置),這裡我只講註解配置。

按照上圖,在Apollo端配置你的配置檔案,修改啟動檔案和本地application.properties

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableApolloConfig
@RestController
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class,args);
    }


    @GetMapping("/hello")
    public String hello() {
        return "我是來自Apollo的8000";
    }
}
複製程式碼

本地檔案配置,Apollo需要指定伺服器地址,至此你不再需要把其他配置檔案儲存至本地。

#指定Appid,也就是你在Apollo建立專案指定的Appid,一定要指定對
app.id=test
#指定你的Apollo地址,Apollo 8070為WebUI地址,8080為Eureka註冊地址
apollo.meta=http://192.168.208.102:8080
複製程式碼

本地訪問 localhost:8000,注意這個8000是上圖中我指定的server.port=8000

到此第一個雲配置完成,簡單吧。

開發小技巧

本地開發我們可以有兩個application.yml和application.properties,yml儲存我們本地開發的配置,properties儲存apollo的配置,本地開發時,我們只需要註釋掉properties內的內容,註釋掉@EnableApolloConfig即可完成載入本地yml配置檔案,上線反之。通過註釋檔案和程式碼即可完成本地線上環境切換。

apollo儲存Yml(根據報錯一步步排查問題)

如何理解NameSpace和叢集(Cluster)

首先我們先有一個概念
AppId 對 省
叢集 對 市
NameSpace 對 區
nameSpace是最底層的配置檔案的描述,可以理解namesapce就是一個檔案
那麼我們如何通過Apollo客戶端描述一個NameSpace,就像我們如何精確描述一個區一樣的。

首先我們建立一個private型別yml格式的NameSpace,名稱隨意,只要本地配置檔案能對應上就可以了。

#指定Appid,也就是你在Apollo建立專案指定的Appid,一定要指定對
app.id=test
#指定你的Apollo地址,Apollo 8070為WebUI地址,8080為Eureka註冊地址
apollo.meta=http://192.168.208.102:8080

apollo.bootstrap.enabled=true
#如果你不手動指定叢集,預設叢集就是default
#如何指定叢集 apollo.cluster={你的叢集名}
#指定下你的yml配置的namespace
apollo.bootstrap.namespaces=testyml
複製程式碼

啟動報錯

2019-11-09 04:16:14.513  WARN 9116 --- [           main] c.c.f.a.i.AbstractConfigRepository       : Sync config failed,will retry. Repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository,reason: Load Apollo Config failed - appId: test,cluster: default,namespace: testyml,url: http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1 [Cause: [status code: 404] Could not find config for namespace - appId: test,please check whether the configs are released in Apollo!]
複製程式碼

有報錯,根本不慌
報錯為 http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1 404找不到,可以看到我們Apollo客戶端其實就是用Http請求拿去配置資料(上面的ip地址分別是我apollo部署的地址和我本機的地址),但是我們如果更改配置為http://192.168.208.102:8080/configs/test/default/application?ip=192.168.208.1也就是將testyml改為我們已有的application NameSpace,卻可以訪問成功。

怎麼搞?
我第一想到去持久層Mysql看下。在ApolloConfigDB.AppNamespace表中我們可以看到,最後我們配置的yml型別Namespace儲存攜帶了yml字尾,所以我們新增yml檔案字尾名.

#修改配置檔案application.properties
apollo.bootstrap.namespaces=testyml.yml
複製程式碼

成功,搞定,非常簡單是不是

複雜整合,監聽配置變化,動態依賴注入

相信看到這裡,Apollo也不難嘛,很容易用的,它主要優點來自於WebUI和細粒度的配置管理。
好的,我們寫一個複雜的

@SpringBootApplication
@EnableApolloConfig
@RestController
public class TestApplication {
    //在你yml裡面新增一個
    //test: 隨意
    @Value("${test}")
    private String content;

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class,args);
    }

    //監聽testyml.yml的變化,填你自己的Namespace啊
    @ApolloConfigChangeListener("testyml.yml")
    public void change(ConfigChangeEvent cg){
        System.out.println("發生改變了啦,我聽到了啊--------------------" + cg.getChange("test"));
    }

    @GetMapping("/hello")
    public String hello() {
        return "我是來自Apollo的" + content;
    }
}
複製程式碼

application.properties檔案

#指定Appid,也就是你在Apollo建立專案指定的Appid,一定要指定對
app.id=test
#指定你的Apollo地址,Apollo 8070為WebUI地址,8080為Eureka註冊地址
apollo.meta=http://192.168.208.102:8080

apollo.bootstrap.enabled=true
#指定下你的yml配置
apollo.bootstrap.namespaces=testyml.yml
複製程式碼

啟動後,可以嘗試去Apollo修改下你的NameSpace的test對應的value,看看程式會打印出來什麼。

快速接入公司業務

參考別人寫好的業務Demo

最後總結

Apollo易用性,叢集性,高可用非常適合企業開發,而且他用法遠不止作為SpringBoot的配置管理,既然我們可以通過Http拿到配置資料,是不是還有其他很多的應用方法。

  • 爬蟲配置,運維配置,前端配置。各種複雜,量大,易變的配置檔案管理。
  • 另外官網檔案提到了其他Python, .NET等等客戶端

最後一句話:Apollo不難,多看看github檔案你就會了(中文的啊,還有專門的原始碼解析)