概述

什么是消息总线

消息总线是基于消息代理,统一一个唯一的通信入口,负责所有连接到该总线上的应用实例消息的接收,必要的统一处理,路由等操作。

消息总线在微服务中的意义

解耦微服务间通信,屏蔽了内部细节,统一进行了必要的处理逻辑(如给消息加上了服务名称等信息)并根据路由规则路由到对应的组件上去,消息缓存、持久化及一些灾备措施也提高了整个微服务系统的可靠性。

RabbitMQ与Kafka

目前Spring Cloud Bus消息总线仅支持两款消息中间件,RabbitMQ及Kafka

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件。RabitMQ具有高性能,可伸缩的特点。

Kafka是基于消息发布-订阅模式实现的消息系统。具有高吞吐、跨平台、伸缩性等优点。

基于RabbitMQ实现的微服务消息总线

安装RabbitMQ

安装方法请根据主机系统自行查询方法,RabbitMQ 等相关概念同理,此处不赘述

结合Spring Cloud Config 实例改造

此处结合之前Spring Cloud Config笔记中的 config-client及config-server进行改造,请自行在网站内搜索

加依赖

首先给config-client项目加上必要依赖如下:

    <!-- 改依赖已对RabbitMQ的使用进行了封装 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

    <!-- 需要改依赖提供动态刷新配置的端点 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

改配置

给配置文件添加RabbitMQ相关的信息(此处为bootstrap.yml)

Spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: springcloud #通过MQ的guest用户创建的新用户
    password: 123456 #新用户密码

验证

启动服务注册中心eureka-server,在启动config-server,最后启动两个实例config-client并运行在不同端口上(此处可使用maven命令打包,并在运行jar包时指定端口),之后通过config-client实例的/from端点获取动态获取的配置信息,之后修改Git服务器中存放的配置文件并提交,之后用Postman触发任意一个config-client实例的/bus/refresh端点(POST请求),可以看到两个config-client实例的配置信息都重新获取且刷新。

优化

考虑到一个服务有多个实例,经过某个服务的某个实例去刷新该服务的配置信息不可靠,不是最好的方法。可以通过配置中心经由消息总线刷新指定服务配置。同样地给服务中心加入以上config-client依赖及RabbitMQ相关配置信息,即将配置中心纳入到消息总线中。并通过/bus/refresh?destination={service-id}端点刷新指定服务配置。

基于Kafka实现的微服务消息总线

安装Kafka

官网下载对应的安装包安装即可。

结合Spring Cloud Config 实例改造

此处可以用以上基于RabbtiMQ实现的消息总线应用实例config-client及config-server改造

改依赖

spring-cloud-starter-bus-amqp 改为 spring-cloud-starter-bus-kafka

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-kafka</artifactId>
    </dependency>

配置

此处由于Kafka是安装在本地的,所以kafka配置可以使用默认设置

验证

方法同RabbitMQ的验证,可以看到配置中心config-server同样可以经由kafka传递刷新消息,动态刷新服务配置信息。