【Spring Cloud H 版教程】第四篇:註冊中心組件Consul

1.概述

在前面的文章我們已經提到過,服務發現是微服務架構不可或缺的基礎設施組件,Eureka 作爲 Spring Cloud 標準服務發現的實現組件之一,由 Netflix 公司研發,是目前企業用得最多的註冊中心組件。Eureka 包含了 1.x 版本 和 2.x 版本,其中 1.x 版本在國內被廣泛使用,Netflix 本來想趁熱打鐵,推出 Eureka 2.x 版本,然而就在 2018 年 7 月,其官方突然宣佈 Eureka 2.0 的開源工作不再繼續,並警告用戶使用 2.x 版本來部署生產環境,需要自己承擔一切後果。

在當時這樣的背景之下,各大企業不得不需要重新考慮在註冊中心組件上的技術選型,由於當時 Nacos 還沒有被納入到 Spring 官方正式項目大家庭中,所以並沒有引起人們足夠的關注,倒是 Spring 官方之前一直不溫不火的 Consul 突然開始流行起來,成爲中小企業首選的註冊中心組件。Consul 全稱 Spring Cloud Consul ,採用 Go 語言開發,是 Spring 官方的正式項目之一,是 Spring Cloud 大項目的組成部分。如同 Eureka 一樣,Consul 也提供了非常方便整合 Spring Boot 項目的能力,同樣只需要少量的註解和配置用戶就可以快速地啓用 Consul ,構建出大型分佈式系統。Consul 不僅擁有服務發現的功能,還擁有 Eureka 沒有的分佈式配置中心功能,並且 Consul 可以很好地支持 Spring Cloud Netflix 相關的開源組件,例如 Ribbon、Zuul 等。

2.安裝服務端

Consul 同樣包含的服務端和客戶端,其中服務端程序不需要我們像 Eureka 那樣需要手動創建,已經提前發佈在其官網上,截止到作者寫該篇文章時 Consul 最新版爲 1.7.2 。

2.1下載Consul管理臺

Consul 下載地址:

官方網站:https://www.consul.io
下載地址:https://www.consul.io/downloads.html

圖片: https://uploader.shimo.im/f/rzsrYjGwYX4KtTYQ.png

2.2安裝Consul管理臺

實際開發中一般使用 Linux 環境部署 Consul,所以作者只演示在 Linux 環境的安裝和啓動,其他環境讀者朋友可以查閱相關資料自己去安裝和啓動,作者演示的 Linux 註解 IP 地址爲:192.168.0.149 。

第一步:安裝 Consul。安裝非常簡單只需要解壓 zip 文件即可:

[root@test home]# unzip consul_1.7.2_linux_amd64.zip

解壓完成之後可以將 consul 命令 拷貝到 /usr/local/bin 目錄中,這樣就可以全局使用該命令。

[root@test software]# mv ./consul /usr/local/bin/

第二步:啓動 Consul。執行以下命令啓動:

consul agent -server -bind=192.168.0.149 -client=0.0.0.0 -bootstrap-expect=1 -data-dir=./data -node=server1 -ui

-server 表示以服務端身份啓動
-bind 綁定主機地址,默認是 127.0.0.1
-client 指定客戶端訪問的 IP (consul 有豐富的 api 接口,這裏的客戶端指瀏覽器或調用方),0.0.0.0 表示不限制客戶端 IP
-bootstrap-expect=1 表示 server 集羣最低節點爲 1,低於這個值將工作不正常(注:類似zookeeper一樣,通常集羣數爲奇數,方便選舉,consul採用的是raft算法)
-data-dir 表示指定數據的存放目錄
-node 表示節點在 web ui 中顯示的名稱
-ui 表示啓用web管理臺

第三步:訪問 Consul 管理臺,管理臺默認端口是 8500 。在瀏覽器輸入地址 http://192.168.0.149:8500 即可訪問。
圖片: https://uploader.shimo.im/f/d3LS1QSVTDkbvtQF.png
注意:Consul 管理臺目前存在一些 bug,在谷歌瀏覽器下會經常出現 Error 錯誤,建議使用其他瀏覽器打開,例如火狐瀏覽器。

Consul returned an error. You may have visited a URL that is loading an unknown resource, 
so you can try going back to the root or try re-submitting your ACL 
Token/SecretID by going back to ACLs.Try looking in our documentation

在這裏插入圖片描述

3.註冊中心

3.1加入consul-discovery依賴

客戶端程序整合 Consul 需要在 POM 中加入 spring-cloud-starter-consul-discovery 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--consul註冊中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

當客戶端註冊 Consul 時,它提供有關自身的元數據,如主機和端口,ID,名稱和標籤。默認情況下會創建一個 HTTP 檢測,每隔 10 秒,Consul 命中 /health 端點。如果健康檢查失敗,則服務實例被標記爲關鍵。

3.2application.yml配置連接Consul

在 application.yml 配置連接 Consul 服務端:

server:
  port: 8755

spring:
  application:
    name: cloud-consul-client

3.3通過DiscoveryClient獲取註冊中心信息

