SpringCloud之Config配置中心实践篇

说明:本文只是讲解SpringCloud Config 基本使用与Bus实现刷新通知,并不涉及到生产环境mysql,redis等配置的真实案例,准备在讲解Apollo配置中心的时候再来实现mysql,redis等配置的动态刷新。

1.环境说明

我们这里还将继续使用篇文章的环境,可以到我的GitHub上面拉取一份环境使用:演示环境源码链接 ,当然也可以自己从头搭建一套,本篇文章涉及服务讲解:
spring-cloud-parent(父工程,主要是管理了springcloud版本Greenwich.RELEASE与一些公共依赖)
—spring-cloud-eureka-server (Eureka server 集群分别9090与9091两个节点)
—spring-cloud-user-service-consumer (用户服务,用来从配置中心拉取配置测试,启用8080 节点)
—spring-cloud-config-server (配置中心server端 9060一个节点)

2. 简单使用

接下来我们实现这样一个架构
在这里插入图片描述

2.1 配置中心server端

我们首先要在父工程的基础上新建一个module,然后在做下面的一些步骤

2.1.1 创建存放配置文件的git仓库

我这里是在github上面直接创建了一个私有仓库,如果嫌github 访问速度慢的也可以在gitlab这种私服或者gitee码云上面创建,这些都是一样的。
然后在仓库里面创建文件
我这里的配置文件命名是这个样子的:

{服务名}-{环境}.yml

例如:spring-cloud-user-service-consumer-dev.yml

然后在这个文件里面放了个mysql连接信息配置:

mysql:
  driver-class-name: com.mysql.cj.jdbc.Driver
  jdbc-url: jdbc:mysql://192.168.3.36:3306/driver_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
  username: root
  password: 123456

在这里插入图片描述
这里演示阶段,你随便放就可以了。

2.1.2 pom

这里需要添加Eureka Client 依赖 ,与config server 的依赖,同时如果父工程没有这个Springboot actuator 依赖的需要添加到父工程中

 <!--eureka client 客户端-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>
 <!--springcloud config server端-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-config-server</artifactId>
 </dependency>
2.1.3 配置文件application.yml

这里我们需要配置一些常规配置,Eureka 配置,Spring Cloud Config 配置还有健康检查的配置

server:
  port: 9060

spring:
  application:
    name: spring-cloud-config-server

  ### spring cloud config 配置
  cloud:
    config:
      server:
        git:
          # 这个就是你放配置文件的git仓库地址
          uri: https://github.com/xuzhaocai/spring-cloud-config-study-repo.git
          # git 用户
          username: xxxx
          # git 密码
          password: xxxx
          #这个就是你仓库名字
          search-paths:
            - spring-cloud-config-study-repo
      label: master

### 配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
    fetch-registry: true
    register-with-eureka: true
  instance:
    prefer-ip-address: true   # 使用ip注册
    #自定义实例显示格式,添加版本号
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@

# springboot 暴露端点健康
management:
  endpoints:
    web:
      exposure:
        exclude: "*"

# 暴露健康细节
  endpoint:
    health:
      show-details: always
2.1.4 主启动类

在主启动类上面添加 服务注册与发现注解与 config server 注解表示开启这两个功能
在这里插入图片描述

2.1.5 启动测试

首先要启动下Eureka Server 集群,然后再启动这个config server项目
在浏览器或者是postman 请求地址:http://127.0.0.1:9060/spring-cloud-user-service-consumer-dev.yml
就是这个服务地址端口+ 配置文件的名字
可以得到你请求配置文件里面的信息就ok了
在这里插入图片描述

2.2 用户服务

这里这个用户服务 就是一个可以拉取配置信息,然后能够可视化这些信息就可以了。
我这里是直接拿着有的服务进行改造的。

2.2.1 pom

需要在pom 文件中添加config client的依赖

<!--spring cloud config 客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.2.2 新建配置文件

新建配置文件bootstrap.yml,然后将关于配置中心的信息扔进去
因为bootstrap.yml 配置文件是系统级别的,然后优先级高于application.yml,应用启动时会检查这个配置文件,在这个 配置文件中指定配置中心的服务地址,会自动拉取所有应用配置并且启用。
这里你也可以将原来的application.xml 改成bootstrap.yml 。

spring:
  cloud:
    config:
      # 配置文件的名字
      name: spring-cloud-user-service-consumer
      # 配置文件后缀,主要是用来区分环境版本
      profile: dev
      # 分支
      label: master
      # spring cloud  config server的地址 可以配置多个
      uri: ["http://127.0.0.1:9060"]
2.2.3 写一个测试的controller

我这里写了一个ConfigPullController 然后用来将配置中心里面的信息打印出来。

@RestController
@RequestMapping("/config")
public class ConfigPullController {
    @Value("${mysql.jdbc-url}")
    private String jdbcUrl;
    @Value("${mysql.username}")
    private String username;
    @Value("${mysql.password}")
    private String password;
    @RequestMapping("/pullMysqlInof")
    public String pullMysqlInfo(){
        return "mysql-connect-info:[\"jdbc-url\":"+jdbcUrl+",\"username\":"+username+",\"password\":+"+password+"]";
    }
}

