SpringCloud与SpringConfig分布式配置中心
问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件管理起来势必使以减十分麻烦的事情因此我们引入了SpringCloud Config。
简介
SpringConfig图解
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
作用
集中管理配置文件
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
运行期间动态调整配置,不需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
将配置信息以REST接口的形式暴露
GitHub整合
在GitHub上创建一个repository
获取到git的链接
git@github.com:bigdataxiaohan/microservicecloud-config.git
在本地创建一个仓库在本地的仓库在创建一个application.yml 注意保存的编码格式必要是UTF-8
123456789101112131415
spring: profiles: active: - dev---spring: profiles: dev #开发环境 application: name: microservicecloud-config-hphblog-dev---spring: profiles: test #测试环境 application: name: microservicecloud-config-hphblog-test# 请保存为UTF-8格式
将本地的配置文件推送到github上去
查看github上的配置信息
新建一个Moudle
microservicecloud-config-3344
作为配置中心模块pom.xml文件修改
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
<?xml version="1.0" encoding="UTF-8"?><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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.hph.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-3344</artifactId> <dependencies> <!-- springCloud Config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- 图形化监控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 熔断 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 热部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
1234567891011
server: port: 3344 spring: application: name: microservicecloud-config cloud: config: server: git: uri: https://github.com/bigdataxiaohan/microservicecloud-config.git #GitHub上面的git仓库名字
Config_3344_StartSpringCloudApp
123456789101112131415
package com.hph.springcloud; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication@EnableConfigServerpublic class Config_3344_StartSpringCloudApp{ public static void main(String[] args) { SpringApplication.run(Config_3344_StartSpringCloudApp.class,args); }}
windows下修改hosts文件,增加映射
1
127.0.0.1 config-3344.com
测试
启动Config_3344_StartSpringCloudApp
访问http://config-3344.com:3344/application-dev.yml
访问http://config-3344.com:3344/application-test.yml
访问http://config-3344.com:3344/application-xxx.yml(不存在的配置)
访问方式
链接地址:https://github.com/spring-cloud/spring-cloud-config/issues/292
方式一
/{application}/{profile}[/{label}]
访问:http://config-3344.com:3344/application/dev/master
访问:http://config-3344.com:3344/application/test/master
访问: http://config-3344.com:3344/application/xxx/master
方式二
/{label}/{application}-{profile}.yml
访问http://config-3344.com:3344/master/application-dev.yml
访问http://config-3344.com:3344/master/application-test.yml
配置客户端
创建一个microservicecloud-config-client.yml文件
microservicecloud-config-client.yml
1234567891011121314151617181920212223242526 |
spring: profiles: active: - dev---server: port: 8201 spring: profiles: dev application: name: microservicecloud-config-clienteureka: client: service-url: defaultZone: http://eureka-dev.com:7001/eureka/ ---server: port: 8202 spring: profiles: test application: name: microservicecloud-config-clienteureka: client: service-url: defaultZone: http://eureka-test.com:7001/eureka/ |
新建microservicecloud-config-client-3355
pom.xml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
<?xml version="1.0" encoding="UTF-8"?><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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.hph.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-client-3355</artifactId> <dependencies> <!-- SpringCloud Config客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project> |
bootstrap.yml
applicaiton.yml是用户级的资源配置项
1234567 |
spring: cloud: config: name: microservicecloud-config-client #需要从github上读取的资源名称,注意没有yml后缀名 profile: test #本次访问的配置项 label: master uri: http://config-3344.com:3344 #本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址 |
bootstrap.yml是系统级的,优先级更加高
application.yml
123 |
spring: application: name: microservicecloud-config-client |
Spring Cloud会创建一个Bootstrap Context
,作为Spring应用的Application Context
的父上下文。初始化的时候,Bootstrap Context
负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
。Bootstrap
属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context
和Application Context
有着不同的约定,
所以新增了一个bootstrap.yml
文件,保证Bootstrap Context
和Application Context
配置的分离。
增加映射
1 |
127.0.0.1 client-config.com |
新建rest类,验证是否能从GitHub上读取配置
123456789101112131415161718192021222324252627 |
package com.hph.springcloud.rest; import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; @RestControllerpublic 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 "applicationName: "+applicationName+"\t eurekaServers:"+eurekaServers+"\t port: "+port; }} |
测试
启动Config配置中心3344微服务并自测
访问http://config-3344.com:3344/application-dev.yml
因为我们配置的文件是test访问的端口是8202
访问测试端口
SpringCloud Config配置实战
注意:编码方式一定要是UTF-8
新建microservicecloud-config-eureka-client.yml
1234567891011121314151617181920212223242526272829303132333435363738 |
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 #当前的eureka-server自己不注册进服务列表中 fetch-registry: false #不通过eureka获取注册信息 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 #当前的eureka-server自己不注册进服务列表中 fetch-registry: false #不通过eureka获取注册信息 service-url: defaultZone: http://eureka7001.com:7001/eureka/ |
新建microservicecloud-config-dept-client.yml
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
spring: profiles: active: - dev--- server: port: 8001spring: profiles: dev application: name: microservicecloud-config-dept-client datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://192.168.1.110: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 type-aliases-package: com.hph.springcloud.entities mapper-locations: - classpath:mybatis/mapper/**/*.xml eureka: client: #客户端注册进eureka服务列表内 service-url: defaultZone: http://eureka7001.com:7001/eureka instance: instance-id: dept-8001.com prefer-ip-address: true info: app.name: hphblog-microservicecloud-springcloudconfig01 company.name: www.hphnlog.cn build.artifactId: ${project.artifactId} build.version: ${project.version}---server: port: 8001spring: profiles: test application: name: microservicecloud-config-dept-client datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://192.168.1.110: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 type-aliases-package: com.hph.springcloud.entities mapper-locations: - classpath:mybatis/mapper/**/*.xml eureka: client: #客户端注册进eureka服务列表内 service-url: defaultZone: http://eureka7001.com:7001/eureka instance: instance-id: dept-8001.com prefer-ip-address: true info: app.name: hphblog-microservicecloud-springcloudconfig01 company.name: www.hphnlog.cn build.artifactId: ${project.artifactId} build.version: ${project.version} |
新建工程microservicecloud-config-eureka-client-7001
pom.xml
12345678910111213141516171819202122232425262728293031323334 |
<?xml version="1.0" encoding="UTF-8"?><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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.hph.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-eureka-client-7001</artifactId> <dependencies> <!-- SpringCloudConfig配置 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- 热部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project> |
bootstrap.yml
1234567 |
spring: cloud: config: name: microservicecloud-config-eureka-client #需要从github上读取的资源名称,注意没有yml后缀名 profile: dev label: master uri: http://config-3344.com:3344 #SpringCloudConfig获取的服务地址 |
application.yml
123 |
spring: application: name: microservicecloud-config-eureka-client |
Config_Git_EurekaServerApplication
123456789101112131415 |
package com.hph.springcloud; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication@EnableEurekaServerpublic class Config_Git_EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(Config_Git_EurekaServerApplication.class, args); }} |
测试
先启动microservicecloud-config-3344微服务,保证Config总配置状态可用
再启动microservicecloud-config-eureka-client-7001微服务
访问http://eureka7001.com:7001/
microservicecloud-config-dept-client-8001
pom.xml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
<?xml version="1.0" encoding="UTF-8"?><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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.hph.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-dept-client-8001</artifactId> <dependencies> <!-- SpringCloudConfig配置 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>com.hph.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project> |
bootstrap.yml
123456789 |
spring: cloud: config: name: microservicecloud-config-dept-client #需要从github上读取的资源名称,注意没有yml后缀名 #profile配置是什么就取什么配置dev or test #profile: dev profile: test label: master uri: http://config-3344.com:3344 #SpringCloudConfig获取的服务地址 |
application.yml
123 |
spring: application: name: microservicecloud-config-dept-client |
主启动类
123456789101112131415 |
package com.hph.springcloud; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication@EnableEurekaClient //本服务启动后会自动注册进eureka服务中@EnableDiscoveryClient //服务发现public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class, args); }} |
其他配置
参考microservicecloud-provider-dept-8001
测试
启动microservicecloud-config-3344主启动类
启动microservicecloud-config-client-3355主启动类
启动microservicecloud-config-eureka-client-7001主启动类
启动microservicecloud-config-dept-client-8001主启动类
由于我们激活的配置是test所以我们访问一下<http://localhost:8001/dept/list>
修改microservicecloud-config-dept-client-8001中的profile属性改成dev
我们将本地的文件修改一下让dev模式下访问3号数据库重新启动所有服务
完整代码
Github地址: https://github.com/bigdataxiaohan/microservicecloud/tree/master/SpringConfig
SpringCloud与SpringConfig分布式配置中心相关推荐
- SpringCloud学习系列之四-----配置中心(Config)使用详解
前言 本篇主要介绍的是SpringCloud中的分布式配置中心(SpringCloud Config)的相关使用教程. SpringCloud Config Config 介绍 Spring Clou ...
- SpringCloud教程六:分布式配置中心(SpringCloud Config)
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持 ...
- 白话SpringCloud | 第八章:分布式配置中心的服务化及动态刷新
前言 上一章节,简单介绍了分布式配置中心Spring Cloud Config的使用.同时,我们也遗漏了一些问题,比如如何配置实时生效,当服务端地址变更或者集群部署时,如何指定服务端地址?回想,在服务 ...
- 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)...
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f6-config/ 本文出自方志朋的博客 在上一篇文章讲述z ...
- springcloud config 分布式配置中心
一.介绍 1.场景: 微服务系统中,系统多.实例多,如果每个系统都有自己一套配置加载.维护的机制,会导致在生产过程中因为配置问题引发的不必要的沟通成本.故障风险.需要采用分布式配置中心统一管理.统一实 ...
- 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
转:https://blog.csdn.net/forezp/article/details/70037291 最新版本: 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spr ...
- SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪
Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...
- springcloud 分布式配置中心 config server config client
---------------------------------------------------------------------------------------------------- ...
- springcloud分布式配置中心(二)-阿波罗apollo
1.Springcloud的分布式配置中心组件 组件一般有两个,springcloud config,apollo.apollo有一个好处是apollo有界面,这是apollo的一个优势. sprin ...
最新文章
- Mina源码阅读笔记(一)-整体解读
- 你到底有几个邮箱?码云账号增加多邮箱支持!
- struts2文件上传(2)
- mysql分组区某列最后一条_[MySQL]MySQL数据库如何按某列分组排序后查询每个分组的最后一条数据?...
- python opencv用法中文教程
- Python之定义默认参数
- 第3节:vue-router如何参数传递
- 【论文阅读】Rich feature hierarchies for accurate object detection and semantic segmentation
- 深入理解java虚拟机学习笔记(一)
- 付费圈子来了,去还是不去?
- 一路风景之川藏线徒步笔记
- Retinex算法详解
- 计算机操作系统的加密与恢复,当在 Windows中设置 FIPS 兼容策略时,BitLocker 的恢复密码Windows...
- 微波电路中的线性和非线性
- Xcode Localizations Change Development Language (Xcode 本地化 修改默认的开发语言)
- 北京大学暑期学校总结
- 华为 BGP/MPLS VP#实验
- SDUT 3929 校赛 D 魔戒
- php键值字符串转数组,PHP数组与字符串互相转换实例
- 广州南沙新区规划发布 面积约803平方公里-广州-南沙新区-面积