Spring Cloud config搭建分布式配置中心

通常情况下,我们将配置文件放在各自的服务中,这样有个缺点,就是每次修改,要重启服务。如今微服务这么流行的趋势下,一个大项目下会有几十甚至上百上千个微服务组成。这时候就需要一个统一配置管理了。Spring Cloud config 就很好的解决了这一问题。

下图是Config实现分布式配置中心简单原理图:

Spring Cloud config搭建分布式配置中心_第1张图片

主要实现需要以下几个步骤:

  1. 创建git仓库。用于存放配置文件。
  2. 安装kafka,zookeeper。用于分布式项目统一刷新。
  3. 创建ConfigServer服务,提供项目统一获取配置的中心服务。可配多个。
  4. 创建ConfigClient服务,作为客户端。
  5. 利用gitlab的webhook功能,每次push操作,发送post请求,通知刷新配置。

一、创建git仓库。

新增目录config-repository,在目录下新建配置文件 application-test.yml 

my-config: auto refresh

二、安装kafka,zookeeper。

非本文重点内容,略过这一步。不做具体讲解。

三、新建项目config-server,以gradle项目为例。

    1.    build.gradle 添加依赖

 compile "org.springframework.cloud:spring-cloud-config-server"
 compile "org.springframework.cloud:spring-cloud-starter-bus-kafka"

    2.    主类ServerApplication引入注解

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

    3.    配置文件

配置将刚刚新建的git仓库地址,和kafka和zk信息

spring:
  application:
    name: config-server
  http:
      encoding: { charset: UTF-8, enable: true, force: true }
  cloud:
    config:
      server:
        git:
          #git地址
          uri: https://gitee.com/starchi/config-demo.git
          #git地址查看目录,可配多个
          search-paths: config-repository
    stream:
      #指定用kafka stream来作为默认消息中间件
      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181,localhost:2182,localhost:2183

    4.    启动config-server,访问 http://localhost:8888/my-config/test/dev

{"name":"my-config","profiles":["test"],"label":"dev","version":"bd9049126a818271dc04bb1da45bd37309f4d06f","state":null,"propertySources":[{"name":"https://gitee.com/starchi/config-demo.git/config-repository/application-test.yml","source":{"my-config":"auto refresh"}}]}

可以看到config-server已经可以从git上读取到配置文件了。可以通过如下表中的方式访问git上的资源:

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

四、新建项目config-client

    1.    build.gradle 添加依赖

 compile 'org.springframework.cloud:spring-cloud-config-client'
 compile 'org.springframework.cloud:spring-cloud-starter-bus-kafka'

    2.    主类ClientApplication引入注解

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

     3.    配置 bootstrap.yml 文件(bootstrap先于application加载)

spring:
  application:
    name: config-client-demo
  http:
    encoding: { charset: UTF-8, enable: true, force: true }
  cloud:
    config:
      name: application
      profile: test,${spring.application.name}
      label: dev
      #config-server地址
      uri: http://localhost:8888
    stream:
      #指定用kafka stream来作为默认消息中间件
      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181,localhost:2182,localhost:2183

这里我们可以将spring.cloud.config.uri 替换成

spring:
  cloud:
    config:
      discovery:
        enabled: true
        serviceId: config-server

表示从eureka注册中心,通过serviceId 拿到配置中心url地址,这就需要我们开启一台eureka服务。将config-server和config-client的application.yml中,都配上如下代码

eureka:
  instance:
    preferIpAddress: true
    leaseRenewalIntervalInSeconds: 10
    #在注册中心展示名称+ip+随机数
    instanceId: ${spring.application.name:${random.value}}:${server.port}
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

    4.新建controller验证

@RestController
@RefreshScope
public class TestController {
    @Value("${my-config}")
    private String name;
    @RequestMapping("/getName")
    public String getAppName() {
        return name;
    }
}

    5.浏览器访问 http://localhost:8081/getName

auto refresh

说明client服务以及可以从config-server拿到值了。

这时我们可以复制启用多台config-client服务。然后修改git仓库,application-test.yml 中my-config 值

auto refresh success

对config-server发送post请求:http://localhost:8888/bus/refresh

注:可以配置gitlab的webhook,每次对config-repository进行push操作,发送post请求。

再次访问多台config-client服务的 http://localhost:****/getName

auto refresh success

读到的配置均已刷新。这时因为引入的bus包,通过kafka+zk通知到config-client,令其重新获取配置。

一个简单的分布式配置中心已经搭建完成。

本文源码下载地址:https://gitee.com/starchi/config-demo.git

\(^o^)/~


  




你可能感兴趣的:(SpringCloud)