SpringCloud教程第八篇:BUS

Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。

一、准备工作

本文还是基于上一篇文章来实现。按照官方文档,我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;这就是说我们需要装rabbitMq,点击windows安装rabbitmq。至于怎么使用 rabbitmq,搜索引擎下。

二、改造config-client

1. 在pom文件加上起步依赖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.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.utour</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.M3</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-netflix-eureka-client</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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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-actuator</artifactId>
        </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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

2. 在配置文件bootstrap.yml中加上RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码,代码如下:

server:
  port: 8881
spring:
  application:
    name: config-client
  cloud:
    config:
      label: master
      #dev开发环境配置文件、test测试环境、pro正式环境
      profile: dev
      #配置服务中心的网址
      #uri: http://localhost:8888/
      discovery:
        #是否从注册中心获取配置
        enabled: true
        #配置中心的服务名称
        service-id: config-server
  rabbitmq:
    host: localhost
    port: 5672
    username: wangxiaomeng
    password: 123456
management:
#  SpringCloud 1.5版本暴露接口,暴露/bus-refresh接口
#  security:
#    enabled: false
  #SpringCloud 2.0.0版本以后暴露接口方式,暴露/bus-refresh接口
  endpoints:
    web:
      exposure:
        include: "*"

3. 改造TestController,加上@RefreshScope注解,如下:

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.RestController;

/**
 * @Description
 * @Author wangxm
 * @Date 2019/10/28 14:35
 **/
@RestController
@RefreshScope
public class TestController {

    @Value("${foo}")
    private String foo;

    @GetMapping("/hi")
    public String hi() {
        return foo;
    }

}

4. 依次启动eureka-serverconfg-serverconfg-client,浏览器访问http://localhost:8881/hi,浏览器显示:

foo version 21

启动config-client项目时,可能连不上rabbitmq,那是因为我们在windows安装rabbitmq这篇文章中添加了wangxiaomeng这个用户,删除了guest这个用户,但是还没有给wangxiaomeng这个用户授权,如下进行授权:
在这里插入图片描述

这时我们去代码仓库将foo的值改为“foo version 22”,即改变配置文件foo的值,如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要在postman发送post请求:http://localhost:8881/actuator/bus-refresh,你会发现config-client项目会重新加载配置文件。

这时我们再次浏览器访问http://localhost:8881/hi,浏览器显示:

foo version 22

需要注意的是:可能我们没有权限修改foo的值,可以fork一份代码到自己的github仓库,然后再自己的仓库中修改foo的值,这时需要修改config-server项目中Git仓库地址,如下:

uri: https://github.com/wangxm1000/SpringcloudConfig/

然后重新依次启动eureka-serverconfg-serverconfg-client,再进行上述操作即可。

三、配置自动刷新

上面配置需要手动发送post请求,才能进行配置文件的刷新,下面配置自动刷新。

1.config-client中添加依赖,如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

2. 配置Webhooks
在这里插入图片描述
配置成功后,会在每次 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求。

上面的URL需要使用外网可以访问到的地址。

3. 验证

重启服务后,在git 上修改配置,修改提交后, Webhooks 就会自动发送一个POST请求到你配置的URL,也可以看到日志在跑了,说明调用成功,然后再访问http://localhost:8881/hi,可以拿到修改后的配置,完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值