在微服務架構中,一般會使用輕量級的消息代理來構建一個共用的消息主題來鏈接各個微服務實例,它廣播的消息會被全部在註冊中心的微服務實例監聽和消費,也稱消息總線。 html
SpringCloud中也有對應的解決方案,SpringCloud Bus 將分佈式的節點用輕量的消息代理鏈接起來,能夠很容易搭建消息總線,配合SpringCloud config 實現微服務應用配置信息的動態更新。git
消息總線其實經過消息中間主題模式,他使用廣播消息的機制被全部在註冊中心微服務實例進行監聽和消費。以廣播形式將消息推送給全部註冊中心服務列表web
消息代理屬於中間件。設計代理的目的就是爲了可以從應用程序中傳入消息,並執行一些特別的操做。開源產品不少如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支持RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。spring
圖示:apache
經過客戶端去通知每一個服務 更新配置文件緩存
升級 經過消息總線的方式:服務器
消息總線框架底層是MQ實現的,引入相應的jar包,底層框架實現好了,每一個服務裏面引入了相應的jar包後,自動建立隊列 綁定交換機等等架構
配置文件的應用場景就很符合。app
環境搭建:框架
每一個服務對於分佈式配置中心來講是 client端
配置文件環境 dev test pre prd
配置文件命名規範 client服務名稱(註冊中心名稱)-版本.yml
建立好這個文件
互聯網項目場景中的配置文件 不是存放在本底的 是存放在遠程服務器
寫在本地 須要重啓服務器 !!
下面開始搭建分佈式配置中心 SpringCloude 組件 Config
一、配置文件存放在git 或者 svn
二、搭建分佈式配置中心服務
三、客戶端讀取分佈式配置中心服務
configServer端:
配置文件:
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.toov5</groupId> <artifactId>SpringCloud-eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <!-- 管理依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--SpringCloud eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- hystrix斷路器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> </dependencies> <!-- 注意: 這裏必需要添加, 否者各類依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
yml:
###服務註冊到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
spring:
application:
####註冊中心應用名稱
name: config-server
cloud:
config:
server:
git:
###git環境地址
uri: https://gitee.com/toov5/distributed_configuration_file.git
####搜索目錄
search-paths:
- Test
####讀取分支
label: master
####端口號
server:
port: 8888
啓動:
package com.toov5.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient @EnableConfigServer public class AppServerConfig { public static void main(String[] args) { SpringApplication.run(AppServerConfig.class, args); } }
啓動Eureka後啓動 configServer
訪問地址: http://127.0.0.1:8888//appConfig-dev.yml
Client端:
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.toov5</groupId> <artifactId>SpringCloud_config_client</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencies> <!-- SpringBoot整合Web組件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!-- SpringBoot整合eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies> <!-- 注意: 這裏必需要添加, 否者各類依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
Controller:
package com.toov5.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { @Value("${userAge}") //配置中心的 咱們這個字段在本地沒有配置 private String userAge; @RequestMapping("/getUserAge") public String getUerAge() { return userAge; } }
啓動類:
package com.toov5.controller; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class AppClientConfig { public static void main(String[] args) { SpringApplication.run(AppClientConfig.class, args); } }
yml:
對應命名規範去配置!
spring: application: ####註冊中心應用名稱 對應命名規範去配置 appConfig-dev.yml name: appConfig cloud: config: ####讀取後綴 profile: dev #對應命名規範去配置 ####讀取config-server註冊地址 discovery: service-id: config-server ##服務的名字 enabled: true ##### eureka服務註冊地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka server: port: 8882
訪問結果:
若是此時 修改了配置文件,刷新出來的仍是不變的!緩存到當前的jvm中了 重啓client端就OK了 能夠作定時刷新
升級: 不重啓服務器自動刷新
1.手動通知刷新單個jvm值
2. 消息總線通知整個微服務刷新
1. 經過監控中心
手動actuator端點刷新數據
引入mavn 到client
<!-- actuator監控中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
yml
開啓監控服務
management:
endpoints:
web:
exposure:
include: "*"
此時的yml:
spring:
application:
####註冊中心應用名稱 對應命名規範去配置 appConfig-dev.yml
name: appConfig
cloud:
config:
####讀取後綴
profile: dev #對應命名規範去配置
####讀取config-server註冊地址
discovery:
service-id: config-server ##服務的名字
enabled: true
##### eureka服務註冊地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
server:
port: 8882
#開啓全部服務端點權限
management:
endpoints:
web:
exposure:
include: "*"
而後Controller 加上 刷新的註解 @RefreshScope
package com.toov5.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class IndexController { @Value("${userAge}") //配置中心的 咱們這個字段在本地沒有配置 private String userAge; @RequestMapping("/getUserAge") public String getUerAge() { return userAge; } }
對應的值 不用重啓就能夠刷新了
啓動後:修改git的文件值
發送post請求:
http://127.0.0.1:8882/actuator/refresh
有個缺點,若是configClient作個集羣
如要去刷新每一個 服務的值! postman 搞一遍
升級:這樣就須要消息總線了!
SpringCloud整合rabbitmq 和 kafka
本文采用的是rabbitmq去做爲案例講解:
rabbitmq 的加交換機有四種: fanout direct topic head
在這個體系中 微服務有多少個 就會在MQ中建立多少個隊列,當手動刷新一個服務時候,會經過rabbitmq 去把消息同時發給交換機,而後經過交換機發送給其餘的微服務 。
環境的搭建:
引入maven: bus的核心jar包
client和servler端都須要引入
<!--核心jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <!-- actuator監控中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
若是報錯添加:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus-parent</artifactId> <version>2.0.0.RC2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
客戶端須要yml開啓bus刷新:client端
###開啓bus刷新 management: endpoints: web: exposure: include: bus-refresh
同時須要配置mq的鏈接信息:
此時的client端yml:
spring:
rabbitmq:
####鏈接地址
host: 192.168.91.6
####端口號
port: 5672
####帳號
username: admin
####密碼
password: admin
### 地址 主機獨立的virtualhost
virtual-host: /admin_toov5
application:
####註冊中心應用名稱 對應命名規範去配置 appConfig-dev.yml
name: appConfig
cloud:
config:
####讀取後綴
profile: dev #對應命名規範去配置
####讀取config-server註冊地址
discovery:
service-id: config-server ##服務的名字
enabled: true
##### eureka服務註冊地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
server:
port: 8882
###開啓bus刷新
management:
endpoints:
web:
exposure:
include: bus-refresh
server:
###服務註冊到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
spring:
rabbitmq:
####鏈接地址
host: 192.168.91.6
####端口號
port: 5672
####帳號
username: admin
####密碼
password: admin
### 地址 主機獨立的virtualhost
virtual-host: /admin_toov5
application:
####註冊中心應用名稱
name: config-server
cloud:
config:
server:
git:
###git環境地址
uri: https://gitee.com/toov5/distributed_configuration_file.git
####搜索目錄
search-paths:
- Test
####讀取分支
label: master
####端口號
server:
port: 8888
###開啓bus刷新
management:
endpoints:
web:
exposure:
include: bus-refresh
底層會幫助建立 mq隊列 主題 兩個client 一個 server
訪問一個接口 8882 的,其餘的服務8883也會跟着改了!
http://127.0.0.1:8882/actuator/bus-refresh
就是玩了個 yml+jar包 而已