## Consul 概述 Consul 是一個可以提供服務發現,健康檢查,多數據中心,key/Value 存儲的分散式服務框架,用於實現分散式系統的發現與配置。Cousul 使用 Go 語言實現,因此天然具有可移植性,安裝包僅包含一個可執行文件,直接啟動即可運行,方便部署 ## 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 中獲取配置,並返回