Spring Boot實戰系列(7)整合Consul配置中心

五月君發表於2019-05-20

本篇主要介紹了 Spring Boot 如何與 Consul 進行整合,Consul 只是服務註冊的一種實現,還有其它的例如 Zookeeper、Etcd 等,服務註冊發現在微服務架構中扮演這一個重要的角色,伴隨著服務的大量出現,服務與服務之間的配置管理、運維管理也變的難以維護,通過 Consul 可以解決這些問題,實現服務治理、服務監控。

關於 Consul 的更多知識點不在這裡贅述,但是在學習本節之前還是希望您能先了解下,請移步我之前寫的 微服務服務註冊發現之 Consul 系列

快速導航

注意以下程式碼示例可在Github檢視專案完整示例 chapter7-1

新增maven依賴

Spring Boot 專案的 pom.xml 檔案中引入 spring-cloud-starter-consul-discovery 啟動器

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
複製程式碼

使用 Consul 配置資訊時需要引入 spring-cloud-starter-consul-config 依賴

 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
複製程式碼

配置檔案

系統級配置檔案 bootstrap.yml

使用 Spring Cloud Consul Config,需要配置以下資訊在 bootstrap.yml 檔案

  • spring.cloud.consul.host:配置consul地址
  • spring.cloud.consul.port:配置consul埠
  • spring.cloud.consul.config.prefix:配置基本檔案,預設值config
  • spring.cloud.consul.config.enabled:啟動consul配置中心
  • spring.cloud.consul.config.format:consul上面檔案的格式 YAML、FILES、PROPERTIES、預設 KEY-VALUE
  • spring.cloud.consul.config.data-key:表示 consul 上面的 KEY 值(或者說檔案的名字),預設是 data

bootstrap.yml

spring:
  cloud:
    consul:
      host: 192.168.6.128
      port: 8500
      config:
        prefix: config
        enabled: true
        format: YAML
        data-key: user
複製程式碼

應用級配置檔案 application.yml

定義應用級別的配置在 bootstrap.yml 之後載入,例如搭配 spring-cloud-config 使用。

  • spring.cloud.consul.host:配置consul地址
  • spring.cloud.consul.port:配置consul埠
  • spring.cloud.consul.discovery.enabled:啟用服務發現
  • spring.cloud.consul.discovery.register:啟用服務註冊
  • spring.cloud.consul.discovery.deregister:服務停止時取消註冊
  • spring.cloud.consul.discovery.prefer-ip-address:表示註冊時使用IP而不是hostname
  • spring.cloud.consul.discovery.health-check-interval:健康檢查頻率
  • spring.cloud.consul.discovery.health-check-path:健康檢查路徑
  • spring.cloud.consul.discovery.health-check-critical-timeout:健康檢查失敗多長時間後,取消註冊
  • spring.cloud.consul.discovery.instance-id:服務註冊標識
server:
  port: 8082
spring:
  application:
    name: consul-service
  profiles:
    active: dev
  cloud:
    consul:
      host: 192.168.6.128
      port: 8500
      discovery: # 服務發現配置
        enabled: true
        register: true
        deregister: true
        prefer-ip-address: true
        health-check-interval: 10s
        health-check-critical-timeout: 30s
        health-check-path: /health
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} # 應用名稱+伺服器IP+埠
複製程式碼

配置Consul管理控制檯

Consul 提供了 Key/Value 儲存用於儲存配置資料,在 Spring Cloud Consul 中配置預設儲存於 /config 資料夾下,根據應用程式名和模擬 Spring Cloud Config 順序解析屬性的規則來配置檔案。

在本例中操作 Consul 管控臺建立以下路徑配置:

  • config:為配置基本檔案,這裡預設為 config
  • consul-service:為 application.yml 中配置的 spring.application.name 值。
  • dev:為 application.yml 中配置的 spring.profiles.active 值,也是本程式設定環境變數意為開發環境。
  • user.yml:為配置的檔名,格式為 yml 格式。
config/consul-service.dev/user.yml
複製程式碼

