註冊中心/配置管理 —— SpringCloud Consul

Consul 概述

Consul 是一個可以提供服務發現,健康檢查,多數據中心,key/Value 存儲的分佈式服務框架,用於實現分佈式系統的發現與配置。Cousul 使用 Go 語言實現,因此天然具有可移植性,安裝包僅包含一個可執行文件,直接啓動即可運行,方便部署


Consul 安裝與啓動

以 windows 爲例,在官網下載 Consul:https://www.consul.io/

下載之後解壓縮,進入目錄運行 consul.exe 即可:.\consul.exe agent -dev

Consul 啓動完成後,在瀏覽器中訪問 http://ocalhost:8500/ 便可以看到 Consul 首頁


Consul 服務註冊與發現

創建 cousul-service 項目,引入依賴,其中 Spring Boot Actuator 是健康檢查需要依賴的包,本項目基於 SpringBoot 2.3.1,SpringCloud Hoxton.SR12

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
</dependencies>

在 application.yml 配置文件中添加如下配置:

server:
  port: 8080

spring:
  application:
    name: consul-service
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        instance-id: ${spring.application.name}:${server.port}

在啓動類上添加註解 @EnableDiscoveryClient

@EnableDiscoveryClient
@SpringBootApplication
public class ConsulProducerApplication {

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

啓動項目,查看 Consul Web 頁面,即可看到服務註冊成功


Consul 配置中心

參考上一節內容創建 cousul-config 項目,引入依賴

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

在 bootstrap.yml 配置文件(注意必須使用 bootstrap)中添加如下配置:

server:
  port: 8080

spring:
  application:
    name: consul-service
  # profiles:
    # active: dev # 指定環境,默認加載 default 環境
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        instance-id: ${spring.application.name}:${server.port}
      config:
        enabled: true # false禁用Consul配置,默認爲true
        format: yaml  # 表示consul上面文件的格式,有四種:YAML、PROPERTIES、KEY-VALUE、FILES
        prefix: config  # 可以理解爲配置文件所在的最外層目錄
        default-context: consul-service # 設置應用的文件夾名稱
        data-key: consul-service-config # Consul的Key/Values中的Key,Value對應整個配置文件
        # 以上配置可以理解爲:加載config/consul-service/文件夾下Key爲consul-service-config的Value對應的配置信息
        # 配置環境分隔符,默認值 "," 和 default-context 配置項搭配
        # 例如應用 consul-service 分別有環境 default、dev、test、prod
        # 只需在 config 文件夾下創建 consul-service、consul-service-dev、consul-service-test、consul-service-prod 文件夾即可
        # profile-separator: '-'
        watch:
          enabled: true # 是否開啓自動刷新,默認值true開啓
          delay: 1000 # 刷新頻率,單位毫秒,默認值1000

在啓動類上添加註解 @EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
// 啓用配置屬性類,當SpringBoot程序啓動時會立即加載@EnableConfigurationProperties註解中指定的類對象
@EnableConfigurationProperties({MySqlComplexConfig.class})
public class ConsulConfigApplication {

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

定義 MysqlConfig 配置類

@Component
@ConfigurationProperties(prefix = "mysql")
public class MysqlConfig {

    private String host;
    private String username;
    private String password;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

開發 ConfigController

@RefreshScope // 用於重新刷新作用域實現屬性值自動刷新
@RestController
public class ConfigController {

    @Autowired
    private MysqlConfig mysqlConfig;

    @GetMapping("getConfig")
    public Map<String, String> getMysqlConfig() {
        HashMap<String, String> map = new HashMap<>();
        map.put("host", mysqlConfig.getHost());
        map.put("username", mysqlConfig.getUsername());
        map.put("password", mysqlConfig.getPassword());
        return map;
    }
}

在 Consul 管理界面添加配置信息,點擊左側菜單的 Key/Value,按照 bootstrap.yml 中的配置創建 config/consul-service 目錄,在 consul-service 目錄下創建 key:consul-service-config,在 value 添加配置信息

請求 http://localhost:8080/getConfig,可以看到服務會從 Consul 中獲取配置,並返回

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