(08)SpringCloud实战之Config配置

  一、概述

  1、分布式系统面临的问题

  微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理就很复杂了。

  2、Config是什么?

(08)SpringCloud实战之Config配置_第1张图片

   如图,ABC三个微服务的配置文件放到远程Git上,同步到Local Git由Config Server统一管理。

  SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个外部化的中心配置。

  SpringCloud Config分为服务端和客户端两部分。服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器,并为客户端提供获取配置信息,加密/解密信息等访问接口。客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

  3、Config能干什么?

  集中管理配置文件

  不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release

  运行期间动态调整配置,不载需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息

  当配置发生变化时,服务不需要重启,即可感知到配置的变化并应用新的配置

  将配置信息以rest接口的形式暴露

  4、与GitHub整合配置

  由于SpringCloud Config默认使用Git来存储配置文件(也有其他方式,比如支持svn和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式。

  二、SpringCloud Config服务端配置

  1、创建GitHub仓库并且clone到本地

  (1)用自己的GitHub账号在GitHub上新建一个名为microservicecloud-config的新Repository

(08)SpringCloud实战之Config配置_第2张图片  (2) 由上一步获得SSH协议的Git地址:拷贝出来的(https://github.com/wrenlei/microservicecloud-config.git)

(08)SpringCloud实战之Config配置_第3张图片

  (3)在本地硬盘目录上新建git仓库并clone 

  新建目录:D:\20200320\mySpringCloud,右键->点击Git Base Here

(08)SpringCloud实战之Config配置_第4张图片

  执行命令:$ git clone https://github.com/wrenlei/microservicecloud-config.git,从服务器clone项目到本地

(08)SpringCloud实战之Config配置_第5张图片

  结果如图,项目microservicecloud-config已经clone下来了,并且下面有隐藏的.git文件夹,包含了git的信息

(08)SpringCloud实战之Config配置_第6张图片

  2、模拟运维工程师在本地的git目录操作

  (1)在本地D:\20200320\mySpringCloud\microservicecloud-config下新建 application.yml,一定保存为UTF-8格式

spring:
  profiles:
    active:
      - dev:
---
spring:
  profiles: dev #开发环境
  application:
    name: microservicecloud-config-atguigu-dev
---
spring:
  profiles: test #测试环境
  application:
    name: microservicecloud-config-atguigu-test
#请保存为UTF-8格式

  (2)将该文件推送到GitHub上

  在git命令窗口进入到microservicecloud-config目录,执行 cd microservicecloud-config,git status 查看一下发现文件已经发生变化

(08)SpringCloud实战之Config配置_第7张图片

  执行命令:git add .(将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录)

  执行命令:git commit -m "init file"(将缓存区内容添加到本地仓库,引号中是注释)

  执行命令:git push origin master(将本地版本库推送到远程服务器)

(08)SpringCloud实战之Config配置_第8张图片

  执行过程中可能要认证,$ git config --global user.email "[email protected]" 、$ git config --global user.name "xxx",根据提示操作即可。

  刷新GitHub,发现application.yml已经提交到了远程库。

(08)SpringCloud实战之Config配置_第9张图片

  3、新建微服务 microservicecloud-config-3344 

  pom.xml


  4.0.0
  
    com.atguigu.springcloud
    microservicecloud
    0.0.1-SNAPSHOT
  
  microservicecloud-config-3344
  
  
  
     org.springframework.cloud
     spring-cloud-config-server
   
   
   
   
   
     com.atguigu.springcloud
     microservicecloud-api
     ${project.version}
   
   
   
     org.springframework.boot
     spring-boot-starter-web
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-eureka
   
   
     org.springframework.cloud
     spring-cloud-starter-ribbon
   
   
     org.springframework.cloud
     spring-cloud-starter-config
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-feign
   
   
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix-dashboard
    
   
    
   
     org.springframework
     springloaded
   
   
     org.springframework.boot
     spring-boot-devtools
   
  

  application.yml

server:
  port: 3344

spring:
  application:
    name: microservicecloud-config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/wrenlei/microservicecloud-config.git #GitHub上面的git仓库名字

  创建主启动类 Config_3344_StartSpringCloudApp.java

package com.atguigu.springcloud;

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

@SpringBootApplication
@EnableConfigServer
public class Config_3344_StartSpringCloudApp {

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

  修改hosts文件,添加映射:127.0.0.1 config-3344.com

  4、测试通过Config微服务是否可以从GitHub上获取配置信息

  (1)启动微服务 microservicecloud-config-3344,并贴出GitHub上的配置,方便进行对比

(08)SpringCloud实战之Config配置_第10张图片

  输入:http://config-3344.com:3344/application-dev.yml 测试可以正确读取GitHub上信息

(08)SpringCloud实战之Config配置_第11张图片

  输入:http://config-3344.com:3344/application-test.yml 测试可以正确读取GitHub上信息

(08)SpringCloud实战之Config配置_第12张图片

  输入:http://config-3344.com:3344/application-1234.yml(不存在的配置),只能读到GitHub上配置的头文件

(08)SpringCloud实战之Config配置_第13张图片

  成功实现了用SpringCloud Config通过GitHub获取配置信息。

  5、配置读取规则

  (1)/{application} -{profile}.yml

  (2)/{application} /{profile}[/{label}]

  举例:http://config-3344.com:3344/application/dev

  举例:http://config-3344.com:3344/application/test

  举例:http://config-3344.com:3344/application/dev/master

  举例:http://config-3344.com:3344/application/test/master

  (3)/{label}/{application}-{profile}.yml

  举例:http://config-3344.com:3344/master/application-dev.yml

  举例:http://config-3344.com:3344/master/application-test.yml

  (4)/{application} -{profile}.properties

  (5)/{label}/{application}-{profile}.properties

  三、SpringCloud Config客户端配置

  1、在D:\20200320\mySpringCloud\microservicecloud-config下新建microservicecloud-config-client.yml,保存为utf-8

spring:
  profiles:
    active:
      - dev:
---
server:
  port: 8201
spring:
  profiles: dev #开发环境
  application:
    name: microservicecloud-config-client
eureka:
  client:
    service-url:
      defaultZone: http://eureka-dev.com:7001/eureka/
---
server:
  port: 8202
spring:
  profiles: test #测试环境
  application:
    name: microservicecloud-config-client
eureka:
  client:
    service-url:
      defaultZone: http://eureka-test.com:7001/eureka/

  2、将上一步提交到GitHub中

(08)SpringCloud实战之Config配置_第14张图片

(08)SpringCloud实战之Config配置_第15张图片

(08)SpringCloud实战之Config配置_第16张图片  3、 新建microservicecloud-config-client-3355

  pom.xml


  4.0.0
  
    com.atguigu.springcloud
    microservicecloud
    0.0.1-SNAPSHOT
  
  microservicecloud-config-client-3355
  
  
  
     org.springframework.cloud
     spring-cloud-starter-config
   
   
     org.springframework.boot
     spring-boot-starter-web
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-eureka
   
   
     org.springframework.cloud
     spring-cloud-starter-ribbon
   
   
     org.springframework.cloud
     spring-cloud-starter-config
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-feign
   
   
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix-dashboard
    
   
    
   
     org.springframework
     springloaded
   
   
     org.springframework.boot
     spring-boot-devtools
   
   
  

  bootstrap.yml

spring:
  cloud:
    config:
      name: microservicecloud-config-client #需要从GitHub上读取的资源名称,注意没有yml后缀名
      profile: dev #本次访问的配置项
      label: master
      uri: http://config-3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址

  application.yml

spring:
  application:
    name: microservicecloud-config-client

  window下增加hosts映射:C:\Windows\System32\drivers\etc\hosts:127.0.0.1 client-config.com

  新建ConfigClientRest.java类,验证是否能从GitHub上读取配置

package com.atguigu.springcloud.rest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class ConfigClientRest { @Value("${spring.application.name}") private String applicationName; @Value("${eureka.client.service-url.defaultZone}") private String eurekaServers; @Value("${server.port}") private String port; @RequestMapping("/config") public String getConfig() { String str = "applicationName:"+applicationName+"\t eurekaServers:"+eurekaServers+"\t port:"+port; System.out.println("*********str:"+str); return str; } }

  新建主启动类 ConfigClient_3355_StartSpringCloudApp.java

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigClient_3355_StartSpringCloudApp {

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

  4、测试,启动Config配置中心3344微服务和客户端配置3355微服务

  (1)自测:http://config-3344.com:3344/application-dev.yml,访问成功

(08)SpringCloud实战之Config配置_第17张图片

 (2)bootstrap.yml里面的profile值是什么,决定从github上读取什么

  bootstrap.yml里面的profile值是dev,则读取dev的配置,默认在github上的端口号是8201:http://client-config.com:8201/config

  bootstrap.yml里面的profile值是test,则读取test的配置,test默认在github上的端口号是8202:http://client-config.com:8202/config

  四、配置实战

  通过上面的演示,Config服务端配置完成,且测试通过,我们可以和Config+GitHub进行配置修改并获得内容。此时我们做一个eureka服务+一个Dept访问的微服务,将两个微服务的配置统一由GitHub获取 实现统一配置分布式管理,完成多环境的变更。

  1、Git配置文件本地配置

  (1)在D:\20200320\mySpringCloud\microservicecloud-config路径下新建microservicecloud-config-eureka-client.yml,保存为utf-8

spring:
  profiles:
    active:
      - dev:
---
server:
  port: 7001 #注册中心占用7001端口,冒号后面必须要有空格

spring:
  profiles: dev #开发环境
  application:
    name: microservicecloud-config-eureka-client

eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: false    #false表示不向注册中心注册自己。
    fetch-registry: false    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/
---
server:
  port: 7001 #注册中心占用7001端口,冒号后面必须要有空格

spring:
  profiles: test #测试环境
  application:
    name: microservicecloud-config-eureka-client

eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: false    #false表示不向注册中心注册自己。
    fetch-registry: false    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

  (2)在D:\20200320\mySpringCloud\microservicecloud-config路径下新建microservicecloud-config-dept-client.yml,保存为utf-8

spring:
  profiles:
    active:
      - dev:
---
server:
  port: 8001

spring:
  profiles: dev #开发环境
  application:
    name: microservicecloud-config-dept-client
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/cloudDB01              # 数据库名称
    username: root
    password: 123456
    dbcp2:
      min-idle: 5                                           # 数据库连接池的最小维持连接数
      initial-size: 5                                       # 初始化连接数
      max-total: 5                                          # 最大连接数
      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

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

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true     #访问路径可以显示IP地址

info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

---
server:
  port: 8001

spring:
  profiles: test #测试环境
  application:
    name: microservicecloud-config-dept-client
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/cloudDB02              # 数据库名称
    username: root
    password: 123456
    dbcp2:
      min-idle: 5                                           # 数据库连接池的最小维持连接数
      initial-size: 5                                       # 初始化连接数
      max-total: 5                                          # 最大连接数
      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

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

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: microservicecloud-dept8001
    prefer-ip-address: true     #访问路径可以显示IP地址

info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

  将这两个文件上传到GitHub上,参照前面的做法

  2、Config版的eureka服务端

  (1)新建工程 microservicecloud-config-eureka-client-7001

  pom.xml


  4.0.0
  
    com.atguigu.springcloud
    microservicecloud
    0.0.1-SNAPSHOT
  
  microservicecloud-config-eureka-client-7001
  
  
  
     org.springframework.cloud
     spring-cloud-starter-config
   
   
     org.springframework.boot
     spring-boot-starter-web
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-eureka-server
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-eureka
   
   
     org.springframework.cloud
     spring-cloud-starter-ribbon
   
   
     org.springframework.cloud
     spring-cloud-starter-config
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-feign
   
   
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix
   
   
       org.springframework.cloud
       spring-cloud-starter-hystrix-dashboard
    
   
    
   
     org.springframework
     springloaded
   
   
     org.springframework.boot
     spring-boot-devtools
   
   
  

  application.yml

spring:
  application:
    name: microservicecloud-config-eureka-client

  bootstrap.yml

spring:
  cloud:
    config:
      name: microservicecloud-config-eureka-client #需要从GitHub上读取的资源名称,注意没有yml后缀名
      profile: dev
      label: master
      uri: http://config-3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址

  Config_Git_EurekaServerApplicaion.java

package com.atguigu.springcloud;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer    //EurekaServer服务器端启动类,接受其它微服务注册进来
public class Config_Git_EurekaServerApplicaion
{
  public static void main(String[] args)
  {
   SpringApplication.run(Config_Git_EurekaServerApplicaion.class, args);
  }
}

  (2)测试,启动 microservicecloud-config-eureka-client-7001 输入 http://eureka7001.com:7001,出现如下界面说明成功。

(08)SpringCloud实战之Config配置_第18张图片

  3、Config版的dept微服务 

  (1)参考8001,拷贝新建microservicecloud-config-dept-client-8001 

  pom.xml


  4.0.0
  
    com.atguigu.springcloud
    microservicecloud
    0.0.1-SNAPSHOT
  
  microservicecloud-config-dept-client-8001
  
  
   
     org.springframework.cloud
     spring-cloud-starter-config
   
   
     com.atguigu.springcloud
     microservicecloud-api
     ${project.version}
   
   
     junit
     junit
   
   
     mysql
     mysql-connector-java
   
   
     com.alibaba
     druid
   
   
     ch.qos.logback
     logback-core
   
   
     org.mybatis.spring.boot
     mybatis-spring-boot-starter
   
   
     org.springframework.boot
     spring-boot-starter-jetty
   
   
     org.springframework.boot
     spring-boot-starter-web
   
   
     org.springframework.boot
     spring-boot-starter-test
   
   
   
   
     org.springframework.cloud
     spring-cloud-starter-eureka
   
   
     org.springframework.cloud
     spring-cloud-starter-config
   
   
   
       org.springframework.boot
       spring-boot-starter-actuator
   
   
   
   
   
     org.springframework
     springloaded
   
   
     org.springframework.boot
     spring-boot-devtools
   
  
  

  application.yml

spring:
  application:
    name: microservicecloud-config-dept-client

  bootstrap.yml

spring:
  cloud:
    config:
      name: microservicecloud-config-dept-client #需要从GitHub上读取的资源名称,注意没有yml后缀名
      profile: test 
      label: master
      uri: http://config-3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址

  主启动类及其他业务逻辑代码直接copy微服务microservicecloud-provider-dept-8001的,不做改动

  (2)测试,启动3344、microservicecloud-config-eureka-client-7001、microservicecloud-config-dept-client-8001

  此时microservicecloud-provider-dept-8001的bootstrap.yml配置的是test。输入:http://localhost:8001/dept/list,可以看到数据库配置是02

   如果microservicecloud-provider-dept-8001的bootstrap.yml配置的是dev输入:http://localhost:8001/dept/list,可以看到数据库配置是01

   (3)这是直接在项目工程中修改的 bootstrap.yml配置,下面验证一下从GitHub上读取配置

  把D:\20200320\mySpringCloud\microservicecloud-config的microservicecloud-config-dept-client.yml修改dev改为读取3号库,传到GitHub上

  重新启动3344、microservicecloud-config-eureka-client-7001、microservicecloud-config-dept-client-8001

  此时microservicecloud-provider-dept-8001的bootstrap.yml配置的是dev输入:http://localhost:8001/dept/list,可以看到数据库配置是03

   测试成功。

 

  

 

  

   

 

你可能感兴趣的:((08)SpringCloud实战之Config配置)