最終為 Consul 管控臺建立的配置資料如下圖所示:

圖片描述

專案構建

注意:以下只貼核心程式碼,原始碼參見:Github chapter7-1

建立Config獲取Consul配置資料

  • 獲取student配置資料

注意以下屬性名要與在 Consul 管控臺中配置的一一對應。

@ConfigurationProperties 進行屬性注入

config/StudentConfig.java

@ConfigurationProperties(prefix = "student")
public class StudentConfig {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "大家好我是" + name + ",今年" + age + "歲,我是一名在校大學生!";
    }
}
複製程式碼
  • 獲取teach配置資料

同以上 student 配置,我們可以將不同型別的配置分檔案進行配置定義

@ConfigurationProperties(prefix = "teach")
public class TeachConfig {
    private String name;
    private String course;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    @Override
    public String toString() {
        return "大家好我是" + name + ",是一名大學老師!教同學們學習" + course;
    }
}
複製程式碼

編寫啟動類呼叫配置

註解說明:

  • EnableDiscoveryClient:讓註冊中心進行服務發現,將服務註冊到服務元件上。
  • RestController:是 @ResponseBody@Controller 註解的組合,註明該註解後整個類所有的方法返回值為json格式。
  • SpringBootApplication:SpringBoot 的啟動註解。
  • EnableConfigurationProperties:屬性配置的 class 新增到 SpringBoot 的屬性配置註解裡,否則不能通過 @Autowired 註解注入我們定義的屬性配置類。

介面說明:

  • /health:健康檢查介面
  • /user/description:@Value 註解獲取使用者資訊描述介面
  • /user/student/intro:@ConfigurationProperties 獲取學生簡介資訊介面
  • /user/teach/intro:@ConfigurationProperties 獲取教師簡介資訊介面
@EnableDiscoveryClient
@RestController
@SpringBootApplication
@EnableConfigurationProperties({ StudentConfig.class, TeachConfig.class })
public class ConsulApplication {

    @Value("${description}")
    private String description;

    @Autowired
    private StudentConfig studentConfig;

    @Autowired
    private TeachConfig teachConfig;

    @GetMapping("/health")
    public String Health() {
        System.out.println("health");
        return "OK";
    }

    @GetMapping("/user/description")
    public String Description() {
        return description;
    }

    @GetMapping("/user/student/intro")
    public String StudentIntro() {
        return studentConfig.toString();
    }

    @GetMapping("/user/teach/intro")
    public String TeachIntro() {
        return teachConfig.toString();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsulApplication.class, args);
    }
}
複製程式碼

介面測試

  • 健康檢查介面

該介面在服務啟動後且向 Consul 配置中心註冊後,根據 application.yml 檔案配置的 health-check-interval 和 health-check-path屬性進行自動呼叫。

$ curl http://127.0.0.1:8082/health
OK!
複製程式碼

註冊成功後展示我們服務的名稱及健康檢查結果如下:

圖片描述
圖片描述

  • 獲取教師簡介配置介面
$ curl http://127.0.0.1:8082/user/teach/intro
大家好我是Teach Li,是一名大學老師!教同學們學習Java軟體開發!
複製程式碼
  • 獲取學生簡介配置介面
$ curl http://127.0.0.1:8082/user/student/intro
大家好我是Jack,今年18歲,我是一名在校大學生!
複製程式碼
  • 採用 @Value 註解獲取專案描述介面
$ curl http://127.0.0.1:8082/user/description
使用者資訊描述
複製程式碼

總結

這裡我們只介紹了 Consul 在 Spring Boot 的配置功能,關於 Consul 做為註冊中心在下一章節中介紹,本篇中需要注意通過 @Value 注入的屬性,修改 Consul 後需要重啟服務才能生效,通過 @ConfigurationProperties 注入的屬性,在 Consul 管控臺修改屬性之後可立即生效。

如遇到其他什麼可在SpringBoot-Course issues中提問

資料

作者:五月君
連結:www.imooc.com/article/286…
來源:慕課網

相關文章