声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。
1、概念:SpringCloudConfig 基础配置
2、具体内容
通过名词就可以发现,SpringCloudConfig 核心作用一定就在于进行配置文件的管理上。也就是说为了更好的进行所有微服务的配置项的管理,在 SpringCloud 设计架构里面就考虑到了针对于所有的核心配置文件(application.yml)进行的一项统一管理的工具。
2.1、SpringCloudConfig 的基本概念
现在可以思考一个问题:在一个实际的项目开发过程之中,有可能会出现有上百个微服务(创建微服务的标准实际上就是业务设计,也就是说你有多少个业务接口那么就有可能需要定义有多少个的微服务,而且不要忘记了,微服务还会存在有负载均衡的问题),那么这样一来对于配置文件的管理就非常麻烦了。
如果现在要想进行某一个微服务的配置文件的变更,那么就有可能需要去修改上百个微服务的信息。所以为了解决这些配置文件的统一的管理问题,那么在 SpringCloud 架构里面提出有一个思想,借助于:SVN、GITHUB 来进行微服务配置文件的保存。
说明:所有微服务的配置文件放在git仓库里面,建立一个SpringCloudConfig的微服务并添加git仓库的配置,这样就能实施获取git仓库里面的配置文件了,其他的微服务就追加SpringCloudConfig的微服务的配置就能通过SpringCloudConfig的微服务获取到各自的配置文件了
但是在此时也需要注意几个问题:
· 一旦使用了 SpringCloudConfig 之中,现在的项目的中心就变为了 SpringCloudConfig 服务;
· 为了解决配置文件的安全问题,在 SpringCloudConfig 之中还提供有一个所谓的安全加密处理,例如:一些重要的密码有可能需要被加密,所以可以使用两种加密处理(密钥处理、jks 安全处理)。
2.2、配置 SpringCloudConfig 服务端
在 SpringCloudConfig 之中服务端的主要功能是通过SVN或者是GIT进行配置文件抓取微服务的配置,所以对于这样的微服务其最大的特征就是需要设置好GIT仓库的信息地址。
1、 【GITHUB】在 github 上创建一个属于自己的仓库信息:microconfig;
此时的 GIT 的连接地址为:git@github.com:leeSmall/microconfig.git
2、 【GITHUB】通过 git 客户端工具将在服务器上的仓库的信息进行克隆处理,假设将克隆的仓库保存在 D 盘上:
· 为了方便统一的管理,建立一个:springcloudconfig 目录,所有的仓库的信息都直接克隆到此目录之中;
git clone
git@github.com:leeSmall/microconfig.git
· 注意:以上的克隆处理操作要求你已经配置好了 GITHUB 的 SSH 连接;
3、 【microconfig】建立一个公共的配置文件:application.yml,随后将这个文件推送到 GITHUB 之中:
· application.yml 配置文件内容如下:
spring: profiles: active: - dev --- spring: profiles: dev application: name: microconfig-test-dev --- spring: profiles: default application: name: microconfig-test-default
|- 将之前克隆好的仓库目录之中创建好 application.yml 配置文件上传到GIT仓库:
4、 【microcloud-config-7101】通过“microcloud-provider-company-8101”复制为了一份新的项目:“microcloud-config-7101”,随后删除掉所有与微服务提供信息相关的程序类与配置文件;
5、 【microcloud-config-7101】修改 pom.xml 配置文件,在此配置文件之中追加有 SpringCloudConfig 的服务依赖端spring-cloud-config-server;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>cn.study</groupId> <artifactId>microcloud-security</artifactId> </dependency>
此时所有微服务的认证信息:studyjava/hello;
6、 【microcloud-config-7101】修改 application.yml 配置文件项:
server:
port: 7101
spring:
application:
name: microcloud-config
cloud: # 进行SpringCloud的相关配置
config: # 进行SpringCloudConfig的相关配置
server: # 设置服务的连接地址
git: # 本次使用的是GIT作为仓库的管理,所以需要设置GIT的连接地址
uri: git@github.com:leeSmall/microconfig.git
7、 【microcloud-config-7101】修改启动程序类:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer public class Config_7101_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Config_7101_StartSpringCloudApplication.class, args); } }
8、 修改 windows 主机下的 hosts 配置文件,追加一个新的映射主机名称:
127.0.0.1 config-7101.com
9、 随后启动“microcloud-config-7101”微服务程序,随后就可以通过如下的地址进行访问了:
NO. | ||
1 |
/{application}-{profile}.yml |
http://studyjava:hello@config-7101.com:7101/application-dev.yml |
2 | /{application}/{profile}[/{label}] | http://studyjava:hello@config-7101.com:7101/application/dev/master |
3 | /{label}/{application}-{profile}.yml | study://studyjava:hello@config-7101.com:7101/master/application-dev.yml |
在实际的项目开发之中,master 分支肯定是不能够进行所谓的修改更新的,也就是说 master 上的内容一定是可以使用的,所以往往会设置一个 dev 分支处理项,这样如果使用了“/{label}/{application}-{profile}.yml”格式将可以更好的进行分支的定位。
以上的做法采用的是 yml 配置文件形式完成,如果要想采用 properties 文件处理,则就必须准备出多个 properties,例如: application-dev.properties、application-beta.properties 等;
2.3、抓取配置文件信息
现在已经成功的实现了 SpringCloudConfig 服务端搭建,但是这个时候只是依靠服务端并没有什么意义,最终所需要的结果还是需要将远程 GITHUB 上的配置信息抓取到客户端上进行程序启动使用。本次将编写一个客户端程序,随后通过 SpringCloudConfig 读取配置文件的信息内容。
1、 【GITHUB】编写一个新的配置文件:microcloud-config-client.yml 配置文件:
· 定义“D:springcloudconfigmicroconfigmicrocloud-config-client.yml”配置文件内容:
spring: profiles: active: - dev --- server: port: 8201 spring: profiles: dev application: name: microcloud-config-client eureka: client: service-url: defaultZone: http://edmin:studyjava@eureka-dev.com:7001/eureka --- server: port: 8102 spring: profiles: beta application: name: microcloud-config-client eureka: client: service-url: defaultZone: http://edmin:studyjava@eureka-beta.com:7001/eureka
· 将此时的配置文件提交到 GITHUB 之中:
2、 【microcloud-config-client-8201】修改 pom.xml 配置文件,追加相关的依赖配置程序包:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
3、 【microcloud-config-client-8201】现在往往都会习惯性的认为应该在 application.yml 配置文件之中进行 SpringCloudConfig 服务端的配置处理,但是在 SpringCloud 官方文档里面会发现此时真正应该配置 SpringCloudConfig 的信息文件应该为 bootstrap.yml。
关于 application.yml 与 bootstrap.yml 配置文件的说明:
· “application.yml”:对应的是用户级的资源配置项;
· “bootstrap.yml”:对应的是系统级的资源配置,其优先级会更高一些;
· 建立“src/main/resources/bootstrap.yml”:
spring:
cloud:
config:
name: microcloud-config-client # 定义要读取的资源文件的名称
profile: beta # 定义profile的 名称
label: master # 定义配置文件所在的分支
uri: http://config-7101.com:7101 # SpringCloudConfig的服务地址
username: studyjava # 连接的用户名
password: hello # 连接的密码
· 建立“src/main/resources/application.yml”里面也进行一些基本的定义:
spring:
application:
name: microcloud-config-client # 编写应用的名称
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://eureka-application.com:7001/eureka
4、 【microcloud-config-client-8201】建立一个新的新的 Rest 服务程序类。
package cn.study.microcloud.rest; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConfigClientRest { @Value("${spring.application.name}") private String applicationName; // 应用的服务名称 @Value("${eureka.client.service-url.defaultZone}") private String eurekaServers; // 设置所有的eureka服务信息项 @RequestMapping("/config") public String getConfig() { return "ApplicationName = " + this.applicationName + "、EurekaServers = " + this.eurekaServers; } }
5、 【microcloud-config-client-8201】设置启动程序类:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Client_8201_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Client_8201_StartSpringCloudApplication.class, args); } }
6、 修改本机的 hosts 配置文件,追加主机映射:
127.0.0.1 client-8201.com
7、 【microcloud-config-7101】确定当前的服务端真实可用,启动之后,输入如下路径信息:
http://studyjava:hello@config-7101.com:7101/microcloud-config-client-beta.yml
8、 【microcloud-config-client-8201】如果说现在你的 application.yml 里面配置的内容与 bootstrap.yml 抓取的服务端的内容相同, 那么会使用那个配置呢?
如果本地的配置与远程的配置相同,那么以 bootstrap.yml 的远程配置为主,所以 bootstrap.yml 优先级一定是要高于application.yml 的。
2.4、客户端使用 SpringCloudConfig 进行配置
已经实现了 SpringCloudConfig 的客户端以及服务端的配置,但是对于现在的客户端程序而言并不是只是简单的获取一些信息就够了,应该将之前的许多的配置文件的内容都交给 github 上进行保存。所以本次将利用 SpringCloudConfig 实现有一个 Eureka、Dept 微服务的信息加载操作。
此时对于“microcloud-config-7101”的项目模块暂时不做任何的变更,此时它只是提供有一个基础的信息服务。
1、 【GITHUB】需要建立有相应的配置文件信息:
· 注意:你如果是自己建立的*.yml 配置文件,请一定要保证你的文件的编码是 UTF-8,否则在执行的时候会出现 “YAMLException”异常信息(中文);
· 建立“D:springcloudconfigmicroconfigmicrocloud-config-eureka-client.yml”配置文件:
spring: profiles: active: - dev --- spring: profiles: dev application: name: microcloud-config-eureka-client server: port: 7001 security: basic: enabled: true # 启用安全认证处理 user: name: edmindev # 用户名 password: studyjava # 密码 eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://edmindev:studyjava@eureka-7001.com:7001/eureka register-with-eureka: false # 当前的微服务不注册到eureka之中 fetch-registry: false # 不通过eureka获取注册信息 instance: # eureak实例定义 hostname: eureka-7001.com # 定义Eureka实例所在的主机名称 --- spring: profiles: beta application: name: microcloud-config-eureka-client server: port: 7001 security: basic: enabled: true # 启用安全认证处理 user: name: edminbeta # 用户名 password: studyjava # 密码 eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://edminbeta:studyjava@eureka-7001.com:7001/eureka register-with-eureka: false # 当前的微服务不注册到eureka之中 fetch-registry: false # 不通过eureka获取注册信息 instance: # eureak实例定义 hostname: eureka-7001.com # 定义Eureka实例所在的主机名称
· 建立“:D:springcloudconfigmicroconfigmicrocloud-config-dept-client.yml”配置文件:
spring: profiles: active: - dev --- server: port: 8001 eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://edmindev:studyjava@eureka-7001.com:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒) lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒) instance-id: dept-8001.com # 在信息列表时显示主机名称 prefer-ip-address: true # 访问的路径变为IP地址 info: app.name: study-microcloud company.name: www.study.cn build.artifactId: $project.artifactId$ build.version: $project.verson$ mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 type-aliases-package: cn.study.vo # 定义所有操作类的别名所在包 mapper-locations: # 所有的mapper映射文件 - classpath:mybatis/mapper/**/*.xml spring: profiles: dev datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驱动程序类 url: jdbc:mysql://localhost:3306/study8001 # 数据库连接地址 username: root # 数据库用户名 password: mysqladmin # 数据库连接密码 dbcp2: # 进行数据库连接池的配置 min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化提供的连接数 max-total: 5 # 最大的连接数 max-wait-millis: 200 # 等待连接获取的最大超时时间 application: name: microcloud-config-dept-client --- server: port: 8001 eureka: client: # 客户端进行Eureka注册的配置 service-url: defaultZone: http://edminbeta:studyjava@eureka-7001.com:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒) lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒) instance-id: dept-8001.com # 在信息列表时显示主机名称 prefer-ip-address: true # 访问的路径变为IP地址 info: app.name: study-microcloud company.name: www.study.cn build.artifactId: $project.artifactId$ build.version: $project.verson$ mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 type-aliases-package: cn.study.vo # 定义所有操作类的别名所在包 mapper-locations: # 所有的mapper映射文件 - classpath:mybatis/mapper/**/*.xml spring: profiles: beta datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驱动程序类 url: jdbc:mysql://localhost:3306/study8001 # 数据库连接地址 username: root # 数据库用户名 password: mysqladmin # 数据库连接密码 dbcp2: # 进行数据库连接池的配置 min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化提供的连接数 max-total: 5 # 最大的连接数 max-wait-millis: 200 # 等待连接获取的最大超时时间 application: name: microcloud-config-dept-client
· 将此时的配置文件提交到 GITHUB 之中:
2、 【microcloud-config-eureka-client-7001、microcloud-config-dept-client-8001】修改 pom.xml 配置文件,追加 SpringCloudConfig 的依赖包:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
3、 【microcloud-config-eureka-client-7001】创建“src/main/resources/bootstrap.yml”配置文件:
spring:
cloud:
config:
name: microcloud-config-eureka-client # 定义要读取的资源文件的名称
profile: beta # 定义profile的 名称
label: master # 定义配置文件所在的分支
uri: http://config-7101.com:7101 # SpringCloudConfig的服务地址
username: studyjava # 连接的用户名
password: hello # 连接的密码
4、 【microcloud-config-eureka-client-7001】修改“src/main/resources/application.yml”配置文件:
spring:
application:
name: microcloud-config-eureka-client
由于使用的是 beta-profile,所以登录地址:http://edminbeta:studyjava@eureka-7001.com:7001
5、 【microcloud-config-dept-client-8001】建立“src/main/resources/bootstrap.yml”配置文件:
spring:
cloud:
config:
name: microcloud-config-dept-client # 定义要读取的资源文件的名称
profile: beta # 定义profile的 名称
label: master # 定义配置文件所在的分支
uri: http://config-7101.com:7101 # SpringCloudConfig的服务地址
username: studyjava # 连接的用户名
password: hello # 连接的密码
6、 【microcloud-config-dept-client-8001】建立“src/main/resources/application.yml”配置文件:
spring:
application:
name: microcloud-config-dept-client
那么此时就实现了基于 SpringCloudConfig+GITHUB 上的配置管理。
2.5、单仓库目录匹配
现在已经实现了一个 GIT 仓库的配置文件的统一管理操作,但是在这个时候有些开发者认为,如果将所有的微服务的配置信息都保存在一个仓库之中文件会显得比较多,建议使用一些文件目录来进行保存,类似于如下的形式:
· 【根目录】GITHUB-ROOT:要求目录名称与配置文件名称保持一致;
|- Eureka 配置目录:“microcloud-config-eureka-client”目录:
|- microcloud-config-eureka-client.yml;
|- dept 微服务配置目录:“microcloud-config-dept-client”目录:
|- microcloud-config-dept-client.yml;
1、 【GITHUB】进行仓库的目录配置,按照如上的要求在本地建立好仓库目录,并且将这些配置文件保存到相应的目录之中:
2、 【microcloud-config-7101】修改 src/main/resources/bootstrap.yml 配置文件:
server:
port: 7101
spring:
application:
name: microcloud-config
cloud: # 进行SpringCloud的相关配置
config: # 进行SpringCloudConfig的相关配置
server: # 设置服务的连接地址
git: # 本次使用的是GIT作为仓库的管理,所以需要设置GIT的连接地址
uri: git@github.com:leeSmall/microconfig.git
search-paths: # 设置配置文件查找的匹配目录
- microcloud-config-eureka-client
- microcloud-config-dept-client
通过浏览器地址访问:http://studyjava:hello@config-7101.com:7101/microcloud-config-eureka-client-dev.yml;
3、 【microcloud-config-7001】如果说此时微服务有几百个,你这样的目录配置也会有几百个,这样整体的配置处理就会感觉比较麻烦,因为需要把所有的目录都写上,所以为了解决这样的问题,可以使用通配符“*”来做一个处理。修改 application.yml:
server:
port: 7101
spring:
application:
name: microcloud-config
cloud: # 进行SpringCloud的相关配置
config: # 进行SpringCloudConfig的相关配置
server: # 设置服务的连接地址
git: # 本次使用的是GIT作为仓库的管理,所以需要设置GIT的连接地址
uri: git@github.com:leeSmall/microconfig.git
search-paths: # 设置配置文件查找的匹配目录
- microcloud-*
现在表示所有与 microcloud-匹配的目录都可以作为查找目录出现。对于此类的配置是在整个 SpringCloudConfig 之中我个人强烈推荐的一种形式。利用统一风格的目录进行配置文件的管理,这样有助于整个项目的维护,而且又非常简单,不占用过多的仓库资源。
2.6、应用仓库自动选择
在之前已经成功的实现了单 GIT 仓库的配置文件管理处理,但是在 SpringCloudConfig 之中也提供有多仓库的配置支持,也就是说用户只需要设置要访问的配置应用的名称(spring.application.name),那么就可以根据指定的名称找到指定的 GIT 仓库,而后进行配置文件的加载处理。
1、 【GITHUB】为了进行统一管理,在 GITHUB 上分别创建有两个新的仓库:
· 仓库名称:microcloud-config-dept-client、microcloud-config-eureka-client。
· 随后将这些仓库的内容进行克隆:
· 随后在每一个仓库的克隆所在目录之中各自创建有 application.yml 配置文件;
· 之后将两个仓库的修改后的内容进行各自的提交处理:
2、 【microcloud-config-7101】修改 application.yml 配置文件;
server:
port: 7101
spring:
application:
name: microcloud-config
cloud: # 进行SpringCloud的相关配置
config: # 进行SpringCloudConfig的相关配置
server: # 设置服务的连接地址
git: # 本次使用的是GIT作为仓库的管理,所以需要设置GIT的连接地址
uri: git@github.com:leeSmall/{application} # 根据应用服务的名称来连接仓库
随后启动一下 SpringCloudConfig 服务端程序,随后进行配置文件的访问:
· 访问“microcloud-config-eureka-client”: http://studyjava:hello@config-7101.com:7101/microcloud-config-eureka-client-dev.yml
· 访问“microcloud-config-dept-client”: http://studyjava:hello@config-7101.com:7101/microcloud-config-dept-client-dev.yml
现在就相当于一个 SpringCloudConfig 可以根据操作的应用名称访问不同的 GITHUB 仓库的内容。
2.7、仓库匹配模式
所谓的仓库匹配模式指的就是在进行仓库配置资源获得的时候可以通过一些限制让用户无法获得一些资源(只能够获得指定资源)。例如:现在虽然进行了多仓库的配置,但是在多仓库配置的过程之中可以发现用户可以加载所有的 profile 信息。指的是说 设置一些规则,让用户只能够加载指定的内容。
1、 【GITHUB】GITHUB 上依然采用与之前多仓库匹配同样的处理操作:
· microconfig:application.yml;
· microcloud-config-dept-client:application.yml(dev、beta)
· microcloud-config-eureka-client:application.yml(dev、beta)。
2、 【microcloud-config-7101】修改 application.yml 配置文件:
server:
port: 7101
spring:
application:
name: microcloud-config
cloud: # 进行SpringCloud的相关配置
config: # 进行SpringCloudConfig的相关配置
server: # 设置服务的连接地址
git: # 本次使用的是GIT作为仓库的管理,所以需要设置GIT的连接地址
uri: git@github.com:leeSmall/microconfig # 为公共仓库信息,如果某些信息找不到了就使用它
repos:
microcloud-config-eureka-client: # 设置指定微服务的仓库信息
uri: git@github.com:leeSmall/microcloud-config-eureka-client
pattern: microcloud-config-eureka-client*/dev* # 只能够访问dev开头的profile
microcloud-config-dept-client: # 设置指定微服务的仓库信息
uri: git@github.com:leeSmall/microcloud-config-dept-client
pattern: microcloud-config-dept-client*/beta* # 只能够访问beta开头的profile
3、 进行正确的访问处理:
· 访问“microcloud-config-eureka-client”: http://studyava:hello@config-7101.com:7101/microcloud-config-eureka-client-dev.yml
· 访问“microcloud-config-dept-client”: http://studyava:hello@config-7101.com:7101/microcloud-config-dept-client-beta.yml
4、 不能够访问的路径:
· 不能访问“microcloud-config-eureka-client”: http://studyava:hello@config-7101.com:7101/microcloud-config-eureka-client-beta.yml
·不能访问“microcloud-config-dept-client”: http://studyava:hello@config-7101.com:7101/microcloud-config-dept-client-dev.yml
如果一旦出现有不能访问的匹配的处理模式,那么就会跳转到所配置的公共仓库之中加载里面的 application.yml 配置文件。