SpringCloud學習記錄(三)分佈式配置中心

Spring Cloud config

在這裏插入圖片描述

配置中心服務端

  1. 配置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>

  1. 配置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

  1. 主啓動類,配置完就啓動,等待其它微服務通過本配置中心去遠程倉庫獲取配置。
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
    public static void main(String[] args) {
        SpringApplication.run(Config_Server_3344.class,args);
    }
}
  1. 微服務讀取配置方式
    在這裏插入圖片描述
    推薦:/{label}/{application}-{profile}.yml
  2. 微服務需要添加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>


  1. 微服務配置需要用到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: "*"

  1. 在控制層controller加上註解@RefreshScope 動態刷新配置
@RefreshScope
@RestController
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo(){
        return configInfo;
    }
}
  1. 每次修改都得發送一個POST請求 "http://localhost:3355/actuator/refresh"去提醒微服務配置已更新,可以避免每次配置更改,都要重啓服務。
# 使用curl發送post請求
curl -X POST "http://localhost:3355/actuator/refresh"
  1. 如果有多個微服務配置都要更新呢,總不能一個一個提醒微服務吧?能不能一鍵提醒所有微服務呢?有的,springcloud 的另一組件spring cloud bus消息總線配合MQ消息中間件可以做到一鍵刷新所有微服務配置。
    原理大概: 觸發一個服務端ConfigServer的/bus/refresh端點,通過消息總線告知每個微服務,而刷新所有客戶端微服務的配置
    在這裏插入圖片描述
  2. 給配置中心服務和各微服務都加上消息總線的pom依賴
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

  1. 消息中間件用的是RabbitMQ,在這之前需要先安裝RabbitMQ和相關環境,之後配置中心和各微服務都要在yml加上相關配置
rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
  1. 啓動配置中心,各微服務,然後在遠程倉庫修改配置文件,然後依舊發送post請求 "http://localhost:3344/actuator/bus-refresh,通過告知配置中心,配置中心通過消息總線去通知全部微服務。達到一鍵動態更新所有微服務的配置。
curl -X POST "http://localhost:3344/actuator/bus-refresh

nacos實現配置中心功能

在這裏插入圖片描述

  1. 啊,啓動nacos,這個就不說了,有需要的去看本系列的第一篇學習記錄,啓動相當於開啓了註冊與發現,配置中心的功能。(還不止,應該再加上bus,因爲nacos實現了一鍵動態更新所有微服務配置),然後在nacos控制檯可視化添加配置文件即可~
    在這裏插入圖片描述
    點擊添加,填寫配置,點擊發布即可,Data UD必須爲“微服務名-生產環境.文件後綴"格式===>${spring.application.name}-${spring.profile.active}.${spring.cloud.naces.config.file-extension}
    在這裏插入圖片描述
  2. 微服務導入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>

  1. 配置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
  1. 控制層加上@RefreshScope註解,讓微服務可以自動檢測刷新配置。
@RestController
@RefreshScope
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}
  1. 主啓動類
//啓動類
@SpringBootApplication
@EnableDiscoveryClient //服務發現
public class CloudAlibabaConfigClient3377 {
    public static void main(String[] args) {
       SpringApplication.run(CloudAlibabaConfigClient3377.class, args);
    }
}
  1. 完事,使用確實很簡單,只要每次在nacos裏面修改一下對應的配置文件,獲取該配置文件的各微服務都會動態更新相應配置,當然如何讓配置持久化呢?那就應該寫入mysql等數據庫,讓nacos集羣都從mysql獲取相同的配置,讓每個微服務獲取的配置都能保持一致性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章