1 環境說明
JDK:1.8
MAVENT:3.5
SpringBoot:2.0.5.RELEASE
SpringCloud:Finchley.SR1
2 創建服務注冊中心(Eureka服務端)
說明:本博文僅僅以一個單例的注冊中心為例,高可用的服務注冊中心請參見
2.1 引入依賴
利用IDEA創建服務注冊中心項目時只需要引入 spring-cloud-starter-netflix-eureka-server 一個依賴就可以啦
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>

<?xml version="1.0" encoding="UTF-8"?> <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.example</groupId> <artifactId>eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 配置文件
配置服務注冊中心端口以及服務服務注冊中心的應用名
技巧01:單例模式下的服務注冊中心需要關閉向其他服務注冊中心注冊本服務信息功能和從其他服務注冊中心拉取注冊服務信息功能

server:
port: 8761
spring:
application:
name: eureka
eureka:
client:
fetch-registry: false # 關閉從其他服務注冊中心拉取服務信息
register-with-eureka: false # 不向其他服務注冊中心注冊本服務的信息
2.3 引入服務注冊中心配置
需要在啟動類上利用@EnableEurekaServer將SpringBoot為我們提供的Eureka的相關配置引入到系統應用中,否則Eureka服務注冊中心不會生效
技巧01:@EnableEurekaServer的作用就是將某個配置了Eureka相關配置的類引入到應用容器中
2.4 啟動服務注冊中心
通過IP和端口訪問的效果如果所示
3 創建Eureka客戶端
3.1 引入依賴
利用IDEA創建SpringBoot項目時引入 spring-boot-starter-web、spring-cloud-starter-netflix-eureka-client即可,我這里同時引入了devtools、lombok只是為了開發方便而已

<?xml version="1.0" encoding="UTF-8"?> <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.example</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-devtools</artifactId> <scope>runtime</scope> </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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.2 配置文件
需要配置應用名和應用端口、配置注冊中心連接信息
3.4 啟動Eureka客戶端
在啟動類上利用@EnableEurekaClient將Eureka客戶端的相關配置引入到應用容器中
3.5 啟動Eureka客戶端
Eureka客戶端啟動成功后就可以在Eureka服務端的控制頁面看到注冊成功的服務信息,例如
4 創建ConfigServer
技巧01:ConfigServer也是一個Eureka客戶端,同樣需要向Eureka服務端進行注冊;只不過這個服務專門負責管理一些配置文件
4.1 引入依賴
利用IDEA創建SpringBoot項目時引入 spring-cloud-starter-netflix-eureka-client 、spring-cloud-config-server 依賴

