Spring Cloud config
配置中心服務端
- 配置pom依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 配置yml
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 連接遠程倉庫
cloud:
config:
server:
git:
uri: https://gitee.com/himitzh0730/springcloud-config.git #遠程倉庫地址
label: master # 分支
# 服務註冊到eureka
eureka:
client:
service-url:
defaultZone: http://eureka7001.com
- 主啓動類,配置完就啓動,等待其它微服務通過本配置中心去遠程倉庫獲取配置。
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
- 微服務讀取配置方式
推薦:/{label}/{application}-{profile}.yml - 微服務需要添加pom依賴spring-cloud-starter-config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
- 微服務配置需要用到bootstrap.yml(系統級上下文管理),這樣才能在啓動前通過配置中心獲取遠程倉庫的配置。
server:
port: 3355
spring:
cloud:
config:
name: config-eureka # 配置文件的名字
label: master #分支
profile: dev # 生產環境
uri: http://localhost:3344 #配置中心服務的地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
#暴露監控端口
management:
endpoints:
web:
exposure:
include: "*"
- 在控制層controller加上註解@RefreshScope 動態刷新配置
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
- 每次修改都得發送一個POST請求 "http://localhost:3355/actuator/refresh"去提醒微服務配置已更新,可以避免每次配置更改,都要重啓服務。
# 使用curl發送post請求
curl -X POST "http://localhost:3355/actuator/refresh"
- 如果有多個微服務配置都要更新呢,總不能一個一個提醒微服務吧?能不能一鍵提醒所有微服務呢?有的,springcloud 的另一組件spring cloud bus消息總線配合MQ消息中間件可以做到一鍵刷新所有微服務配置。
原理大概: 觸發一個服務端ConfigServer的/bus/refresh端點,通過消息總線告知每個微服務,而刷新所有客戶端微服務的配置
- 給配置中心服務和各微服務都加上消息總線的pom依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 消息中間件用的是RabbitMQ,在這之前需要先安裝RabbitMQ和相關環境,之後配置中心和各微服務都要在yml加上相關配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
- 啓動配置中心,各微服務,然後在遠程倉庫修改配置文件,然後依舊發送post請求 "http://localhost:3344/actuator/bus-refresh,通過告知配置中心,配置中心通過消息總線去通知全部微服務。達到一鍵動態更新所有微服務的配置。
curl -X POST "http://localhost:3344/actuator/bus-refresh
nacos實現配置中心功能
- 啊,啓動nacos,這個就不說了,有需要的去看本系列的第一篇學習記錄,啓動相當於開啓了註冊與發現,配置中心的功能。(還不止,應該再加上bus,因爲nacos實現了一鍵動態更新所有微服務配置),然後在nacos控制檯可視化添加配置文件即可~
點擊添加,填寫配置,點擊發布即可,Data UD必須爲“微服務名-生產環境.文件後綴"格式===>${spring.application.name}-${spring.profile.active}.${spring.cloud.naces.config.file-extension}
- 微服務導入spring cloud alibaba的nacos的配置中心依賴
spring-cloud-starter-alibaba-nacos-config
。順便也導入了註冊與發現的依賴spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>
- 配置yml,依舊需要系統級別的上下文管理bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 129.204.177.72:8848 #Nacos 服務註冊中心地址
config:
server-addr: 129.204.177.72:8848 #Nacos 作爲配置中心地址
file-extension: yml #指定yml格式的配置
group: DEFAULT_GROUP # 指定分組
#namespace:命名空間ID 默認爲public
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.naces.config.file-extension}
# nacos-config-client-test.yml
application.yml來配置指定獲取的配置環境
spring:
profiles:
active: test
- 控制層加上@RefreshScope註解,讓微服務可以自動檢測刷新配置。
@RestController
@RefreshScope
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
- 主啓動類
//啓動類
@SpringBootApplication
@EnableDiscoveryClient //服務發現
public class CloudAlibabaConfigClient3377 {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabaConfigClient3377.class, args);
}
}
- 完事,使用確實很簡單,只要每次在nacos裏面修改一下對應的配置文件,獲取該配置文件的各微服務都會動態更新相應配置,當然如何讓配置持久化呢?那就應該寫入mysql等數據庫,讓nacos集羣都從mysql獲取相同的配置,讓每個微服務獲取的配置都能保持一致性。