SpringCloud Config 配置中心

快速入门案例

准备工作

Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置, 默认使用Git存储配置文件内容,也可以使用SVN存储,或者是本地文件存储,这里使用码云
注册码云、创建仓库、把微服务配置文件以如下命名规则上传到仓库中

命名规则

  • {application}-{profile}.yml
  • {application}-{profile}.properties
application为应用名称 profile指的开发环境(用于区分开发环境,测试环境、生产环境等)

服务端搭建

创建 shop-config-server项目

引入依赖

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

配置启动类

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

添加配置文件

server:
  port: 10000
spring:
  application:
    name: shop-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/laomao1024/config-repo.git

接下来就可以使用 http://127.0.0.1:10000/product-dev.yml 进行访问配置文件

客户端搭建

引入依赖

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

删除配置文件

删除 application.yml 配置文件,springboot的应用配置文件,需要通过Config-server获取。

添加配置文件

添加 bootstrap.yml 配置文件 使用加载级别更高的 bootstrap.yml 文件进行配置。启动应用时会检查此配置文件,在此文件中指定 配置中心的服务地址。会自动的拉取所有应用配置并启用

spring:
  cloud:
    config:
      name: product
      profile: dev
      label: master
      uri: http://localhost:10000

手动刷新

我们已经在客户端取到了配置中心的值,但当我们修改GitHub上面的值时,服务端(Config Server) 能实时获取最新的值,但客户端(Config Client)读的是缓存,无法实时获取最新值。SpringCloud已 经为我们解决了这个问题,那就是客户端使用post去触发refresh,获取最新数据,需要依赖spring-boot-starter-actuator

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在对应的controller类上加上 @RefreshScope 注解,并且在配置文件中开放端点

#开放刷新请求路径断点
management:
  endpoints:
    web:
      exposure:
        include: refresh

可以使用postman访问http://localhost:9001/actuator/refresh,使用post协议提交,然后查看数据是否更新

配置中心的高可用

在上面代码客户端都是直接调用配置中心的server端来获取配置文件信息。这样就存在了一个问 题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由, server端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理的理念。 springcloud提供了这样的解决方案,我们只需要将server端当做一个服务注册到eureka中,client端去 eureka中去获取配置中心server端的服务既可。

服务端配置

添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

配置文件

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
  instance:
    prefer-ip-address: true #使用ip注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心中注册的服务id

服务端其实很简单就是多了一个eureka注册中心的配置把config-server服务注册到注册中心中去

客户端改造

添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

配置文件

server:
  port: 9002
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  cloud:
    config:
      name: product
      profile: dev
      label: master
      uri: http://localhost:10000
      discovery:
        enabled: true #从注册中心获取配置
        service-id: config-server

高可用

上面server和client端都配置好了 。其实高可用也就完成了,接下来只需要启动多个server端,客户端会通过eureka自动获取可用节点

消息中线BUS

如果我们要更新所有微服务的配置,在不重启的情况下去进行更新,需要用到spring cloud config,但是我们需要给每一个微服务去发送一个post请求,告诉微服务你的配置已经更新,需要及时修改内存中的配置信息,如果微服务有几十个上百个,那还玩个蛋蛋

这时候bus消息总线就能解决问题了,我们只需要在spring cloud config server 端发出 refresh请求,就可以触发所有微服务的更新,如下面架构图所示;

引入依赖

客户端和服务端引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--消息总线依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

服务端配置

server:
  port: 10000

spring:
  application:
    name: shop-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/laomao1024/config-repo.git
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: refresh

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #使用ip注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

客户端配置

spring:
  cloud:
    config:
      name: product
      profile: dev
      label: master
      uri: http://localhost:10000
      discovery:
        enabled: true
        service-id: config-server

另外在我们的git上的product微服务的配置文件中需要添加rabbitmq的配置

tabbitmq:
  host: 127.0.0.1
  port: 5672
  username: guest
  password: guest

重新启动对应的eureka-server , config-server , product-service。配置信息刷新后,只需要向配置 中心发送对应的请求,即可刷新每个客户端的配置

添加新评论

已有 2 条评论

Alibaba nacos 感觉挺好用的~~

南栀 南栀 回复 @蝉時雨
1 0

还没用过,回头空了去看看