Spring Authorization Server,Spring Cloud系列之Spring Cloud Config

 2023-12-06 阅读 32 评论 0

摘要:認識Spring Cloud Config Spring Cloud Config是最早的配置中心,雖然后面的之秀Nacos可以取代它, 但是Spring Cloud Config還是很多公司在用,比如我司。 那為什么我們需要一個配置中心呢?我們直接將配置寫在本地的yml配置文件中不行嗎? 一

認識Spring Cloud Config

Spring Cloud Config是最早的配置中心,雖然后面的之秀Nacos可以取代它, 但是Spring Cloud Config還是很多公司在用,比如我司。

那為什么我們需要一個配置中心呢?我們直接將配置寫在本地的yml配置文件中不行嗎?

一個新技術的出現,一定是因為它解決了某些痛點,我們來看看將配置信息直接寫在本地yml配置文件存在哪些痛點:

  • 如果多個微服務可能使用相同的配置信息,假設有50個微服務,如果配置需要修改配置文件,就意味著我們需要修改50個微服務的yml文件,極其浪費時間。
  • 配置信息修改后,必須重啟服務才能生效

Spring Authorization Server,而Spring Cloud Config解決了這倆個痛點:

  • 集中式管理。在開發中多個微服務可能使用相同的配置,假設有50個微服務,如果配置需要修改配置文件,就意味著我們需要修改50個微服務的yml文件。使用配置中心后,就可以做到一處修改,處處修改。
  • 動態修改配置。使用配置中心,配合actuator可以實現配置的動態修改,無需重啟服務

Spring Cloud Config架構圖

在這里插入圖片描述
簡單說明一下流程

  1. 把配置文件放在Git Repository中。
  2. Config Server從Git repository中讀取配置信息。
  3. 其他客戶端再從Config Server中加載配置文件

接下來,我們將根據這個架構圖搭建一個案例。

快速入門Spring Cloud Config

項目中使用到的版本:

  • Spring Boot:2.2.2.RELEASE
  • Spring Cloud:Hoxton.SR1

Spring 框架、版本不同的話可能會出現一點問題。

創建配置中心倉庫

首先我們需要一個創建一個配置中心倉庫。由于github的網速太慢,所以我使用碼云創建配置中心倉庫,當然你也可以使用github。

1、在碼云創建springcloud-config倉庫

2、在倉庫中創建三個文件
在這里插入圖片描述

Springboot注解,文件命名規格:{項目名}-{配置環境版本}.yml。比如config-dev.yml,表示的是config項目的開發環境配置。

配置文件內容分別如下。

config-dev.yml:

user:name: "張三 dev" 

config-prod.yml

user:name: "張三 prod" 

config服務端搭建

SpringCloud是基于什么、1、 新建SpringBoot項目spring-cloud-config-server,并引入依賴

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- spring cloud config 服務端包 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency>
</dependencies>

3.2 配置config相關配置

bootstrap.yml 文件

spring:application:name: config-server  # 應用名稱cloud:config:server:git:# 配置中心倉庫地址uri: https://gitee.com/F_promise/springcloud-config.git #配置文件所在倉庫username: 碼云用戶名password: 碼云密碼default-label: master #配置文件分支
#          search-paths: config  #配置文件所在根目錄

3、在 Application 啟動類上增加相關注解 @EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
}

啟動SpringBoot服務,測試一下。

Spring Cloud Config 有它的一套訪問規則,我們通過這套規則在瀏覽器上直接訪問就可以。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
  • application:應用名,這里是config
  • profile:配置文件版本,比如dev、prod
  • label:git的分支,默認master

以第一條規則為例,訪問config-dev.yml配置文件:
在這里插入圖片描述
至此,配置中心服務端搭建完畢,接下來客戶端(其他項目)需要從配置中心中獲取配置信息。

config客戶端搭建

1、新建SpringBoot項目spring-cloud-config-client,并引入依賴

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- spring cloud config 客戶端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>
</dependencies>

注意,客戶端和服務端引入的config依賴是不一樣的。

2、編寫bootstrap.yml配置文件

--- bootstrap.yml ---
spring:profiles:active: dev		#激活開發環境的配置文件---
spring:application:name: configcloud:config:uri: http://localhost:8080	#config服務端的地址label: master					profile: dev					#開發環境---
spring:application:name: configcloud:config:uri: http://localhost:8080 	#config服務端的地址label: masterprofile: prod					#生產環境

3、編寫application.yml配置文件

server:port: 8888user:name: 小王			#配置默認值。配置中心有用配置中心的

4、創建UserController測試使用

@RestController
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
}

5、啟動服務,訪問測試
在這里插入圖片描述
可以看到,成功讀取到了配置中心中的config-dev.yml配置文件。將bootstrap.yml中的active改成prod在進行測試:
在這里插入圖片描述

實現自動刷新

Spring Cloud Config是在項目啟動的時候加載的配置內容,導致了它存在一個缺陷,配置文件修改后,需要重啟服務才能生效。這也是我們之前說的第二個痛點。

為了解決這個痛點,它提供了一個刷新機制,但是需要我們主動出發。那就是 @RefreshScope 注解并結合 actuator 。

actuator實現自動刷新

1、在spring-cloud-config-client加入actuator依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、在application.yml中添加如下actuator的配置

management:endpoint:shutdown:enabled: falseendpoints:web:exposure:include: "*"

3、在Controller上添加@RefreshScope注解