2.3 启动服务测试

启动用户服务之前保证Eureka server 集群启动着,config server 启动着,然后在启动用户服务
在浏览器或者postman 请求http://127.0.0.1:8080/config/pullMysqlInof
在这里插入图片描述
可以看到我们将这个配置中心里面的配置拿到了

2.4 手动刷新

2.4.1 修改

这里手动刷新是,我们修改git里面的配置文件,然后config server 是能够自动获取到最新的,我们客户端,在这里也就是用户服务需要手动请求刷新才能获取到最新的服务。
这里用户服务需要添加 springboot actuator 依赖,这里我父工程是添加了的。
然后配置暴露端点
暴露全部:

# 配置springboot中暴露健康检查等断点接口
management:
  endpoints:
    web:
      exposure:
        include: "*"
    # 暴露健康接口的细节
  endpoint:
    health:
      show-details: always

当然也可以只暴露/refresh

management:
  endpoints:
    web:
      exposure:
        include: refresh

最后在这个使用到这些配置的类上面添加@RefreshScope 注解
在这里插入图片描述
重启用户服务

2.4.2 测试

我们修改一下这个git里面的配置,我这里修改了一下密码
在这里插入图片描述
我们这里请求一下用户获取配置的接口,发现还是原来的配置信息:
在这里插入图片描述
接着请求一下刷新配置接口:http://127.0.0.1:8080/actuator/refresh
在这里插入图片描述

我们再来请求一下用户获取配置的接口,我们可以看到,password 这个配置变了
在这里插入图片描述
这种手动更新虽然不用我们重启服务,不用停机,但是还是比较恶心人的,你更新了git里面的配置信息,需要对每个服务手动请求下/refresh 才能够刷新,对于服务少的项目可能会接受,但是对于服务量巨大的项目带来的却是工作量。下面我们会介绍Config配置中心 结合Spring Cloud Bus消息总线的方式来实现自动刷新。

2.5 自动刷新

在这里我们将配合Spring Cloud Bus 消息总线实现一次通知,处处刷新的效果。

2.5.1 关于消息总线

关于Spring Cloud Bus 消息总线 我们可以这样理解,消息总线像是村里的大喇叭,村委在喊话的时候这个大喇叭覆盖下的村民全都能听到,但是至于村民怎么做就是另一回事了,这个我们不讨论,消息总线就是这个大喇叭,而村民就是各个服务,一旦这个消息总线下发通知,这些订阅了消息总线中某个主题的服务就会收到通知,从而作出某些改变。
在这里插入图片描述

2.5.2 消息总线自动刷新流程说明

我们这里的自动更新也是需要手动通知一次,然后订阅这个消息总线的服务都会收到通知而进行更新操作。
这个流程信息如下图:
在这里插入图片描述
我们这些业务服务启动的时候,首先去配置中心server拉取配置信息,并向bus订阅,然后git仓库里面的配置文件发生改变的时候,通过手动触发更新,消息总线就会向所有订阅的业务服务发起通知,通知他们配置文件改了,那些带有@RefreshScope注解的类就会更新配置的值。

2.5.3 改造

这里配置中心server 也就是spring-cloud-config-server这个服务,首先我们要先选择mq消息中间件产品,这里将使用rabbitmq,对于rabbitmq不会安装的同学可以参考下面这篇文章安装:《RabbitMQ安装》
***下面修改操作不管是config server 还是 client端都需要做 ***

  1. pom中添加springcloud bus支持rabbitmq的依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 添加rabbitmq的配置
spring:
  rabbitmq:
  	# rabbitmq 的ip
    host: 127.0.0.1
    # 端口
    port: 5672
    # 用户名与密码 默认是guest
    username: guest
    password: guest
  1. 检查 服务健康检查端口暴露 配置
# 配置springboot中暴露健康检查等断点接口
management:
  endpoints:
    web:
      exposure:
      	# 这里你可以暴露全部,也可以只暴露 bus-refresh
        include: "*"
    # 暴露健康接口的细节
  endpoint:
    health:
      show-details: always
2.5.4 测试

重启config server 与用户服务,这里用户服务我们起两个分别是8080 与8081
我们先来看看启动后的配置:
在这里插入图片描述
用户服务拿到的配置信息:
在这里插入图片描述
这时候,我们修改git仓库里面的配置信息:
在这里插入图片描述
对任意一个用户服务(配置中心client端)发起刷新请求(post请求):http://127.0.0.1:8080/actuator/bus-refresh/
在这里插入图片描述
我们再来看看8080 与8081 的配置信息:
在这里插入图片描述
在这里插入图片描述
可以看出来,配置信息都发生了变更。
当然我们可以指定某个服务进行刷新动作,来实现定向更新,这时候我们只需要在刷新的链接后面添加服务名+端口
例如:http://127.0.0.1:8080/actuator/bus-refresh/spring-cloud-user-service-consumer:8080

猜你喜欢

转载自blog.csdn.net/yuanshangshenghuo/article/details/107353311