一、Spring Cloud Bus介绍
1.什么是Spring Cloud Bus?
Spring Cloud Bus集成了市面上常用的消息代理等,连接微服务系统中所有的节点,当有数据变更时,可以通过消息广播通知服务及时变更数据。
- 解决了什么问题:
解决了微服务数据变更,及时同步的问题。
2.使用Bus实现自动刷新配置信息-Client刷新:
需要安装RabbitMq;https://www.jianshu.com/p/da5b3b224db2
-
创建配置中心Server服务:
- 修改POM文件:
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-config-server
- 修改配置文件:
spring.application.name=config-server
server.port=9020
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#Git 配置
spring.cloud.config.server.git.uri=https://gitee.com/zwzy/config
#Git私有仓库的用户名和密码
#spring.cloud.config.server.git.username=
#spring.cloud.config.server.git.password=
- 修改启动类:
@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
-
创建客户端项目:
- 修改POM文件:
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-config
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-bus-amqp
org.springframework.boot
spring-boot-maven-plugin
- 修改配置文件:
spring.application.name=config-client
server.port=9022
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#默认 false,这里设置 true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应 eureka 中的配置中心 serviceId,默认是configserver
spring.cloud.config.discovery.serviceId=config-server
#指定环境
spring.cloud.config.profile=dev
#git标签 分支/主干
spring.cloud.config.label=master
#springboot 默认开启了权限拦截 会导致 /refresh 出现 401,拒绝访问
management.security.enabled=false
#消息队列的链接配置
spring.rabbitmq.host=192.168.226.129
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtualHost=/
- 修改启动类:
@EnableEurekaClient
@SpringBootApplication
public class RefreshApplication {
public static void main(String[] args) {
SpringApplication.run(RefreshApplication.class, args);
}
}
- 创建Controller:
@RestController
@RefreshScope//刷新作用域
public class ConfigClientController {
@Value("${e-book}")
private String msg;
@RequestMapping("/show")
public String ShowMsg() {
return this.msg;
}
}
-
测试:
-
拷贝Bus客户端项目:
- 修改配置文件,更改端口号:
spring.application.name=config-client
server.port=9021
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#默认 false,这里设置 true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应 eureka 中的配置中心 serviceId,默认是configserver
spring.cloud.config.discovery.serviceId=config-server
#指定环境
spring.cloud.config.profile=dev
#git标签 分支/主干
spring.cloud.config.label=master
#springboot 默认开启了权限拦截 会导致 /refresh 出现 401,拒绝访问
management.security.enabled=false
#消息队列的链接配置
spring.rabbitmq.host=192.168.226.129
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtualHost=/
-
使用HttpClientUtil工具发送post请求:
-
测试:
3.使用Bus实现自动刷新配置信息-Server 刷新:
-
创建服务端项目:
- 修改POM文件:
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-config-server
org.springframework.cloud
spring-cloud-starter-bus-amqp
- 修改配置文件:
spring.application.name=config-server
server.port=9020
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#Git 配置
spring.cloud.config.server.git.uri=https://gitee.com/zwzy/config
#Git私有仓库的用户名和密码
#spring.cloud.config.server.git.username=
#spring.cloud.config.server.git.password=
#springboot 默认开启了权限拦截 会导致 /refresh 出现 401,拒绝访问
management.security.enabled=false
spring.rabbitmq.host=192.168.226.129
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtualHost=/
- 修改启动类:
@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
-
使用httpClientUtil工具发送post请求:
- 测试:
客户端使用上面的两个项目。
4.实现局部刷新服务:
使用上面的Server-bus2服务和两个客户端测试。
1.刷新指定服务:
使用httpClientUtil工具类发送post请求。
“http://Config-Server/bus/refresh?destination=需要刷新的服务名称:端口 ”。
-
修改远程仓库中的配置信息:
-
使用httpClientUtil工具类:
-
测试:
2.刷新指定集群:
使用工具类发送post请求;
"http://Config-Server/bus/refresh?destination=需要刷新的服务名称:**"。
-
修改远程仓库中配置信息:
-
使用工具类发送post请求:
-
测试:
二、消息驱动入门案例
1.创建消息的发送者:
- 修改POM文件:
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-config-server
org.springframework.cloud
spring-cloud-starter-stream-rabbit
org.springframework.boot
spring-boot-starter-test
test
- 修改配置文件:
spring.application.name=config-server
server.port=9020
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#消息队列的链接配置
spring.rabbitmq.host=192.168.226.129
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtualHost=/
- 创建发送消息的接口:
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.SubscribableChannel;
public interface ISendeService {
@Output("user-exchange")
SubscribableChannel send();
}
- 修改启动类:
@EnableBinding(value = ISendeService.class)
@EnableEurekaClient
@SpringBootApplication
public class ISendeApplication {
public static void main(String[] args) {
SpringApplication.run(ISendeApplication.class, args);
}
}
2.创建消息的接受者:
- 修改POM文件:
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR5
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-config-server
org.springframework.cloud
spring-cloud-starter-stream-rabbit
- 修改配置文件:
spring.application.name=config-server
server.port=9021
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://admin:123456@eureka1:8761/eureka/,http://admin:123456@eureka2:8761/eureka/
#消息队列的链接配置
spring.rabbitmq.host=192.168.226.129
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtualHost=/
- 创建接收消息的接口:
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
public interface IReceiveService {
@Input("user-exchange")
SubscribableChannel receiver();
}
- 创建处理消息的类:
@Service
@EnableBinding({IReceiveService.class})
public class ReceiverService {
@StreamListener("user-exchange")
public void onReciver(byte[] msg) {
//处理消息
System.out.println("Receiver:"+new String(msg));
}
}
- 修改启动类:
@EnableBinding(value = IReceiveService.class)
@EnableEurekaClient
@SpringBootApplication
public class IReceiverApplication {
public static void main(String[] args) {
SpringApplication.run(IReceiverApplication.class, args);
}
}
- 测试:
在消息发送的项目中创建测试类;依次启动项目和执行测试类。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ISendeApplication.class)
public class Test {
@Autowired
private ISendeService isendeService;
@org.junit.Test
public void testSend() {
String msg ="Sende发送的消息!";
//将消息封装成Message
Message message = MessageBuilder.withPayload(msg.getBytes()).build();
isendeService.send().send(message);
}
}