在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。
SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。
消息代理属于中间件。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。开源产品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud仅支持RabbitMQ和Kafka。本文采用RabbitMQ实现这一功能。
RabbitMQ实现
RabbitMQ是实现了高级队列协议的(AMQP)的开源消息代理软件,也称面向消息中间件。采用Erlang语言编写。
AMQP是Advanced Message Queuing Protocol 简称,是一个面向消息中间件的开放式标准应用层协议。定义了以下特性:
消息方向、消息队列、消息路由、可靠性、安全性
AMQP要求消息的提供者和客户端接收者的行为要实现对不同供应商可以用相同的方式(SMTP、HTTP、FTP等)进行互相操作。AMQP是一个线路级协议,是通过网络发送的数据传输格式。因此符合该数据格式的消息发送和接收工具都能互相兼容和操作。轻易地实现跨计数平台的架构方案。
RabbitMQ以AMQP协议实现,因此支持多操作系统,多编程语言,几乎覆盖了所有主流的企业级技术平台,在微服务架构消息中间件的选择中很有优势。springCloud Bus中也包含了对Rabbit的自动化默认配置。
安装
Erlang : http://www.erlang.org/downloads
RabbitMQ : https://www.rabbitmq.com/download.html
rabbitmq安装路径不要包含中文,会启动失败
本次采用Erlang/OTP19.1 RabbitMQ Server 3.6.11
开始
Eureka-Server 注册中心未做改动
config-server 配置中心 application.yml 采用远程仓库
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
spring.application.name=config-server
server.port=8888
spring.cloud.config.server.git.uri=https://github.com/43942692/First/tree/master/config-repo
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=master
spring.cloud.config.server.git.username=your username
spring.cloud.config.server.git.password=your password
远程仓库中的config-client-dev.properties文件中有一个属性:
foo= foo version 132456
cloud-simple-service pom文件中增加
<!--加入AMQP**rabbitMQ-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
bootstrap.properties内容如下
注意:config的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。
启动eureka-Server 启动config-Server
测试 config-Server
访问http://localhost:8888/cloud-config-dev.properties,
如果能出现文件的配置信息则说明已经成功和获取了git仓库配置信息
启动cloud-simple-servie 端口号为8882
访问http://localhost:8882/hi
回复为 foo version 132456
修改远程仓库文件信息foo= foo version 654321
再次访问 回复 foo version 132456 发现都没有更新,传统做法是重启服务来接收更新,
现在可以发送http://localhost:8882/bus/refresh
查看后台发现cloud-simple-service在重新读取配置文件
再次访问,回复 foo version 654321 与远程仓库属性一致
/bus/refresh接口可以指定服务,即使用”destination”参数,比如/bus/refresh?destination=customers 即刷新服务名为customers的所有服务,不管ip