09SpringCloud Bus消息总线

2020-11-04 10:04:47 浏览数 (1)

RabbitMQ 安装过程

以 Ubuntu20 为例

参考文章

安装前准备

代码语言:javascript复制
sudo apt-get update -y
sudo apt-get install curl gnupg -y

安装RabbitMQ签名密钥

代码语言:javascript复制
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

安装apt HTTPS传输

代码语言:javascript复制
sudo apt-get install apt-transport-https

添加提供最新的RabbitMQ和Erlang版本的Bintray存储库

  1. 在/etc/apt/sources.list.d目录下创建bintray.erlang.list文件
  2. 在文件中输入以下内容(这里以Ubuntu20.04, Erlang版本为23.x为例子)
代码语言:javascript复制
deb https://dl.bintray.com/rabbitmq-erlang/debian focal erlang-23.x

安装Erlang包

代码语言:javascript复制
sudo apt-get update -y

sudo apt-get install -y erlang-base 
                        erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets 
                        erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key 
                        erlang-runtime-tools erlang-snmp erlang-ssl 
                        erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl

指定有效程序包

1、执行sudo apt-get update -y命令

2、 在/etc/apt/preferences.d目录下新建erlang文件并输入以下内容

代码语言:javascript复制
Package: erlang*
Pin: release o=Bintray
Pin-Priority: 1000

3、 执行以下命令

代码语言:javascript复制
sudo apt-cache policy

4、 在/etc/apt/preferences.d目录下的erlang文件中更改成以下内容(这里erlang选择23.0.3-1版本)

代码语言:javascript复制
Package: erlang*
Pin: version 1:23.0.3-1
Pin-Priority: 1000

Package: esl-erlang
Pin: version 1:22.3.4.1
Pin-Priority: 1000

5、 在/etc/apt/preferences.d/目录下篡改剪rabbitmq文件,并添加以下内容

代码语言:javascript复制
Package: rabbitmq-server
Pin: version 1:3.8.7
Pin-Priority: 1000

安装RabbitMQ

代码语言:javascript复制
## Update package indices
sudo apt-get update -y

## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing

验证RabbitMQ安装

代码语言:javascript复制
# 启动管理界面和外部监控系统
sudo rabbitmq-plugins enable rabbitmq_management

# 启动RabbitMQ
sudo service rabbitmq-server start

访问页面查看效果

访问地址:http://127.0.0.1:15672

User can only log in via localhost

添加账号并赋予权限

添加admin,并赋予administrator权限

添加admin用户,密码设置为admin。

代码语言:javascript复制
sudo rabbitmqctl add_user  admin  admin

赋予权限

代码语言:javascript复制
sudo rabbitmqctl set_user_tags admin administrator

赋予virtual host中所有资源的配置、写、读权限以便管理其中的资源

代码语言:javascript复制
sudo rabbitmqctl  set_permissions -p / admin '.*' '.*' '.*'

访问服务器,使用 admin/admin 登陆

SpringCloud Bus动态刷新全局广播

设计思想

1、利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置

2、利用消息总线触发一个服务端ConfigServer的/bus/refresh断电,而刷新所有客户端的配置

这里我们选择第二种,更符合我们的要求,原因如下:

  1. 打破了微服务的职责单一性,因为微服务本身是业务模块,它不应该承担配置刷新的职责
  2. 破坏了微服务各节点的对等性
  3. 有一定的局限性,例如微服务在迁移时,它的网络地址常发生变化,如果想做到自动刷新,那就会增加更多的修改

cloud-config-client3366 复制并修改

演示广播效果,增加复杂度,再以3355为模板制作一个3366

controller

新增 serverPort 区分端口号

代码语言:javascript复制
package com.ray.cloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 * @Author Administrator
 * @Date 2020/10/18 15:35
 * @Version 1.0
 */
@RestController
@RequestMapping("/client")
@RefreshScope  // 具备刷新能力
public class ConfigClientController {

    @Value("${server.port}")
    private String serverPort;

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return "serverPort: "   serverPort   "tnn"   "configInfo: "   configInfo;
    }
}

cloud-config-center3344配置中心服务端添加消息总线支持

pom

代码语言:javascript复制
<!-- 添加消息总线RabbitMQ支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

yml

代码语言:javascript复制
server:
  port: 3344

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          # Gitee上的git仓库名字
#          uri: https://gitee.com/qq343509740/spring-cloud_h_2020.git # 不公开
          uri: https://gitee.com/qq343509740/spring-cloud_-h_2020_config.git # 公开
          # 如果是不公开的项目,需要配置如下三项
#          force-pull: true
#          username: xxxx@qq.com
#          password: xxxx
          ##搜索目录.这个目录指的是Gitee上的目录
          search-paths:
#            - config-repo # 不公开
            - spring-cloud_-h_2020_config # 公开
      ##读取分支
      label: master
  # rabbitMQ 相关配置 (新增)
  rabbitmq:
    host: 192.168.116.128
    port: 5672
    username: admin
    password: admin


# 服务注册到 eureka 地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/


# rabbitMQ 相关配置,暴露 bus 刷新配置的端点 (新增)
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

cloud-config-center3355客户端添加消息总线支持

pom

代码语言:javascript复制
<!-- 添加消息总线RabbitMQ支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

yml

代码语言:javascript复制
server:
  port: 3355

spring:
  application:
    name: cloud-config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
      uri: http://localhost:3344

  # rabbitMQ 相关配置
  rabbitmq:
    host: 192.168.116.128
    port: 5672
    username: admin
    password: admin

# 服务注册到 eureka 地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

cloud-config-center3366客户端添加消息总线支持

pom

代码语言:javascript复制
<!-- 添加消息总线RabbitMQ支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

yml

代码语言:javascript复制
server:
  port: 3366

spring:
  application:
    name: cloud-config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
      uri: http://localhost:3344

  # rabbitMQ 相关配置
  rabbitmq:
    host: 192.168.116.128
    port: 5672
    username: admin
    password: admin

# 服务注册到 eureka 地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

测试1

访问:http://localhost:7001/

访问:http://config3344.com:3344/master/config-dev.yml

访问:http://localhost:3355/client/configInfo

访问:http://localhost:3366/client/configInfo

目前所有服务正常,尝试改变Gitee上面的配置文件

测试2

目的:一处修改,处处生效

此时,主要输入下面命令,即可达到目的

代码语言:javascript复制
curl -X POST "http://localhost:3344/actuator/bus-refresh"

不用重启项目或者刷新指定端口即可处处刷新

SpringCloud Bus动态刷新定点通知

不想全部通知,只想定点通知。指定具体某一个实例生效而不是全部。 公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination} /bus/refresh请求不再发送具体的服务实例上,而是发给config server并通过destination参数类指定需要更新配置的服务或实例

测试

只通知3355,不 通知3366

代码语言:javascript复制
## config-client:3355 相当于 服务名称:端口号
curl -X POST "http://localhost:3344/actuator/bus-refresh/cloud-config-client:3355"

刷新 3355,已经发生改变

刷新 3366,没有发生改变

0 人点赞