配置中心
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库 中。在spring cloud config 组件中,分两个角色,一是config server,二是config client

配置管理场景
- 属性分发
- 动态开关- 金丝雀 降级 蓝绿部署
 
配置中心应该提供的功能
- 服务端与客户端支持
- 集中管理各环境的配置文件
- 修改之后可以快速生效
- 版本管理
- 并发查询
- 多语言支持
配置中心高可用
启动多个配置中心实例
- 对配置中心进行服务治理
- 配置中心本地缓存配置项
分布式配置中心
将配置文件信息注册到配置中心平台上,可以使用分布式配置中心实时更新配置文件信息,统一管理配置文件,不需要重新打包发布。
资源隔离
- 配置与业务逻辑隔离
- 服务与环境间的配置隔离
SpringCloudConfig
服务端
- 依赖
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 配置
server:
  port: 8003
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/0xcaffebabe/config/     # 配置git仓库的地址
          search-paths: config1                               # git仓库地址下的相对地址,可以配置多个,用,分割。
@EnableConfigServer
- 仓库中的文件  
这时候访问 server/config/dev即可获取配置信息
客户端
- 依赖
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 配置 - application.properties - server.port=8004 spring.application.name=config-client
- bootstrap.properties - spring.cloud.config.name=config spring.cloud.config.profile=dev spring.cloud.config.uri=http://localhost:8003/ spring.cloud.config.label=master
 
- 获取 
@Value("${config.hello}")
  private String port;
配置刷新
- 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 开启更新机制
@RestController
// 一定要加这个
@RefreshScope
public class MyController {
    @Value("${config.hello}")
    private String port;
    @RequestMapping("/hello")
    public String hello(){
        return port;
    }
}
- 配置
management.endpoints.web.exposure.include=refresh,health,info
当配置文件发生更新时,调用客户端接口刷新配置
curl -X POST http://localhost:8004/actuator/refresh
发起对该地址的请求可让客户端去向配置中心获取最新配置并应用到相关成员变量上
配置中心服务化
- 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/   # 注册中心eureka地址
@EnableDiscoveryClient
客户端改造
- 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 删除 spring.cloud.config.uri 
- 添加 - spring.cloud.config.discovery.enabled
- spring.cloud.config.discovery.serviceId
- eureka.client.serviceUrl.defaultZone
- @EnableDiscoveryClient
 
Apollo
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景
- 安装 
- 创建数据库,导入sql文件 
- 配置demo.sh数据库连接信息 
- 执行 - demo.sh start
Spring boot整合
修改/opt/settings/server.properties(Mac/Linux)或C:\opt\settings\server.properties(Windows)文件,设置env
- 引入依赖
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.5.1</version>
</dependency>
- 配置注册中心
server.port=8081
spring.application.name=service
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka
- apollo.properties
local.meta=http://127.0.0.1:8080
dev.meta=http://127.0.0.1:8080
fat.meta=${fat_meta}
uat.meta=${uat_meta}
lpt.meta=${lpt_meta}
pro.meta=${pro_meta}
- META-INF/app.properties
app.id=app_id
Nacos
<dependency>       
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
# bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.name=provider-config
# 指定配置文件后缀名
spring.cloud.nacos.config.file-extension=properties

默认格式:${config-name}-${profile}.#{file-extension}
- 使用
applicationContext.getEnvironment().getProperty("app.name")
自定义namespace
不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离
通过指定 ${spring.cloud.nacos.config.namespace} 配置来实现
自定义Group
${spring.cloud.nacos.config.group}
自定义data-id
spring.cloud.nacos.config.extension-configs[0].data-id=xxx
# 配置支持刷新
spring.cloud.nacos.config.extension-configs[0].refresh=true
配置的优先级
- 高:通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
- 中:通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
- 低:通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置