Spring Cloud 配置中⼼


在系统架构中,和安全、⽇日志、监控等⾮非功能需求⼀一样,配置管理理也是⼀一种⾮非功能需求。配置中⼼心是整
个微服务基础架构体系中的⼀一个组件,它的功能看上去并不不起眼,⽆无⾮非就是简单配置的管理理和存取,但
它是整个微服务架构中不不可或缺的⼀一环。另外,配置中⼼心如果真得⽤用好了了,它还能推动技术组织持续交
付和DevOps⽂文化转型。

常用配置中心

img

  1. 阿⾥里里巴巴中间件部⻔门很早就⾃自研了了配置中⼼心Diamond,并且是开源的。Diamond对阿⾥里里系统的灵 活稳定性发挥了了⾄至关重要的作⽤用。开源版本的Diamond由于研发时间⽐比较早,使⽤用的技术⽐比较 ⽼老老,功能也不不够完善,⽬目前社区不不热已经不不维护了了。
  2. Facebook内部也有⼀一整套完善的配置管理理体系,其中⼀一个产品叫Gatekeeper,⽬目前没有开源。
  3. Netflix内部有⼤大量量的微服务,它的服务的稳定灵活性也重度依赖于配置中⼼心。Netflix开源了了它的配 置中⼼心的客户端,叫变⾊色⻰龙Archaius,⽐比较可惜的是,Netflix没有开源它的配置中⼼心的服务器器端。
  4. Apollo是携程框架部研发并开源的⼀一款配置中⼼心产品,企业级治理理功能完善,⽬目前社区⽐比较⽕火,在 github上有超过10k星,在国内众多互联⽹网公司有落地案例例。⽬目前ITOA也是采⽤用的Apollo配置中 ⼼心。
  5. 百度之前也开源过⼀一个叫Disconf的配置中⼼心产品,作者是前百度资深⼯工程师廖绮绮。在Apollo没 有出来之前,Disconf在社区是⽐比较⽕火的,但是⾃自从廖琦琦离开百度之后,他好像没有⾜足够精⼒力力投 ⼊入维护这个项⽬目,⽬目前社区活跃度已经⼤大不不如前。
  6. 以及 Spring Cloud Config,和spring cloud⽣生态是天然⽀支持,当然,我个⼈人觉得作为⼀一个⽣生产级 别的配置中⼼心,spring cloud config还是存在⼀一定的缺陷的,⽐比如⼀一个可视化的管理理界⾯面,没有 spring cloud bus等⽀支持,⽆无法做到热发布等等,但是我们还是简单介绍⼀一下spring cloud config。个⼈人推荐⽣生产使⽤用携程Apollo

Spring Cloud Config

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件,默认情况下使用git。

我们还是以之前的service-producer为基础,并且在项目根目录创建一个cloud-conf-repo文件夹用来存放配置,并且准备三个文件

# 开发环境
life-example-producer-dev.properties
# 测试环境
life-example-producer-test.properties
# 生产环境
life-example-producer-pro.properties

文件内容为分别为sharplook.instance=sharplook-[dev/test/pro]

Server 端配置

pom 配置

<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>

属性文件配置

spring.application.name=life-cloud-config
server.port=8899
eureka.instance.prefer-ip-address=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# git仓库地址
spring.cloud.config.server.git.uri=
# git仓库地址下的相对地址 可以配置多个 用,分割。
spring.cloud.config.server.git.search-paths=
# git 仓库用户名
spring.cloud.config.server.git.username=
# git 仓库密码
spring.cloud.config.server.git.password=
# 如果有分支 可以在这里配置分支名称
spring.cloud.config.server.git.default-label=

启动类配置

package com.iogogogo.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * Created by tao.zeng on 2019-03-16.
 */
@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class ConfigApplication {

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

测试

浏览器访问

http://localhost:8899/life-example-producer/dev
http://localhost:8899/life-example-producer/test
http://localhost:8899/life-example-producer/pro

分别会按照我们的配置返回相应的数据,格式如下

// 20190317102625
// http://localhost:8899/life-example-producer/dev

{
  "name": "life-example-producer",
  "profiles": [
    "dev"
  ],
  "label": null,
  "version": "131d288174b48601af4461dfde809913c87b91ca",
  "state": null,
  "propertySources": [
    {
      "name": "https://gitlab.eoitek.net/zengtao/life-cloud-example.git/cloud-conf-repo/life-example-producer-dev.properties",
      "source": {
        "sharplook.instance": "sharplook-dev"
      }
    }
  ]
}

仓库中的配置文件会被转换成web接口,访问可以参照以下的规则:

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

Client配置

client 主要是其他服务怎么去获取config中的配置信息,还是以service-producer为例

pom 配置

<!-- 添加config客户端依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

属性文件配置

application.properties无需修改,新建bootstrap.properties文件,用于配置spring cloud config的服务器信息

# 配置中心地址
spring.cloud.config.uri=http://localhost:8899/
# 使用哪个环境的配置
spring.cloud.config.profile=dev
# 当前服务的名称 和 spring.application.name对应即可
spring.cloud.config.name=${spring.application.name}
# 读取指定分支配置
spring.cloud.config.label=master

上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为config的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。

启动类

  • 无需变更

Controller

为了方便测试,还是使用接口访问形式,新建ConfigApi

package com.iogogogo.producer.api;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by tao.zeng on 2019-03-17.
 */
@RestController
@RequestMapping("/api/config")
public class ConfigApi {

    /**
     * 这里key 就是自定义在配置中心中的key
     */
    @Value("${sharplook.instance}")
    private String instance;

    @GetMapping("/")
    public String config() {
        return instance;
    }
}

测试

启动service-producer服务,访问

http://localhost:8080/api/config/

返回

sharplook-dev
  • 修改spring.cloud.config.profile=pro配置,重启服务后,访问接口,返现返回结果就是我们在config中的配置
  • 修改配置中心的git中的配置,推送到git以后,再次请求服务,就能看到新的变更配置。

小结

  1. 配置中心是微服务基础架构中不可或缺的核心组件,现代微服务架构和云原生环境,对应用配置管理提出了更高的要求。
  2. 配置中心有众多的应用场景,配置中心+功能开关是DevOps最佳实践。用好配置中心,它能帮助技术组织实现持续交付和DevOps文化转型。
  3. Spring Cloud Config相对来说还是达不到生产级别,目前来看携程开源的Apollo配置中心,企业级功能完善,经过大规模生产验证,社区活跃度高,是开源配置中心产品的首选。

文章作者: 阿牛
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 阿牛 !
评论
  目录