01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线
Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。
大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。
SpringCloud Bus 目前仅支持RabbitMQ 和 Kafka
(1) 提交代码触发post给客户端A发送bus/refresh。
(2) 客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus。
(3) Spring Cloud bus接到消息并通知给其它客户端。
(4) 其它客户端接收到通知,请求Server端获取最新配置。
(5) 全部客户端均获取到最新的配置。
在微服务架构的系统中,通常会使用轻量級的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费。所以称它为消息总线。在总线上的各个实例都可以方便地广播些需要让具他连接在该主题上的实例都知道的消息。
192.168.0.39 zookeeper kafka
(1) 解压
tar -zxvf kafka_2.11-0.11.0.2.tgz
mv kafka_2.11-0.11.0.2 kafka
cd /usr/local/kafka/config
vim server.properties
listeners=PLAINTEXT://192.168.0.39:9092
host.name=192.168.0.39
port=9092
log.dirs=log.dirs=/usr/local/logs/kafka/kafka-logs
zookeeper.connect=192.168.0.39:2181
mkdir -p /usr/local/logs/kafka
(4) 启动kafka
cd /usr/local/kafka
nohup bin/kafka-server-start.sh config/server.properties 1>kafka.start.log 2>&1 &
<dependencies>
<!-- 配置客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.zrs.springcloud</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
(2) bootstrap.yml
server:
port: 9005
spring:
application:
name: config-client-slave
cloud:
# 配置拼接:http://localhost:9003/Config-enviroment-release-v1.0/config-dev
config:
#分支
label: Config-enviroment-release-v1.0
#配置文件名称
name: config
#读取后缀名称
profile: dev
#配置中心地址
uri: http://localhost:9003
eureka:
client:
#是否将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer获取已有的注册服务
fetch-registry: true
#注册地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: config-client-slave
prefer-ip-address: true
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
(3) 主启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigSlaveClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigSlaveClientApplication.class);
}
}
(4) Controller
@RestController
@RefreshScope
public class ConfigClientRontroller {
@Value("${config.info}")
private String info;
@Value("${server.port}")
private String port;
@GetMapping("/info")
public String info(){
return "server port:"+port+",info:"+info;
}
}
(5) 修改cloud-config-client的Controller
@RestController
@RefreshScope
public class ConfigClientRontroller {
@Value("${config.info}")
private String info;
@Value("${server.port}")
private String port;
@GetMapping("/info")
public String info(){
return "server port:"+port+",info:"+info;
}
}
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
server:
port: 9003
spring:
application:
name: config-center
#配置kafka
kafka:
bootstrap-servers: 192.168.0.39:9092
consumer:
group-id: springcloud-bus
cloud:
config:
server:
git:
#配置github
uri: https://github.com/zhurongsheng666/spring-cloud-hoxton.git
#配置搜索目录
search-paths:
- springcloud-config
#配置分支
label: Config-enviroment-release-v1.0
eureka:
client:
#是否将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer获取已有的注册服务
fetch-registry: true
#注册地址
service-url:
defaultZone: http://localhost:7000/eureka/
instance:
instance-id: config-center
prefer-ip-address: true
#配置刷新
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
#配置kafka
kafka:
bootstrap-servers: 192.168.0.39:9092
consumer:
group-id: springcloud-bus
4.5 启动Eureka、ConfigCenter、ConfigClient、ConfigClientSlave
(3) POST请求服务端
curl -X POST "http://localhost:9003/actuator/bus-refresh"
curl -X POST "http://localhost:9003/actuator/bus-refresh/{destination}"
#分支 Bus-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton