配置中心

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

20203620834

配置管理场景

配置中心应该提供的功能

配置中心高可用

启动多个配置中心实例

分布式配置中心

将配置文件信息注册到配置中心平台上,可以使用分布式配置中心实时更新配置文件信息,统一管理配置文件,不需要重新打包发布。

资源隔离

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

Apollo

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景

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

批注 2020-04-02 143345

默认格式:${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

配置的优先级