亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用Spring Cloud Config結合Bus實現分布式配置中心的步驟

發布時間:2020-09-08 14:36:27 來源:腳本之家 閱讀:211 作者:Sam哥哥 欄目:編程語言

概述

假設現在有個需求:

我們的應用部署在10臺機器上,當我們調整完某個配置參數時,無需重啟機器,10臺機器自動能獲取到最新的配置。
如何來實現呢?有很多種,比如:

1、將配置放置到一個數據庫里面,應用每次讀取配置都是直接從DB讀取。這樣的話,我們只需要做一個DB變更,把最新的配置信息更新到數據庫即可。這樣無論多少臺應用,由于都從同一個DB獲取配置信息,自然都能拿到最新的配置。

2、每臺機器提供一個更新配置信息的updateConfig接口,當需要修改配置時,挨個調用服務器的updateConfig接口。

3、借助redis來實現,把配置信息放置到redis上,但是這樣子,就每次都得去redis讀取,多了一些網絡請求。

上面這三種方法是最容易想到的,也很容易做,但是缺點當然也非常的多。雖說缺點很多,但是某些傳統企業還真是這么干的。

在互聯網企業里,基本沒見過這么玩的,都是會使用分布式配置中心。用開源的或者自己實現,目前開源的分布式配置中心有很多,而spring cloud config就是其中的佼佼者。下面我們就用spring cloud config來實現一個分布式配置中心。

是否使用最新的Spring Boot 2.0 版本

我曾經使用最新的spring cloud 2.0做了一個分布式是配置中心的demo。原本以為很簡單,但是居然足足花了一天才搞定。有以下幾個原因:

1、spring cloud對應的文檔沒有完全更新,出了問題,在文檔里找不著;

2、目前使用2.0版本的公司很少,網上也沒什么具體實戰文章介紹。出了問題后,百度是找不到解決方案的。而google也基本很難找到方案,都是一些零星的知識碎片;

3、2.0這個版本,config和bus這塊有些小變動,如果還按照1.5.x的版本來弄的話,是行不通的。

基于上面幾個原因,建議使用1.5.x的版本靠譜些。下面這篇文章會以下面的版本來介紹的:

spring boot:

1.5.2.RELEASE

對應的spring cloud使用:

Dalston.RELEASE

搭建spring cloud config server

如果你只是想把配置統一由spring cloud config來管理,而暫時不想做配置中心的高可用的話,則只需要config和bus兩個組件就夠了。但是如果要保證高可用,還得使用spring cloud的注冊發現組件。

除了config和bus之外,我們還需要使用git。因為spring cloud config是使用git來做版本管理的。

基于spring cloud config做一個配置中心,很簡單,只要幾個小步驟就搞定了。

【1】引入config和bus組件

<dependency>
<groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
 </dependency>
 <dependency>
<groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

【2】啟動類使用@EnableConfigServer注解

package spring.cloud.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
 public static void main(String[] args) {
 SpringApplication.run(ConfigApplication.class, args);
 }
}

【3】application.yml文件配置rabbitmq和git倉庫

server:
 port: 8040
spring:
 application:
 name: spring-cloud-config-server
 cloud:
 config:
 server:
 git:
  uri: https://gitlab.xxxxxx.com/config/xxxxxxx.git
  search-paths:
  username: xxxxx
  password: xxxxxx
 activemq:
 host: 127.0.0.1
 port: 5672
 username: guest
 password: guest
management:
 security:
 enabled: false

配置RabbitMQ是因為bus組件需要使用它來通知客戶端,配置有變動。另外,記得使用

management:
 security:
 enabled: false

將驗證關閉掉,不然后面的操作,老是報授權錯誤。

到此服務端配置中心已經搞定了。現在你就可以在服務端先做個小實驗,提交一個demo-dev.properties文件,文件的內容如下:

address=hello

然后使用

http://localhost:8040/demo/dev

如果能輸出

{“address”:”hello”}

就說明spring cloud config跟git的交互是ok的。

客戶端接入配置中心

我們的目標:

當把配置信息修改完提交到git上后,所有接入到spring cloud config的客戶端馬上能收到通知,并且拿到最新的配置信息。
下面介紹如何實現這個目標。

客戶端只需要做幾個小步驟即可完成接入動作。

【1】引入依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-config</artifactId>
 </dependency>

 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
 </dependency>

引入spring-boot-starter-web只是為了做實驗而已。