<?xml version="1.0" encoding="UTF-8"?> <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.example</groupId> <artifactId>config</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>config</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties> <dependencies> <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>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
4.2 配置文件
需要配置應用端口、應用名、服務注冊中心、遠程代碼倉庫
4.3 引入默認配置
利用@EnableEurekaClient將Eureka客戶端的默認配置引入到應用容器中,利用@EnableConfigServer將配置中心的的默認配置引入到應用容器中
4.4 啟動配置中心應用
技巧01:啟動成功后可以在Eureka的控制面板中查看到相關的服務注冊信息,例如
4.5 查看遠程倉庫中的配置信息
技巧01:配置服務中心啟動時會暴露一些URL,可以利用這些URL訪問遠程倉庫中的配置文件信息,例如
4.5.1 訪問規則說明
/{name}-{profiles} -> /配置文件-環境
/{label}/{name}-{profiles} -> /git分支/配置文件-環境
技巧01:以上兩種格式都同時支持 yml、json、properties三種數據格式
4.5.2 git倉庫配置文件命名
4.5.3 通過配置中心訪問指定的配置文件信息
技巧01:訪問任何一個consumer-xxx.yml 的配置文件時都會和 consumer.yml 進行整合;可以將consumer.yml作為共有配置的存放文件
技巧02:使用 /{name}-{profiles} 訪問時默認訪問master分支,可以在配置中心的配置文件中指定使用哪一個分支
4.6 配置本地倉庫路徑和遠程倉庫分支
技巧01:配置中心服務從遠程倉庫獲取到配置文件后會存放到本地的一個默認目錄,可以在配置中心服務的配置文件中配置這個本地倉庫地址
技巧02:配置中心配置遠程倉庫地址信息時可以指定使用遠程倉庫的哪一個分支;如果配置了分支后再使用 /{name}-{profiles} 這種格式獲取配置文件信息時就會返回配置分支中的配置文件信息;當然亦可以使用 /label/ /{name}-{profiles} 這種格式訪問指定分支的配置文件信息
5 配置中心客戶端
技巧01:需要從配置中心服務獲取配置信息的服務都可叫作配置中心客戶端
5.1 引入依賴
修改第三節的Eureka客戶端,只需要再引入 spring-cloud-config-client 即可
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
5.2 修改配置
將原有的配置全部剪切到遠程倉庫中對應的consumer.yml配置文件中,並將這個cnsumer.yml多復制幾份並制定環境
5.3 配置啟動配置文件
場景:config是服務配置中心、consumer是一個需要從config服務中獲取配置信息的服務、eureka是服務注冊中心
技巧01:config和consumer都必須在eureka中心注冊,consumer是通過eureka從config中獲取服務的;所以不能直接將配置中心的連接信息配置到application.yml中,而是需要新建一個啟動配置文件bootsttap.yml,需要將應用名、配置中心信息、注冊中心信息中心配置到bootstrap.yml中
技巧02:在bootstrap.yml中配置的應用名必須和遠程倉庫中的配置文件保持一致,因為需要通過應用名到配置中心去獲取該應用的配置信息
5.4 啟動consumer服務
技巧01:啟動consumer服務時控制台會打印出配置中心的信息,例如
5.4 使用遠程git中的配置文件
技巧01:和使用在 application.yml 中配置的信息一樣,例如
5.5 高可用配置中心搭建
將配置中心打包后分別部署就可以啦,版案例利用IDEA通過不同端口啟動實現
啟動了兩個配置中心后,多次重啟consumer服務時就會從不同的配置中心獲取數據,例如
6 整合消息中線
說明:雖然consumer可以通過配置中心獲取到遠程倉庫中的配置信息,但是我們修改遠程倉庫中的配置文件時並不能生效;想用時遠程倉庫的配置生效我們必須一起重啟config服務和consumer服務;如果不想通過從前來實現的話就需要使用消息總線來實現。
6.1 集成消息總線
6.1.1 安裝RabbitMQ
rabbitMQ控制台
6.1.2 添加依賴
分別在consumer和config服務中添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
6.1.3 添加RabbitMQ配置
技巧01:consumer服務可以配置到遠程服務的consumer.yml文件中
技巧02:config服務必須在application.yml中進行配置
6.1.4 配置config服務
開啟config服務的所有映射端口,想要讓修改遠程倉庫中的倉庫生效,在修改后必須向config服務發送一個post請求,請求路徑為: /actuator/bus-refresh
6.1.5 添加@RefreshScope
在用到了遠程配置的類級別添加@RefreshScope注解,否則修改遠程倉庫后及時向config的 /actuator/bus-refresh 發送了post請求也不會進行更新
6.1.6 啟動config和consumer服務
啟動服務后會自動在RabbitMQ中創建每個服務各自的queue,和一個springcloudbus對應exchange
6.1.7 修改刷新
》修改遠程倉庫的配置信息,修改后通過config可以獲取到最新的配置,但是其他服務不會拿到配置;這時ocnfig服務必須觸發一個事件將配置更新放到總線隊列中去
》想config服務的 /actuator/bus-refresh 發送一個post請求就可以讓consumer服務也獲取到最新的配置信息
6.1.8 利用遠程倉庫向config服務的 /actuator/bus-refresh 發送POST請求
》利用natapp在遠程倉庫配置webhooks
》在config服務中引入依賴(如果不引入這個依賴就不會自動刷新,必須手動向config服務發送post請求才能實現動態刷新)
<!--自己添加的依賴:解決了利用github+rabbitmq實現配置動態刷新的功能--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-monitor</artifactId> </dependency>
》修改倉庫配置信息並提交后config控制台會輸出日志信息,同時rabbitMQ中也會出現消息的推送和訂閱
7 本博文源代碼