spring cloud Greenwich 学习笔记(四)springcloud config 分布式配置中心

文章目录

  • 概述
  • 配置中心服务端
  • 配置中心客户端
  • 配置刷新-手动刷新
  • 集成eureka实现高可用集群
  • 配置刷新-全自动刷新

springcloud系列学习笔记目录参见博主专栏 spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。文章所有代码都已上传GitHub:https://github.com/liubenlong/springcloudGreenwichDemo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;

概述

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持,使用Config Server,您可以在所有环境中管理应用程序的外部属性。
  目前也有一些开源的配置中心,比如百度的disconf,阿里的diamand。本文介绍springcloud官方的配置中心springcloud config。

spring cloud config 配置变化通知:依赖git每次push后,触发webhook回调,最终触发spring cloud bus(消息总线),然后由消息总线通知相关的应用。

spring cloud config包括两部分:

  1. spring cloud config server 作为配置中心的服务端:
  • 拉取配置时更新git仓库副本,保证是最新结果
  • 支持数据结构丰富,yml, json, properties 等
  • 配合 eureke 可实现服务发现,配合 cloud bus 可实现配置推送更新
  • 配置存储基于 git 仓库,可进行版本管理
  • 简单可靠,有丰富的配套方案
  1. Spring Cloud Config Client 客户端:
  • Spring Boot项目不需要改动任何代码,加入一个启动配置文件指明使用ConfigServer上哪个配置文件即可

配置中心服务端

第一步,引入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-config-serverartifactId>
dependency>

第二步,在application.yml中添加配置:

server:
  port: 8087

# 服务与服务之间相互调用一般都是根据这个name 。
spring:
  application:
    name: springcloud-config-server
  cloud:
    config:
      server:
        git:
          #git仓库的地址
          uri: https://github.com/liubenlong/springcloudGreenwichDemo.git
          # 配置仓库路径,这里是文件夹搜索路径
          searchPaths: mySpringCloudConfig
          # git仓库的用户名和密码,如果是public仓库,可以不写
          username: ***
          password: ***
          # 指定分支,不指定默认是master
          default-label: master

在远程git仓库https://github.com/liubenlong/springcloudGreenwichDemo.git中存在一个文件夹mySpringCloudConfig,在该文件夹中编写了两个配置文件
spring cloud Greenwich 学习笔记(四)springcloud config 分布式配置中心_第1张图片
http请求地址和资源文件映射如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

springcloud-config-client-dev.properties文件内容name=zhangsan;
springcloud-config-client-prod.properties文件内容name=lisi;

启动类中需要启用springcloud config:

@SpringBootApplication
@EnableConfigServer //启用spring cloud config 服务
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

启动服务,在浏览器中访问http://127.0.0.1:8087/springcloud-config-client-dev.properties会输出name: zhangsan
访问http://127.0.0.1:8087/springcloud-config-client/dev输出:
spring cloud Greenwich 学习笔记(四)springcloud config 分布式配置中心_第2张图片
springcloud Config server的原理是下载到本地缓存,读者可以断网测试一下。控制台的输出也可以验证这一点:

o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/HZLIUB~1/AppData/Local/Temp/config-repo-14199679004896969032/mySpringCloudConfig/springcloud-config-client-dev.properties

配置中心客户端

首先引入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-config-clientartifactId>
dependency>

在application.yml中配置基本信息

server:
  port: 8088

# 服务与服务之间相互调用一般都是根据这个name 。
spring:
  application:
    name: springcloud-config-client

由于很多配置是需要在服务启动前加载的,比如数据库连接。所以我们要使用bootstrap.yml这个配置,bootstrap配置的优先级高于application,会在服务启动前加载。bootstrap.yml内容如下

#这里使用的是 bootstrap.yml 这个配置,bootstrap的优先级高于application,很多配置都是要在服务启动前加载,
#所以使用bootstrap
spring:
  cloud:
    config:
      #启动什么环境下的配置
      profile: dev
      # 配置服务的URL
      uri: http://127.0.0.1:8087/

启动类是最基本的

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

编写一个测试类,通过属性注入的方式来加载配置:

@RestController
public class HelloController {
    //属性注入
    @Value("${name}")
    String name;

    @RequestMapping(value = "/hi")
    public String hi(){
        return "hi "+name;
    }
}

启动服务,访问http://127.0.0.1:8088/hi,输出hi zhangsan;
将bootstrap.yml文件中的spring.cloud.config.profile改为prod,访问http://127.0.0.1:8088/hi,输出hi lisi

配置刷新-手动刷新

