WinForm 開啟指定網頁,類似瀏覽器
寫在前面
在我們的實際開發過程中,或多或少的應用到配置項,在分散式系統中,配置項更是重要的組成部分,在編輯配置過程中,出現了不方便維護、配置內容的安全與許可權,更新配置項需要重啟應用等諸多問題,這時候統一配置中心就出現了。
在Spring Cloud中,分散式配置中心元件Spring Cloud Config就是用做統一配置中心的。它支援配置檔案放在在配置服務的記憶體中,也支援放在遠端Git倉庫裡。引入Spring Cloud Config後,我們的外部配置檔案就可以集中放置在一個git倉庫裡,再新建一個config server,用來管理所有的配置檔案,維護的時候需要更改配置時,只需要在本地更改後,推送到遠端倉庫,所有的服務例項都可以通過config server來獲取配置檔案,這時每個服務例項就相當於配置服務的客戶端config client,為了保證系統的穩定,配置服務端config server可以進行叢集部署,即使某一個例項,因為某種原因不能提供服務,也還有其他的例項保證服務的繼續進行。
Config Server
使用方式
pom.xml檔案中引入config-server依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
啟動類加入@EnableConfigServer註解
@SpringBootApplication @EnableDiscoveryClient @EnableConfigServer public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }
application.yml配置檔案中配置遠端git地址
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitlab-demo.com/SpringCloud_Sell/config-repo.git
username: ********
password: ********
資原始檔與URL地址對映
Spring Cloud會將配置對映為"/{application}/{profile}"
URL地址和資原始檔對映如下:
-
/{application}/{profile}[/{label}]
-
/{application}-{profile}.yml
-
/{label}/{application}-{profile}.yml
-
/{application}-{profile}.properties
-
/{label}/{application}-{profile}.properties
-
第一個規則的分支名是可以省略的,預設是master分支
-
無論你的配置檔案是properties,還是yml,只要是應用名+環境名能匹配到這個配置檔案,那麼就能取到
-
如果是想直接定位到沒有寫環境名的預設配置,那麼就可以使用default去匹配沒有環境名的配置檔案
-
使用第一個規則會匹配到預設配置
-
如果直接使用應用名來匹配,會出現404錯誤,此時可以加上分支名匹配到預設配置檔案
-
如果配置檔案的命名很由多個-分隔,此時直接使用這個檔名去匹配的話,會出現直接將內容以源配置檔案內容直接返回,內容前可能會有預設配置檔案的內容
-
如果檔名含有多個“-”,則以最後一個“-”分割{application}和{profile},若檔名為:my-app-demo-dev.properties,則對映的url為"/my-app-demo/dev"
-
示例:資原始檔為myapp-dev.properties,對應url為:http://xxx/myapp/dev
客戶端配置:
spring.application.name=xxxx
spring.cloud.config.profile=dev
spring.cloud.config.label=test
上述配置與資原始檔對應關係為:
spring.application.name 對應 {application}
spring.cloud.config.profile 對應 {profile}
spring.cloud.config.label 對應 {label}
Config Client
使用方式
pom.xml檔案中引入config-server依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
新增 bootstrap.yml 應用配置檔案,讓spring boot啟動時先載入bootstrap.yml去獲取配置資訊
spring:
application:
name: order
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: test
label: master #當 ConfigServer 的後端儲存的是 Git 的時候,預設就是 master
注意:git上的配置檔案中,order為公用的配置,每次都會載入,其他為區分不同環境的配置資訊。
自動更新配置
以上只能支援配置的基本使用,修改了git上的配置檔案,還是必須要重啟應用才能生效,沒有達到統一配置中心的要求,那麼如何才能自動更新配置呢?
Spring Cloud Bus
看到上圖是config的架構圖,config-server會去遠端的git拉取配置,拉取到配置後,會在本地儲存一份,同時提供對外的配置服務,order,product等服務在啟動的時候訪問config-server讀取配置,如果啟動後再次修改git中的配置,order,product等服務的配置是不變的,原因是根本沒有通知order,product等服務配置修改的訊息。這時候就應用到了訊息佇列(rabbitMQ、kafka等),操作資料庫就會應用到Spring Cloud Bus這個元件。config-server與config-client間就是通過訊息佇列進行通訊,config-server使用了Spring Cloud Bus以後,會對外提供一個介面/bus-refresh,訪問這個介面,就會把更新配置的資訊傳送到MQ中去。所以,只要在遠端的git上配置好這樣的地址就可以達到自動訪問,自動重新整理配置了。
注:git自動訪問連結用到web-hooks功能
使用方式
config-server與config-client的pom.xml檔案中加入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改config-server配置檔案,將/bus-refresh介面暴露出去
management:
endpoints:
web:
exposure:
include: "*"
在web-hooks上配置自動訪問連結,這裡不用配置成bus-refresh,config針對webhooks提供了一個路由monitor
啟動應用config-server與config-client後,會分別自動建立一個訊息佇列,當修改git上的配置後,webhooks自動訪問了重新整理配置的連結,這時候,佇列中就會存在一個訊息。