SpringCloud_learn06_Config分布式配置中心

    Config分布式配置中心是什么
    Config服务端与Github通信
    Config客户端通过Config服务端获得Github上的配置

一、Config分布式配置中心是什么
1.分布式系统面临的--配置问题
    微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对很小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己都带着一个application.yaml,上百个配置文件管理将十分复杂。
2.是什么,怎么玩
      
    2.1 是什么
    SpringCloud Config 为微服务架构中的微服务提供集中的外部配置支持,配置服务器为各个不通微服务应用的所有环境提供了一个中心化的外部配置。
    2.2 怎么玩
    SpringCloud Config分为 服务端和客户端两部分
    服务端也称分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的位置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用GIT来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理访问配置内容。
3.核心要点
    3.1 集中管理配置文件
    3.2 不同环境不同配置,动态化的配置更新,分环境部署比如 dev/test/prod/beta/release
    3.3 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务回向配置中心统一拉取自己的配置信息
    3.4 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
    3.5 将配置信息以rest接口的形式暴露

4.与github整合配置
    由于SpringCloud Config默认使用Git来存储文件(也有其他的形式,比如支持SVN和本地文件),但是推荐使用GIT,而且使用的是HTTP/HTTPS访问的形式
二、Config服务端与Github通信
1.在Github上新建cloud-config的新Repository
    
2.填写仓库信息
    
3.在Github上获取到新Repository的SSH协议地址 https://github.com/Juwenzhe/cloud-config.git
4.在本地一个目录上新建git仓库并clone
    4.1 D:\jee-2019-12\mycloudconfig
    4.2 克隆远程配置
    
5.新建配置文件application.yaml文件
    5.1 新建配置文件
    
    5.2文件内容:

spring:
  profiles:
    active:
    - dev
---
spring:
  #开发环境配置
  profiles: dev
  application:
    name: cloud-config-dev  
---
spring:
  #测试环境配置
  profiles: test
  application:
    name: cloud-config-test
# 注意保存为 UNIX UTF-8 格式

6.推送yaml文件到github上
    6.1 操作步骤
    
    6.2 结果
    
    6.3 获取远程仓库地址
    
7.新建Module模块cloud-config-3344,即Cloud的配置中心模块
    7.1 pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
   <groupId>com.xx.discovery</groupId>
   <artifactId>springcloud-nepxion-discovery</artifactId>
   <version>1.0.1</version>
  </parent>
  <artifactId>cloud-config-3344</artifactId>
  <dependencies>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-config-server</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <exclusions>
       <exclusion>
         <artifactId>spring-boot-starter-logging</artifactId>
        <groupId>org.springframework.boot</groupId>
       </exclusion>
     </exclusions>
   </dependency>
   <!-- 日志开始 -->
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-log4j2</artifactId>
   </dependency>
   <dependency>
     <groupId>com.lmax</groupId>
     <artifactId>disruptor</artifactId>
     <version>3.4.1</version>
   </dependency>
   <!-- 日志结束 -->
   <!-- 修改后立即生效,热部署 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>
  </dependencies>
</project>

    7.2 application.yaml

server:
  port: 3344
spring:
  application:
    name: cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Juwenzhe/cloud-config.git

    7.3 主启动类

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

8.测试通过config微服务获取github仓库内容
    8.1 启动微服务
    8.2 读取配置:
    http://localhost:3344/application-test.yaml
    http://localhost:3344/application-dev.yaml
    http://localhost:3344/application-xxxx.yaml(无相关配置)

    8.3 读取配置规则(label是分支,默认是master主干)
    
三、Config客户端通过Config服务端获得Github上的配置
“多环境-多配置文件-多级目录配置实践记录”
1.在本地新建cloud-provider配置文件
    1.1 提取到配置中心的cloud-provider配置文件
    
    p1-application.yaml

spring:
  profiles:
    active:
    - dev
---
server:
  port: 8001
  
spring:
  profiles: dev
  application:
   name: cloud-provider
  cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
---
server:
  port: 8011
     
spring:
  profiles: test
  application:
   name: cloud-provider
  cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848

    mybatis/p1-db.properties

druid.driver-class-name=org.gjt.mm.mysql.Driver
druid.url=jdbc:mysql://localhost:33306/cloudDB01
druid.username=root
druid.password=123456
druid.minIdle=10
druid.testWhileIdle=false
druid.initialSize=10
druid.maxWait=200
druid.maxActive=10

    1.2 提交到github
    
    
2.配置中心server的application.yaml

server:
  port: 3344
  
spring:
  application:
    name: cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Juwenzhe/cloud-config.git
          search-paths:
          # 扫描远程仓库的根目录及子目录的格式
          - cloud-provider-1
          - cloud-provider-1/**

3.cloud-provider项目改造
    3.1 添加依赖

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

    3.2 修改配置文件(修改application.yaml,新增bootstrap.yaml)
    
    3.3 application.yaml内容只保留一些公共不变项

mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
  type-aliases-package: com.cslc.discovery.entities          # 所有Entity别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

    3.4 bootstrap.yaml内容

spring:
  cloud:
    config:
      # 取配置中心的配置名称,不带后缀yaml和properties
      name: p1-application, p1-db
      profile: dev
      label: master
      uri: http://localhost:3344

    # 说明1:bootstarp.yaml是系统级的,优先级更高,application.yaml是用户级的资源配置项
    # 原理:SpringCloud会创建一个Bootstrap Context,作为Spring应用的Application Context的父上下文,初始化的时候,Bootstrap Context负责从外部资源池中加载配置属性并解析配置,然后读到的配置文件与application context的共同生效。一般地,两个上下文没有重复配置项
     
    # 说明2:加载多项配置文件,逗号隔开且不带后缀

    3.5 datasource数据源java文件中
    @PropertySource(value = "classpath:mybatis/p1-db.properties")

    3.6 datasource.properties改名为:p1-db.properties
    # 机制说明:微服务根据bootstrap.yaml文件中的配置文件名到配置中心找配置,而配置中心加载的远程配置中心目录里包含了所需名称的配置文件,从而对接。
4.测试:启动配置中心、配置client项目
    4.1 启动配置中心后:
    
    
    4.2 启动改造后的cloud-provider项目
    
    ☆ 对于要提交到同一个配置中心的文件,名称重复的将会被后来的配置文件覆盖!所以,不同的项目要么是用不同的配置中心(一个中心:一个微服务集群);要么使用同一个配置中心,但是不同的项目的配置文件不能重名,最好带上微服务名称,如:P1连数据库的文件叫p1-db.properties,P2连数据库的文件叫p2-db.properties.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