對於主啓動類來說,由於 Consul 遵循了 Spring Cloud 的服務發現標準,所以同樣通過註解 @EnableDiscoveryClient 聲明作爲註冊中心客戶端程序。

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClientMain8755 {

    public static void main(String[] args) {
        SpringApplication.run(ConsulClientMain8755.class,args);
    }

}

啓動客戶端程序,可以在控制檯看到輸出 Registering service with consul 的相關日誌,就表明已經成功註冊到了 Consul 服務端。

2020-04-24 11:30:54.779  INFO 714636 --- [           main] o.s.c.c.s.ConsulServiceRegistry          : 
Registering service with consul: 
NewService{id='cloud-consul-client-8755', name='cloud-consul-client', tags=
[secure=false], address='192.168.0.205', meta=null, port=8755, enableTagOverride=null,
check=Check{script='null', interval='10s', ttl='null', 
http='http://192.168.0.205:8755/actuator/health', method='null', header={},
tcp='null', timeout='null', deregisterCriticalServiceAfter='null', 
tlsSkipVerify=null, status='null'}, checks=null}

在這裏插入圖片描述

我們可以在程序中通過 DiscoveryClient 獲取 Consul 管理臺上所有的註冊實例相關的信息。

@RestController
@RequestMapping("/consul")
@Slf4j
public class ConsulController {

    @Resource
    private DiscoveryClient discoveryClient;

    /**
     * 獲取註冊中心上所有的註冊實例
     * @return
     */
    @GetMapping("/getInstanceList")
    public List<ServiceInstance> getInstanceList (){
        List<ServiceInstance> instanceList = new ArrayList<>();
        discoveryClient.getServices().forEach( serviceId -> {
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
            instanceList.addAll(instances);
        });
        return instanceList;
    }

瀏覽器輸入地址:http://192.168.0.205:8755/consul/getInstanceList
在這裏插入圖片描述

4.配置中心

Consul 提供了一個用於存儲配置和其他元數據的鍵/值存儲功能。所以 Consul 除了可以作爲微服務架構的註冊中心之外,還可以作爲配置中心,在這點上和後面會講到的 Nacos 很相似。

4.1創建配置文件

我們現在 Consul 管理臺創建一個配置文件, 其中 data-key 爲 user :

config:
 name: luke123
person:
 name: Jordon
 number: 24
 sex:

圖片: https://uploader.shimo.im/f/Ub3BuTyq7D3VTvLO.png
其中配置文件結構可以如下:

config/testApp,dev/ 表示客戶端服務testApp的dev環境的配置文件
config/testApp/ 表示客戶端服務testApp的配置文件
config/application,dev/ 表示所有客戶端服務dev環境的配置文件
config/application/ 表示所有客戶端服務的配置文件

比如我的例子是目錄結構爲:config/cloud-consul-client,表示該配置文件只給 cloud-consul-client 服務使用,user 是一個 data-key ,表示配置文件的名稱,默認值爲 data 。config 值也可以通過 prefix 配置項指定。

4.2加入consul-all依賴

爲了使用 Consul 的配置中心功能,我們需要在 POM 中屏蔽之前的 spring-cloud-starter-consul-discovery 依賴,加入 spring-cloud-starter-consul-all :

<!--consul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <!--<artifactId>spring-cloud-starter-consul-discovery</artifactId>-->
    <artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>

使用了 Consul 的配置中心功能之後,我們需要將 consul 相關的配置項都配置在 bootstrap.xml 文件:

#連接consul配置中心
---
spring:
  cloud:
    consul:
      host: 192.168.0.149
      port: 8500
      discovery:
        prefer-ip-address: true #使用ip地址註冊,而不是主機名
      config:
        format: yaml #配置格式
        prefix: config #前綴
        data-key: user #配置文件key

4.3輸出配置項

創建類 PersonConfig 用於接收配置文件內容,同時修改 ConsulController 代碼將結果輸出。

@Component
@ConfigurationProperties(prefix = "person")
@Data
public class PersonConfig {

    private String name;

    private Integer number;

    private String sex;

}
@RestController
@RequestMapping("/consul")
@Slf4j
@RefreshScope //動態刷新
public class ConsulController {

    @Value("${config.name}")
    private String configName;

    @GetMapping("/getConfigName")
    public String getConfigName(){
        return configName;
    }

    @Autowired
    private PersonConfig personConfig;

    @GetMapping("/getPersonConfig")
    public PersonConfig getPersonConfig(){
        return personConfig;
    }

}

啓動客戶端程序,在瀏覽器依次訪問 http://192.168.0.205:8755/consul/getConfigName
http://192.168.0.205:8755/consul/getPersonConfig
圖片: https://uploader.shimo.im/f/1gSjHGd1KUheCEyY.png

4.4動態屬性配置

註冊中心最重要的作用就是,除了集中管理各個程序的配置之外,還可以在客戶端程序不重啓的情況就可以動態刷新配置的值,下面我們來修改配置文件的內容,再次訪問試試:
在這裏插入圖片描述
在這裏插入圖片描述

5.附錄

Consul 所有相關的配置項:

https://cloud.spring.io/spring-cloud-static/spring-cloud-consul/2.2.2.RELEASE/reference/html/appendix.html

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章