【2】配置RabbitMQ和引入配置中心的url

application.properties

spring.application.name=spring-cloud-config-client1
server.port=8042
management.security.enabled=false
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

bootstrap.properties

spring.cloud.config.name=demo
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8040/

有三個注意點:

1、關閉驗證:management.security.enabled=false

2、spring cloud config相關的配置一定一定要放到bootstrap.properties里

3、使用spring.cloud.config.uri指定配置中心的地址

另外,對于客戶端來說,啟動類是不用加上任何跟config和bus有關的注解的

到此客戶端搞定了,我們可以使用一個controller來開始做實驗了。

package springcloudconfig.client;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class HelloController {
 @Value("${address}")
 private String address;
 @RequestMapping("/address")
 public String getAddress() {
 return this.address;
 }
}

假設上面的HelloController需要用到address這個配置,只需要使用@RefreshScope和@value注解就可以了

@RefreshScope
public class HelloController {}
 @Value("${address}")
 private String address;

為了驗證客戶端是否能拿到最新的配置信息,提供一個

@RequestMapping("/address")
 public String getAddress() {
 return this.address;
 }

方法。

我們修改一下demo-dev.properties文件,將值改成

address=hello update

并提交到git上。這個時候我們調用getAddress接口

http://localhost:8041/address

發現并沒有拿到最新的值。那是因為push到git的這個動作做完后,我們沒有通知到spring cloud bus。可以使用postman來做一個post請求,調用如下接口,來通知bus。

http://localhost:8040/bus/refresh

這個接口一旦調用成功,bus會利用RabbitMQ通知所有的客戶端,配置已經更新。

特別注意:

我們是調用服務端的/bus/refresh接口,不是去調用客戶端的/bus/refresh接口。

如果每次提交,都要去調用服務端的/bus/refresh接口,那這個也太麻煩了。可以使用webhook來幫一下忙。

如果你們用的是新的gitlab,那么只需要在工程里面,點擊【Settings】,再點擊【Integrations】,就可以設置webhook了,如下圖:

利用Spring Cloud Config結合Bus實現分布式配置中心的步驟

url里面填入配置中心服務端的/bus/refresh接口地址,然后點擊【添加Webhook】就可以了。

與攜程的阿波羅對比

Spring Cloud Config的精妙之處在于它的配置存儲于Git,這就天然的把配置的修改、權限、版本等問題隔離在外。通過這個設計使得Spring Cloud Config整體很簡單,不過也帶來了一些不便之處。

下面嘗試做一個簡單的小結:

功能點 Apollo Spring Cloud Config 備注
配置界面 一個界面管理不同環境、不同集群配置 無,需要通過git操作
配置生效時間 實時 重啟生效,或手動refresh生效 Spring Cloud Config需要通過Git webhook,加上額外的消息隊列才能支持實時生效
版本管理 界面上直接提供發布歷史和回滾按鈕 無,需要通過git操作
灰度發布 支持 不支持
授權、審核、審計 界面上直接支持,而且支持修改、發布權限分離 需要通過git倉庫設置,且不支持修改、發布權限分離
實例配置監控 可以方便的看到當前哪些客戶端在使用哪些配置 不支持
配置獲取性能 快,通過數據庫訪問,還有緩存支持 較慢,需要從git clone repository,然后從文件系統讀取
客戶端支持 原生支持所有Java和.Net應用,提供API支持其它語言應用,同時也支持Spring annotation獲取配置 支持Spring應用,提供annotation獲取配置 Apollo的適用范圍更廣一些

我個人還是推薦使用Spring Cloud Config,很輕量級、且社區活躍,遇到問題很好找到解決方案。另外呢,我個人認為阿波羅和Spring Cloud Config的區別就只是有木有界面而已。界面做得到的,我們通過git也可以的,只是用戶體驗沒那么好而已。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同仁县| 柳州市| 临洮县| 固安县| 铜陵市| 泸溪县| 横峰县| 邯郸县| 改则县| 崇仁县| 布拖县| 综艺| 通州市| 屏东市| 泰宁县| 瑞丽市| 萝北县| 安陆市| 察雅县| 浪卡子县| 漯河市| 溆浦县| 定边县| 临泽县| 肃北| 涡阳县| 德安县| 宁阳县| 尤溪县| 西乌珠穆沁旗| 镇平县| 佛学| 西乡县| 剑阁县| 浠水县| 临城县| 长武县| 三河市| 日照市| 永州市| 景泰县|