1. 程式人生 > 程式設計 >SpringCloud實踐分享 Config配置中心

SpringCloud實踐分享 Config配置中心

簡介

在服務中經常會遇到一些易變的引數,例如資料庫地址、超時時間等等。這些引數與程式碼關係耦合度低,但是每改一次就去修改程式碼中的引數,再去編譯部署 顯得很蠢,於是就有了配置中心得個實現。目前用的比較多的配置中心有SpringCloudConfig和攜程的Apollo。 SpringCloudConfig的好處是和SpringCloud繫結,全家桶(有好處有壞處,你懂的),部署簡單;而Apollo部署比較麻煩,它首先要把部署地址寫死在apollo-client中編譯出來, 然後在配置專案中引用apollo-client……(既然是配置中心,為什麼配置中心本身不能做到程式碼和引數的解耦?!)當然,這都是我一些私貨, 事實上apollo功能十分強大,許可權功能完整,並且支援多語言,大家都知道攜程的技術棧主要是.net。兩種各有長短,有興趣的同學可以去github上看看, 檔案說明十分詳細。書歸正傳,接下來主要講Spring Cloud Config。

啟動Config

Config的配置同樣簡單:加入依賴spring-cloud-config-server,入口類加入註解@EnableConfigServer@EnableDiscoveryClient, 前一個註解是使能Config註冊中心,後一個則是註冊到Eureka上,讓其他服務找到該服務。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
複製程式碼
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class,args);
    }
}
複製程式碼

Config Server配置

首先說註冊中心Eureka相關內容,服務註冊地址eureka.client.serviceUrl.defaultZone以及自己是誰spring.application.name

即可。 我在這裡加上prefer-ip-address的配置,後面會相信說明。

spring:
  application:
    name: config-server
eureka:
  instance:
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
複製程式碼

然後是就是配置中心相關內容。配置中心一般採用git或svn才作為配置儲存端,官方檔案上還有以jdbc資料庫來儲存的,本文以git來說明。 其中spring.cloud.config.server.uri是配置檔案存放的git地址,為了更直觀演示,我在gitee上配置相應的內容。 而search-paths則是在該庫下的搜尋路徑,我們這裡配置成了'{application}'代表不同服務會去git專案下找與專案名(spring.application.name)對應的檔案。 其規則為{application}-{profile}.yml

例如,服務A中spring.application.name: fuwu1,則服務A在啟動的時,配置中心則會找git.uri下的fuwu1.yml檔案交給服務A作為配置。 服務A啟動時,帶有-Dspring.profiles.active=master引數時,則會配置中心則會找git.uri下的fuwu1-master.yml檔案交給服務A作為配置。

配置同樣需要有許可權管理,而配置中心的許可權邏輯和git相同(如果你使用git作為儲存後端)。 我們可以配置usernamepassword,如果需要有更高的要求,還可以和git一樣,配置公鑰私鑰。在git上放上公鑰, 在private-key這裡直接填寫私鑰內容,你甚至可以程式碼上去掉許可權資訊,而在部署的伺服器中配上私鑰。總之,git是怎麼配它就是怎麼配置。 (git相關內容點選這裡

還有一種配置路徑的邏輯大概是這樣:uri: git@your-git-address:your-config-repo/{application}.git,不同的專案配置放在不同的倉庫, 這樣可以配置不同倉庫的許可權。如果是這樣配置,倉庫裡的檔案命規則是application-{profile}.yml

spring:
  cloud:
    config:
      server:
        git:
          uri: [email protected]:yangzijing/config.git
          search-paths: '{application}'
          #uri: git@your-git-address:your-config-repo/{application}.git
          #private-key:
          #username: yourusername
          #password: yourpassword
複製程式碼

Config客戶端配置

客戶端配置同樣也是兩類,eureka的配置和config的配置,要注意這些配置要寫在bootstrap.yml中。簡單來講bootstrap和application的區別, bootstrap.yml中的配置先啟動,application.yml中的配置後啟動,而需要動態配置的配置項則寫在application.yml中。

Eureka相關的配置不再贅述,主要關心一下config的配置。配置可以有兩種,1)指定config的ip,直接在spring.cloud.config.uri配上地址即可。 2)通過Eureka找到Config的地址,配置spring.cloud.config.discovery.enabled=truediscovery.service-id(這裡的service-id和config專案的spring.application.name名字一致,其預設值是configserver)。

spring:
  application:
    name: api-admin
  cloud:
    config:
      #uri: http://ip:port
      discovery:
        enabled: true
        service-id: config-server
複製程式碼

在api-admin專案中,增加了一個from配置,在application.yml可寫可不寫,如果寫,還可以新增預設值from: ${from:hello};如果不寫,也可以, 同樣也可以在java檔案中直接引用,例如:

@Value("${from}")
private String from;
複製程式碼

但是要注意的是,使用了配置中心功能後,如果佔位符(${xxx})沒有被正確替換,整個程式是會報錯了,不管你用了沒用預設值,這個是不科學的。

利用WebHook自動重新整理

在引用了配置的類上新增@RefreshScope註解,即可實現自動重新整理,還有一點,需要在git中的webhook(例如GitHub,GitLab,Gitee)新增上http://config-ip:port/bus/refresh即可。

流程大致為: git倉庫更新 -> 觸發webhook-> 觸發config的重新整理端點-> config通知應用 -> 應用重新整理配置內容。

遇到的一個prefer-ip-address問題

在除錯過程中發現一個問題,如果在config服務端prefer-ip-address沒有開啟,客戶端則會找不到config服務端。在網上找了一下關於該配置的解釋, 希望對大家有用prefer-ip-address機制解釋

config的大致內容就說完了,可能還差配置內容加密,稍微有些繁雜,有機會再補充,急需可以查一下 官方檔案,或者別的中文部落格