SpringCloud(四):消息总线与配置中心

一、概念部分

在分布式系统架构中,通常会使用中间件来作为消息代理实现一个共用的消息系统。
分布式中的其他服务都连接到消息系统,并且实现消息的生产、监听、和消费,
我们把这样的消息系统称为消息总线。

在消息总线上的每个实例都可以广播一些消息让其他实例接收到,比如我们之前实现的
配置中心,我们使用WebHooks来推送一个post请求去refresh客户端实现刷新配置,
这样的方式其实很不合理,在有多个客户端的情况下,就需要逐个刷新,虽然可以专门
使用一个客户端来做刷新其他客户端的操作,但是这样违反了单一职责。

接下来我们修改一下配置中心,然他实现消息总线自动更新配置的功能。

通过使用 Spring Cloud Bus 可以比较容易的搭建消息总线系统,在使用之前我们需要先了解
消息代理,消息代理(Message Broker)是一种消息验证、传输、路由的架构模式。消息代理可以减小应用之前相互依赖,通过消息通信解耦系统之前的直接调用。
消息代理是一个中间件产品,他的核心是一个消息的路由程序。目前有很多消息代理的开源产品,比如RabbitMQ,Kafka,ActiveMQ等。SpringCloud目前只支持RabbitMQ和Kafka。
SpringCloud包含了对RabbitMQ的自动化配置,所以我们使用 RabbitMQ来整合SpringCloudBus实现消息总线。

RabbitMQ是一款实现了高级消息队列协议(AMQP)的开源消息代理软件。AMQP的全称为 Advanced Message Queuing Protocol(高级消息队列协议),基于此协议的客户端与消息中间件可传递消息。

实现消息总线前,需要先在操作系统上安装RabbitMQ,具体的安装方法可查阅官网
https://www.rabbitmq.com/

我们要实现的功能如下图所示:



1.开发者通过 git push 提交配置文件到git中心
2.git中心通过WebHooks自动提交post请求到配置中心
3.配置中心发送消息到消息总线
4.消息总线通知分布式系统中各个服务接收消息
5.分布式系统中的各个服务接收到消息后去配置中心获取配置,实现刷新配置。

二、代码示例

配置中心

  1. 修改 config-dashborad 项目,在build.gradle中添加依赖
compile('org.springframework.cloud:spring-cloud-starter-bus-amqp’)

2.修改application.yml中的配置,主要添加消息中间件的配置,完整配置如下

#spring配置
spring:
  #应用配置
  application:
    #应用名称(配置中心)
    name: spring-cloud-config-server
  #云服务配置
  cloud:
    config:
      server:
        #git中心配置(这里我将配置文件存储在码云上)
        git:
          #配置文件所在的服务地址
          uri: https://gitee.com/lanshiqin/spring-cloud
          #配置文件所在的文件路径
          search-paths: service-registry-config
          #公开的项目不需要设置用户名和密码
          username:
          password:
         
  #消息中间件配置
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

#服务器配置
server:
  #端口
  port: 9010

#服务器发现注册配置
eureka:
  client:
    serviceUrl:
      #配置服务中心(可配置多个,用逗号隔开)
      defaultZone: https://www.apiboot.cn/eureka

management:
  #禁用安全管理
  security:
    enabled: false

3.启动RabbitMQ服务 (启动配置中心前一定要写启动该服务,否则会报连接不上服务异常)

rabbitmq-server

我已经把rabbitMQ部署在我的服务器上并且绑定了域名,默认用户名和密码都是guest。访问地址:https://rabbit.apiboot.cn/

4.启动配置中心


当看到控制台启动日志输出 Mapped "{[/bus/refresh],methods=[POST]}”的时候,说明配置中心已经集成了消息总线的功能,git中心的WebHooks自动提交post请求到该url后,配置中心就会发送一条需要更新配置文件的消息给消息总线,监听消息总线的客户端接收到消息后会自动调用各自的refresh方法去配置中心重新获取配置文件并且刷新配置。

为了测试方便,我把配置中心也部署到了服务器上,并且绑定了域名解析
打开浏览器访问:https://config.apiboot.cn/service-registry-config/dev


发现配置中心成功的读取到了git仓库的配置文件。

然后打开RabbitMQ的管理页面, 切换到Connections面板



可以看到配置中心已经连接到了RabbitMQ消息服务。

客户端

1.修改之前的producer-service项目,build.gradle依赖配置如下

dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-eureka')
   compile('org.springframework.cloud:spring-cloud-starter-config')
   compile('org.springframework.boot:spring-boot-starter-actuator')
   compile('org.springframework.cloud:spring-cloud-starter-bus-amqp')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

2.修改bootstrap.yml (消息中心示例只在本地测试,所以这里就去掉从服务中心获取配置中心地址的配置,使用直接指定配置中心的uri的方式)
bootstrap.yml

#spring配置
spring:
  #云配置
  cloud:
    config:
      #配置文件前缀 (这里配置的name+profile为我们要读的配置文件 即 service-registry-dev)
      name: service-registry
      profile: dev
      #发现配置
      discovery:
        #启用服务发现
        enabled: true
        #指定server端(配置中心)的 spring.application.name的值,通过该值去注册中心取到配置中心的地址
        service-id: spring-cloud-config-server

#服务器发现注册配置
eureka:
  client:
    serviceUrl:
      #配置服务中心(可配置多个,用逗号隔开)
      defaultZone: https://www.apiboot.cn/eureka

3.启用消息跟踪
application.yml
#spring配置
spring:
  application:
    #应用名称(服务提供者)
    name: producer-service
  cloud:
    #消息总线
    bus:
      trace:
        #开启消息跟踪
        enabled: true

#服务器配置
server:
  #端口
  port: 8000
  #显示名称
  display-name: producer-service

#服务器发现注册配置
eureka:
  client:
    serviceUrl:
      #配置服务中心(可配置多个,用逗号隔开)
      defaultZone: https://www.apiboot.cn/eureka

management:
  #禁用安全管理
  security:
    enabled: false

启动客户端,访问RabbitMQ管理页面



发现多了一个客户端,说明客户端服务已经成功连接到RabbitMQ服务了。

打开浏览器访问客户端服务所在的地址:https://producer.apiboot.cn/appInfo

可以看到客户端成功读取配置中心从git仓库上获取的配置文件信息。

我们需要在仓库配置文件项目中设置WebHooks。
将post请求路径设置为 配置中心所在的路径 https://config.apiboot.cn/bus/refresh
这样我们执行 git push的时候,就会向配置中心发送post请求,配置中心就会发送消息给消息总线,然后客户端就会监听到消息自动到配置中心获取配置信息。

接下来我们修改git仓库上的配置文件,修改成 “你好,蓝先生”,点击提交(git push)


我们再次打开浏览器访问客户端 https://producer.apiboot.cn/appInfo


发现客户端已经通过消息总线自动刷新了配置。

项目地址:https://github.com/lanshiqin/cloud-project
欢迎点赞

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 87,461评论 13 122
  • 前言 在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都能连接上...
    二月_春风阅读 7,317评论 0 12
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 138,430评论 20 591
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 17,145评论 7 220
  • 这个城市不知道有多好 但是也不能赶走我的寂寥 酒店里冷冷的被窝让我睡不好 每一个夜晚你知道我想你有多少 早知道送你...
    特颜甜阅读 83评论 0 0