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

技術選型

微服務架構中Springboot配置文件繁多,Apollo統一高效的管理Springboot配置文件。前端

簡單說就是說全部Springboot項目本地再也不須要配置文件,全部配置文件由Apollo統一管理,講的高大上點叫作雲配置。java

Apollo優勢:mysql

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

其餘的技術git

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

1分鐘搭建一個單機的

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

  • 解壓後,把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包版本。web

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

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

按照上圖,在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須要指定服務器地址,至此你再也不須要把其餘配置文件保存至本地。sql

#指定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=8000docker

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

開發小技巧

本地開發咱們能夠有兩個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, cluster: default, namespace: testyml, 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文檔你就會了(中文的啊,還有專門的源碼解析)

相關文章
相關標籤/搜索