@RestController
@RefreshScope
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
} 	

4、主動觸發更新

在配置文件修改后,使用Postman發送一個post請求到http://localhost:8888/actuator/refresh 這個接口,觸發主動更新。
在這里插入圖片描述

Spring Cloud Bus

Spring Cloud Bus 將分布式系統的節點與輕量級消息代理鏈接。這可以用于廣播狀態更改(例如配置更改)或其他管理指令。一個關鍵的想法是,Bus 就像一個擴展的 Spring Boot 應用程序的分布式執行器,但也可以用作應用程序之間的通信渠道。
—— Spring Cloud Bus 官方解釋

如果每次配置文件修改后,都需要我們主動發送post請求觸發更新,這明顯有點不太方便。而且如何客戶端比較多的話,一個一個的手動刷新也比較耗時。這個時候,我們可以借助Spring Cloud Bus的廣播功能,讓client端都訂閱配置更新事件,當配置更新時,觸發其中一個端的更新事件,Spring Cloud Bus就把此事件廣播到其他訂閱端,以此來達到批量更新。

1、Spring Cloud Bus 核心原理其實就是利用消息隊列做廣播,所以要先有個消息隊列,目前官方支持 RabbitMQ 和 kafka。我們這里以RabbitMQ 為例。

2、在客戶端spring-cloud-config-client中加入依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>

3、在配置文件中增加 RabbitMQ 相關配置

spring: rabbitmq:host: 192.168.243.136port: 5672username: guestpassword: guest

4、啟動倆個或多個客戶端進行測試

我們可以拷貝一份配置
在這里插入圖片描述
然后修改vm options添加-Dserver.port=8889就行了
在這里插入圖片描述
所以最后的結構就是倆個客戶端和一個配置中心服務端。
在這里插入圖片描述

5、分別打開 http://localhost:8888/info和 http://localhost:8889/info,查看內容,然后修改碼云上配置文件的內容并提交。再次訪問這兩個地址,數據沒有變化。

6、訪問其中一個的 actuator/bus-refresh 地址,注意還是要用 POST 方式訪問。之后查看控制臺輸出,會看到這兩個端都有一條這樣的日志輸出

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed

7、再次訪問第 5 步的兩個地址,會看到內容都已經更新為修改后的數據了。

結合 Eureka 使用 Spring Cloud Config

以上是Spring Cloud Config最基本的使用,在實際開發中,Spring Cloud Config可能會被注冊在Eureka中,這樣的話,可以Spring Cloud Config配置中心就可以搭建集群實現高可用。

此外引入Eureka后,config客戶端就不再需要直接和config服務端直接打交道了,而是通過Eureka來發現Config服務端。

加入Eureka后的架構圖如下:
在這里插入圖片描述
簡單說明一下流程

  1. 把配置文件放在Git Repository中。
  2. Config Server從Git repository中讀取配置信息。
  3. Config Server將自己注冊到Eureka中
  4. Client從Eureka中獲取Config Server的信息
  5. Client訪問Config Server,加載配置信息

搭建Eureka服務

首先搭建一個簡單的Eureka。如果你沒有學過Eureka的話,可以看看這篇文章Spring Cloud系列之Eureka入門使用。

1、導入依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2、編寫配置文件

spring:application:name: eureka-serverserver:port: 3000eureka:client:register-with-eureka: falsefetch-registry: falseservice-url.defaultZone: http://localhost:3000/eureka/

3、在啟動類標記@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

將配置中心注冊到Eureka中

1、給spring-cloud-config-server項目添加Eureka依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2、在配置文件中添加Eureka相關配置

eureka:client:service-url:#注冊到eureka服務端的地址defaultZone: http://localhost:3000/eureka/instance:#點擊具體的微服務,右下角是否顯示ipprefer-ip-address: true#顯示微服務的名稱instance-id: spring-cloud-config-server

3、給主啟動類添加@EnableEurekaClient注解

啟動配置中心后,訪問Eureka
在這里插入圖片描述

config客戶端從Eureka中發現配置中心

1、給spring-cloud-config-client項目添加Eureka依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、修改配置文件,添加Eureka的相關配置,并指定配置中心的application.name

spring:profiles:active: dev		#激活開發環境的配置文件eureka:client:service-url:#注冊到eureka服務端的地址defaultZone: http://localhost:3000/eureka/instance:#點擊具體的微服務,右下角是否顯示ipprefer-ip-address: true#顯示微服務的名稱instance-id: spring-cloud-config-client---
spring:application:name: configcloud:config:
#      uri: http://localhost:8080	#config服務端的地址,整合eureka后不需要填寫label: masterprofile: dev					#開發環境discovery:                    #從Eureka中發現配置中心enabled: trueservice-id: config-server   #指定配置中心的application.name---
spring:application:name: configcloud:config:
#      uri: http://localhost:8080 	#config服務端的地址label: masterprofile: prod					#生產環境discovery:                    #從Eureka中發現配置中心enabled: trueservice-id: config-server   #指定配置中心服務端的server-id

整合Eureka后,config客戶端不再需要指定config服務端的地址,而是通過config服務端的application.name從Eureka中獲取配置中心的信息。配置中心可以做集群高可用。

3、給主啟動類添加@EnableEurekaClient注解

啟動后,查看Eureka,訪問http://localhost:8888/info進行測試。
在這里插入圖片描述
在這里插入圖片描述

參考文章:
https://cloud.tencent.com/developer/article/1474037

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/192082.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息