SpringCloud-Config配置中心
SpringCloud-Config配置中心
分布式架构面临的问题
又是这个重要的环节,在之前的微服务博客中我也写到了分布式架构面临的问题,因为凡是一个技术的出现,肯定是为了解决问题而出现,所以我们有必要去了解这个问题。
微服务意味着要将单体应用中的业务拆分成一个个子服务, 每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
所以它出现了,
SpringCloud-Config为微服务架构中的微服务提供集中化的外部配置支持,
配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
Config作用
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
- 将配置信息以REST接口的形式暴露
实操演练
在GitHub上创建一个新的仓库,请确保它是公开的
把仓库clone下来本地,命令为:git clone 地址
在里面新建一个文件
config-dev.yml
内容为
config:
info: master branch,springcloud-config/config-dev.yml version=1
然后执行下面的命令,一步一步来
git add.
git commit -m"init config"
git push
你就可以看到GitHub上面已经有内容了。
前戏准备好了之后呢,我们就用Java去读取了。
新建一个新的模块:cloud-config-center-3344
pom.xml
依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml
配置文件
说明几点:
cloud-config-git-uri:这里的地址是你GitHub仓库的地址,因为你要直接从上面读取到配置文件,采用HTTPS或者SSH视情况而定。我使用的是HTTPS,去哪找到这个地址呢,简单
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/lexinhu/springcloud-config.git #github仓库上面的git地址
##搜索目录
search-paths:
- springcloud-config
#设置默认读取的分支
label: master
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #注册进eureka
启动类:
package com.xn2001.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* @author 乐心湖
* @date 2020/5/29 1:05
**/
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
启动7001和3344,访问:http://localhost:3344/master/config-dev.yml
可以看到我们就成功把之前写的内容输出来了。
config:
info: master branch,springcloud-config/config-dev.yml version=1
帅气的你会发现我们把访问地址中的master去掉也是可以访问到一样的结果的,原因在于我们设置了默认访问的分支就是master。
例如:http://localhost:3344/config-dev.yml
Spring Cloud Config 有它的一套访问规则,我们通过这套规则在浏览器上直接访问就可以。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
{application}
就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。
{profile}
就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml
加以区分,例如application-dev.yml
、application-sit.yml
、application-prod.yml
。
{label}
表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。
那么我们可以访问其他分支的内容吗,为了测试,我们本地建一个dev分支然后push上去GitHub。
//查看分支
git branch
//新建一个dev分支并切换过去
git checkout -b dev
修改config-dev.yml
内容
config:
info: dev branch,springcloud-config/config-dev.yml version=1
推送
git add .
git commit -m"init config"
//推送到远程仓库
git push origin dev
重新启动项目,访问:http://localhost:3344/dev/config-dev.yml
接下来我们要去用一个客户端来获取配置文件了。
注意:我们不直接通过客户端去获取GitHub上面的配置,而是有一个中心配置文件比如上面的3344,然后我们使用3355去获取。
新建模块: cloud-config-client-3355
pom.xml
依赖
<dependencies>
<!--不带server了,说明是客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
bootstrap.yml
配置文件
这里需要了解的知识点:
-
applicaiton.yml
是用户级的资源配置项 -
bootstrap.yml
是系统级的,优先级更加高 - SpringClould会创建一个
Bootstrap Context
,作为Spring应用的Application Context
的父上下文。初始化的时候,Bootstrap Context
负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。 - Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context和Application Context有着不同的约定,所以新增了一个
bootstrap.ymI
文件, 保证Bootstrap Context和Application Context配置的分离。 - 要将Client模块下的
application.yml
文件改为bootstrap.yml
,这是很关键的,因为bootstrap.ym
是比application.yml
先加载的。bootstrap.yml
优先级高于application.yml
controller
接口控制层:
目的:读取config.info
,如果能返回内容说明成功
package com.xn2001.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 乐心湖
* @date 2020/5/29 14:41
**/
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo; //要访问的3344上的信息
@GetMapping("/configInfo") //请求地址
public String getConfigInfo(){
return configInfo;
}
}
访问:http://localhost:3355/configInfo
神奇吧。
成功实现了客户端3355访问SpringCloud-Config3344通过GitHub获取配置信息。
- Flink DataStream编程指南
- oracle建表、建主键、外键基本语法
- F-Stack KNI配置注意事项
- F-Stack 助力 HTTP 网络服务器性能提升
- How to build Multi-Language Web Sites with ASP.NET 2.0 and VS.Net 2005
- 动态生成TreeView方法(二)
- Gradle打jar包如何上传到maven本地库
- POJO应用框架:Spring与EJB3.0的比较
- spring Boot 整合mybatis 如何使用多数据源
- 动态生成TreeView方法(一)
- hadoop系列之深入优化
- Using sqlite with .NET
- Gridview行上下移动自己做的一个小例子(第一种方法)
- Hadoop伪分布式集群安装部署
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 按照元素指定条件筛选结构体数组
- 多目标优化按支配关系分层实现
- CentOS 7 解决丢失 nginx.pid
- $(function(){})和$(document).ready(function(){})
- javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法
- matlab生成数字1-n的列向量
- JavaScript中的匿名函数及函数的闭包
- ios下Safari无法触发click事件的处理
- 禁止网页右键、复制、另存为、查看源文件等功能
- ajax知识点
- 前端特效常用代码
- VBA编写Ribbon Custom UI编辑器02——编码转换
- web开发中常用的算法和函数
- nodejs创建线程问题
- 3分钟短文 | Laravel如何改造复杂的多表联合查询,这很高效!