<九>spring-cloud Hoxton.SR2 spring-cloud-bus消息总线的搭建使用

<九>spring-cloud Hoxton.SR2 spring-cloud-bus消息总线的搭建使用


本地项目的基础环境

环境版本
jdk1.8.0_201
maven3.6.0
Spring-boot2.2.4.RELEASE
Spring-cloudHoxton.SR2

《<一>spring-cloud Hoxton.SR2版 服务注册与发现–eureka搭建以及集群搭建》

《<二>spring-cloud Hoxton.SR2 负载均衡ribbon搭建使用》

《<三>spring-cloud Hoxton.SR2 负载均衡openfeign搭建使用》

《<四>spring-cloud Hoxton.SR2 断路器hystrix搭建使用》

《<五>spring-cloud Hoxton.SR2 hystrix Dashboard监控搭建使用》

《<六>spring-cloud Hoxton.SR2 网关组件zuul搭建使用》

《<七>spring-cloud Hoxton.SR2 网关组件gateway搭建使用》

《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》

具体代码信息,可以查看《码云》

文档信息,可以参考《spring-cloud中文网》《spring官网》

这篇文章是基于《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》

是针对多个客户端配置刷新的一个深层次解决方式;下面的案例,是基于上篇应用的复制,改造;

1、安装rabbitmq

为了方便安装,我这里基于docker形式的安装

1.1、下载rabbitmq

docker pull rabbitmq:management

1.2、执行运行指令

docker run -d --name rabbitmq_01 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

1.3、访问rabbitmq的web客户端

http://localhost:15672

账号密码就是指令里的 admin/admin

1、基于bus的spring-cloud-config 配置中心server端项目搭建

1.1、搭建新的项目badger-spring-cloud-config-server-bus,pom文件如下

主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client,配置中心config-server的包spring-cloud-config-server,消息总线的jar包spring-cloud-starter-bus-amqp

上篇可以不需要Eureka;这次,多个客户端通知形式刷新的时候,需要Eureka的注册中心

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.badger</groupId>
    <artifactId>badger-spring-cloud-config-server-bus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>badger-spring-cloud-config-server-bus</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <spring-cloud.version>Hoxton.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
            <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1.2、主类上加注解@EnableConfigServer和eureka的注解@EnableEurekaClient

/**
 * @EnableConfigServer 开启config服务端的注册
 * @author liqi
 */
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerBusApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerBusApplication.class, args);
    }

}

1.3、yaml的配置文件

server:
  port: 9500
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true
spring:
  application:
    name: badger-spring-cloud-config-server-bus
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/liqi01/badger-spring-cloud.git
          default-label: master
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin
management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh" 

跟上篇《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》,yaml文件中,只是新增了rabbitmq的基础配置,已经暴露了spring-cloud-bus的刷新点位bus-refresh

rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin
management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh" 

2、基于bus的spring-cloud-config 配置中心server端测试演示

2.1、测试演示

我在https://gitee.com/liqi01/badger-spring-cloud.git这个git地址下,演示的yml的配置文件名称application-bus.yml;文件内容如下:

test:
  port: 10000

这里避免下面的多个客户端启动的时候,默认拉去的是端口是10000,导致我本地单机启动重复端口,导致项目无法启动;新增了一个配置文件application-bus.yml;内容也换成了test.port

启动运用;通过url地址访问:

http://localhost:9500/master/application-bus.yml

得到正常结果;

test:
  port: 10000

修改git上application-bus.yml文件的端口的值;改回10001后;再继续访问配置中心config-server应用;

http://localhost:9500/master/application-bus.yml

可以看到文件内容端口信息,已经改回到了10001了;可以确认,git上的配置文件,已经改成功了;并且配置中心,也已经拿到最新的文件内容;

3、基于bus的spring-cloud-config 配置中心使用端client端项目搭建

3.1、搭建新的项目badger-spring-cloud-config-client-bus,pom文件如下

