1. Github项目地址 https://github.com/zengzhen1994/springboot-learning (选择Springcloud/Springcloud-learning-4)
2. 项目前提条件
2.1 RabbitMQ安装
如果没有安装的话,可以点击这里
2.2 Eureka服务器的搭建&两个Service用来向Eureka服务注册&一个config-server也向Eureka注册
如果还没搭建的话,可以点击这里
两个Service用不同的端口,在这里我用的是端口91,92。
Service向Eureka成功注册时,给每个Service添加Controller代码,用来测试是否获取到分布式配置以及配置是否更新。Controller代码如下
package com.zz.springcloud.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;
@RefreshScope
@RestController
public class InfoController {
@Value("${province}")
private String province;
@RequestMapping("/from")
public String from() {
return "Hi,I come from "+province;
}
}
准备完成后,访问localhost:81/,如下图,应该有三个应用注册成功。
2.3 Google开发的postman下载,用来测试消息总线。
3. 本项目意义在上一章中,我们能够从github成功获取配置信息。但是,当我们更改配置信息,再刷新访问页面时,发现页面并没有跟随更新。可以看到代码里有@RefreshScope,是为了给它发送/refresh请求时,该客户端才会刷新配置。如果有多个客户端时,显然不可能要每个客户端都去发送一个refresh请求。因此我们用RabbitMQ,它的工作机制就是绑定所有的客户端,以及配置服务端。当每次github上更改配置时,我们就通知配置服务端。服务端把消息发送给RabbitMQ,RabbitMQ再群发给绑定的所有客户端。这样的话我们就不用一个个去更新配置了。
4. 更改配置服务端&客户端代码
4.1 更改配置服务端
增加RabbitMQ依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
在配置信息里添加RabbitMQ配置
#配置RabbitMQ
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
4.2 更改客户端代码
同样添加RabbitMQ依赖包,添加RabbitMQ配置在bootstrap.properties如下
spring.application.name=zz
server.port=92
eureka.client.serviceUrl.defaultZone=http://localhost:81/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=eureka-config-server
spring.cloud.config.profile=info
spring.cloud.config.failFast=true
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
同样去获取zz-info.properties文件。
5. 效果演示
5.1
首先修改配置信息,province=fujian
访问http://localhost:91/from 配置信息未更新
访问http://localhost:92/from 配置信息未更新
5.2
打开postman
发送post请求给config-server:http://localhost:90/bus/refresh
访问http://localhost:91/from 配置信息更新为fujian
访问http://localhost:92/from 配置信息更新为fujian
5.3
你可以继续更改配置,然后发送给你指定的service更新,例如
http://localhost:90/bus/refresh?destination=zz:91
destination后跟应用名:端口号。
如果是这样的post请求,则只有service1(端口号为91)的更新配置,另一个服务则不更新配置。