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作為儲存後端)。
我們可以配置username
和password
,如果需要有更高的要求,還可以和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=true
和discovery.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的大致內容就說完了,可能還差配置內容加密,稍微有些繁雜,有機會再補充,急需可以查一下 官方檔案,或者別的中文部落格