主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client,配置中心config-server的包spring-cloud-config;spring-cloud-bus的jar包spring-cloud-starter-bus-amqp

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.badger</groupId>
    <artifactId>badger-spring-cloud-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>badger-spring-cloud-config-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <spring-cloud.version>Hoxton.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</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.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.2、主类上eureka的注解@EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient
@RestController
@RefreshScope
public class ConfigClientBusApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientBusApplication.class, args);
    }

    @Value("${test.port}")
    String port;

    @Value("${spring.cloud.client.ip-address}")
    String address;

    @GetMapping("/demo")
    public String demo() {
        return "我的地址是-->" + address + ":" + port;
    }
}

这里需要注意的是@Value("${test.port}") 获取的test.prot的属性;

3.3、bootstrap.yml配置文件

server:
  port: 10000
management:
  endpoints:
    web:
      exposure:
        include: '*'
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true
spring:
  application:
    name: badger-spring-cloud-config-client-bus
  cloud:
    config:
      label: master
      name: application
      profile: bus
      uri:
      - http://localhost:9500
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin

如果配置文件名字叫application.yml,那么通过config加载的配置文件,不生效;启动的端口,还是上述配置文件中的9051

需要把配置文件名称改成bootstrap.yml;优先级要高于application.yml

label:分支名称

name:配置文件的名称;

profile:运行环境;

uri:配置中心的地址;

新增了rabbitmq的基础配置;

4、基于bus的spring-cloud-config 配置中心client端测试演示

4.1、演示

启动Eureka服务,端口为8761

启动应用badger-spring-cloud-config-client-bus;端口为10000;

直接访问url,也可以看到具体的内容信息

http://localhost:10000/demo

我的地址是-->172.16.2.54:10000

4.2、遇到的问题

修改git上application-bus.yml文件的端口的值;改回10001后;

1、配置中心服务端

再继续访问配置中心config-server应用;

http://localhost:9500/master/application-bus.yml

可以看到文件内容端口信息,已经改回到了10001了;可以确认,git上的配置文件,已经改成功了;并且配置中心,也已经拿到最新的文件内容;

2、配置中心客户端

客户端,后台并没有刷新;访问下面地址后,跟上述结果一致,没有变化;

http://localhost:10000/demo

说明,客户端获取的配置文件,没有刷新;

跟之前是一致的,还是需要手动触发刷新;

curl -X POST "http://localhost:10000/actuator/refresh"

不一样的是

1、在上一篇的案例中,没有加入spring-cloud-bus 消息总线,目前只是启动了一个config的client端,如果启动多个client端,那么需要针对多个client端,做多次的刷新;

2、当前应用加入了消息总线;那么我们启动多个client端的时候,是不是只用手动刷新一次,就可以通知到其他的应用自动去刷新呢?

4.3、再次测试演示

1、启动新的客户端应用badger-spring-cloud-config-client-bus;端口为11000;

目前启动的应用列表:

1.1、客户端应用badger-spring-cloud-config-client-bus 启动了2个,端口分别为10000、11000;

http://localhost:11000/demo

http://localhost:10000/demo

正常访问;

1.2、配置中心服务端应用badger-spring-cloud-config-server-bus,端口为9500

http://localhost:9500/master/application-bus.yml

正常访问

1.3、Eureka服务列表如下:

2、修改git上的application-bus.yml文件的端口,改成10002(上面的测试,改成了10001)

客户端:没有刷新的情况下,内容还是10001

http://localhost:11000/demo

http://localhost:10000/demo

服务端:内容已经变成了10002;

http://localhost:9500/master/application-bus.yml

3、手动刷新配置中心服务端;

注意:上述的测试,以及之前的上篇文章《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》中;

手动刷新的,都是基于客户端client刷新的;使用消息总线后,分发是从服务端,向下(client)发送的;

curl -X POST "http://localhost:9500/actuator/bus-refresh"

刷新配置中心的服务端后,再次请求客户端

http://localhost:11000/demo

http://localhost:10000/demo

可以看到内容,都已经变成了10002了;

4、应用结构

具体代码信息,可以查看《码云》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值