本节内容了解即可,太麻烦,线上集群肯定不会这样使用。

服务端不需要改动,客户端springcloud-config-client要进行以下修改:
引入actuator


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-actuatorartifactId>
dependency>

application.yml中添加actuator监控相关的配置:

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info
  endpoint:
    health:
      show-details: always
  server: # 指定actuator端口。如果不指定则与系统服务端口一致。建议修改
    port: 8888

这里需要注意:1.X 版本的springboot 配置项management.security.enabled已经作废了。2.X 版本 需要使用上述配置。

  • management.server.port用于指定actuator端口。如果不指定则与系统服务端口一致,建议修改。
  • management.endpoints.web.base-path用于指定actuator的URL路径。1.X默认是/,2.X默认是/actuator
  • management.endpoints.web.exposure.include指定监控项。默认开启了health、info。我们这里加入了refresh
  • management.endpoint.health.show-details用于展示监控项详细信息,默认不展示

HelloController上添加注解@RefreshScope, 用于自动刷新配置。
postman访问http://127.0.0.1:8088/hi,结果是hi zhangsan。此时我们修改springcloud-config-client-dev.properties内容为name=zhangsan55,发送post请求http://127.0.0.1:8888/actuator/refresh手动刷新配置:
spring cloud Greenwich 学习笔记(四)springcloud config 分布式配置中心_第3张图片
再次请求http://127.0.0.1:8088/hi,输出hi zhangsan55。手动更新成功。

集成eureka实现高可用集群

首先,借用spring cloud Greenwich 学习笔记(一)spring cloud eureka ribbon 服务注册与发现介绍的eureka server springcloud-config-server
第二,改造springcloud-config-server项目,集成eureka
pom文件中引入依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

application.yml中配置eureka地址:

eureka:
  client:
    serviceUrl:
      #      指定服务注册中心的地址
      defaultZone: http://localhost:8080/eureka/

# 心跳检测检测与续约时间
# 【测试】时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
  instance:
    lease-renewal-interval-in-seconds: 1   # 每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
    lease-expiration-duration-in-seconds: 2 #告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。

启动类中添加注解@EnableEurekaClient

第三,改造springcloud-config-client项目,集成eureka
引入pom

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

修改bootstrap.yml属性配置,注意是bootstrap.yml,主要添加spring.cloud.config.discoveryeureka相关配置:

#这里使用的是 bootstrap.yml 这个配置,bootstrap的优先级高于application,很多配置都是要在服务启动前加载,
#所以使用bootstrap
spring:
  cloud:
    config:
      #启动什么环境下的配置
      profile: dev
      label: master

      # 配置服务的URL【如果使用eureka,则不再写URL,使用下面的discovery的形式】
#      uri: http://127.0.0.1:8087/
      discovery:
        enabled: true
        service-id: springcloud-config-server # 指定配置中心的服务名称
eureka:
  client:
    serviceUrl:
      #      指定服务注册中心的地址
      defaultZone: http://localhost:8080/eureka/

注意,上面已经不再写IP端口了,discovery.service-id写的是服务名

注:如果在启动客户端服务时,使用的是8888()这个端口,则将management.server.port去掉即可。具体原因待分析。

其他不变,依次启动springcloud-eureka-server, 2个springcloud-config-server(一个端口8087,一个8089), springcloud-config-client
在启动springcloud-config-client这个服务时,通过控制台输出,可以看到eureka生效了,因为我们并没有明确指定访问哪个端口,而是指定的服务名称。
在这里插入图片描述
访问http://127.0.0.1:8088/hi,返回结果hi zhangsan55

测试eureka服务:上面启动了两个端口,读者可以自行测试一下关闭其中一个,稍等片刻,等待http://127.0.0.1:8080/eureka控制台中已经移除时效服务以后,重新启动springcloud-config-client服务,观察控制台输出,会发现服务可用,端口使用的是可用的那个服务。(笔者已经测试成功,这里请读者亲自测试吧)

注:这里需要对eureka进行配置,暂时将自我保护模式关闭。具体请参考 spring cloud Greenwich 学习笔记(一)spring cloud eureka ribbon 服务注册与发现 中的自我保护机制一节。

配置刷新-全自动刷新

请参考笔者文章 spring cloud Greenwich 学习笔记(五)spring cloudconfig + spring cloud bus实现全自动刷新集群配置

springcloud系列学习笔记目录参见博主专栏 spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。文章所有代码都已上传GitHub:https://github.com/liubenlong/springcloudGreenwichDemo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;

你可能感兴趣的:(spring,cloud,spring,boot,2.X/spring,cloud,Greenwich)