微服务之Springcloud 从零基础到入门——Config+Bus篇

微服务之Springcloud 从零基础到入门——Config+Bus篇

一. 背景简介

在微服务中,当系统信息需要变更时,就需要对配置文件进行修改,但是如果在一个大型的微服务系统中,对每一个微服务都进行修改的话那么会十分的繁琐。其次,修改完之后还要重新启动对应的微服务,这样配置才能生效。于是,Spring Cloud Config+Spring Cloud Bus就可以解决这个问题。Spring Cloud Config可以使得每微服务的配置文件都是从外部加载而来,这样只需要修改外部的配置文件就相当于修改了该微服务的配置。其次,仅使用Config也不能实现动态刷新,还是需要重启微服务实现配置的动态更新。而配合Spring Cloud Bus可以实现配置的动态刷新。

二. 基本环境准备

两个eureka注册中心集群环境的准备,可以参考

微服务之Springcloud 从零基础到入门——eureka篇

三. 搭建Config配置中心

创建springboot项目,按照以下步骤进行:

  1. 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</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-actuator</artifactId>
</dependency>
  1. 修改application.yml配置
server:
  port: 3344
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          # 仓库地址
          uri: https://github.com/llllllk/springcloud-config.git
          # 仓库具体文件
          search-paths:
            - springcloud-config
          username: "github的用户名"
          password: "github的密码"
      # 默认读取master分支
      label: master
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
  1. 修改主启动类
@SpringBootApplication
@EnableConfigServer
public class Config3344Application {
    public static void main(String[] args) {
        SpringApplication.run(Config3344Application.class,args);
    }
}
  1. 测试是否搭建成功
    首先在github账户中创建配置文件,以下为我在springcloud-config仓库中创建的文件目录
    在这里插入图片描述
    接下来通过Config配置中心去拉取服务,在浏览器中输入
    http://localhost:3344/master/config-dev.yml去拉取config-dev配置,若出现以下页面则说明配置中心的搭建成功。
    在这里插入图片描述
    其中访问配置文件的格式有如下几种(label代表分支,profile代表环境,application代表文件名):
  • /{label}/{application}-{profile}.yml
    例:http://localhost:3344/master/config-dev.yml
  • /{application}-{profile}.yml
    例:http://localhost:3344/config-dev.yml,默认从master拉取dev配置,因为本地application.yml中配置的默认分支为master
  • /{application}/{profile}/{label}/
    例:http://localhost:3344/config/dev/master
四. 客户端使用远端的配置
  1. 引入依赖
    依赖和配置中心基本相同,唯一的区别就是将config server端的依赖改为以下依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. 创建bootstrap.yml配置文件
    bootstrap.yml和application.yml文件都是配置文件,但是bootstrap的加载顺序要先于application。
server:
  port: 3355
spring:
  application:
    name: cloud-config-client
  cloud:
    config:   #即读取http://localhost:3344/master/config-dev.yml
      label: master
      name: config
      profile: dev
      uri: http://localhost:3344
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  1. 测试类
@RestController
public class ReadController {
    @Value("${config.info}")
    private String info;
    @GetMapping(value = "config")
    public String getConfig(){
        return this.info;
    }
}
五. 手动实现动态加载配置

github上面修改了配置文件后必须要手动重启客户端才可以实现更改配置,那么为了解决这个问题,必须要实现自动加载配置。

  1. Config客户端暴露监控端点
    在bootstrap.yml中添加如下配置:
    management.endpoints.web.exposure.include="*"
  2. 在需要动态加载的业务类中添加@RefreshScope
@RestController
@RefreshScope
public class ReadController {
    @Value("${config.info}")
    private String info;
    @GetMapping(value = "config")
    public String getConfig(){
        return this.info;
    }
}
  1. 手动发送post请求到http://localhost:3355(客户端)/actuator/refresh
六. 自动实现动态加载配置

手动配置已经解决了服务需要重启的问题,但仍然存在着一些问题。如果服务的个数很多,那么需要运维去一个个的分发这些post请求,为了解决这个问题,配合Spring Cloud Bus可以实现自动更新配置。Bus整合了JAVA的事件处理机制和消息中间件的功能。可以实现分布式的自动刷新配置,但是只支持RabbitMQ和Kafka。本文用的是RabbitMQ。

  1. 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. Config服务端暴露监控端点
    在application.yml中添加如下配置:
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
  1. 添加RabbitMQ的配置
    因为实现的思想是修改配置文件后先通知配置服务器,让配置服务器去通知配置客户端,所以Config的服务端和客户端都需要添加该配置。我的RabbitMQ是在虚拟机上安装的,所以这边的配置为虚拟机的地址。
spring:
	rabbitmq:
	    host: 192.168.192.129
	    port: 5672
	    username: root
	    password: root
  1. 测试
    启动项目后可以在RabbitMQ的管理界面看到Spring Cloud Bus的通道,表明Config服务端和客户端的消息通道已经建立。
    在这里插入图片描述
    修改了github上的配置文件后,只需要发送http://localhost:3344/actuator/bus-refresh即可实现所有Config客户端的刷新。跟手动刷新相比,配合了Bus后的配置刷新只需要刷新Config服务端即可实现所有配置客户端的刷新。
七. 下一篇介绍

本文讲述了Spring Cloud Config和Spring Cloud Bus的基本使用,用到的消息中间件是RabbitMQ,但是消息中间件还有很多,比如Kafka,RocketMQ等。掌握每一个消息中间件需要花费巨大的时间,那有没有一个组件可以将所有的消息中间件整合呢?那么Spring Cloud Stream可以解决这个问题。下一篇介绍。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值