分布式面临的配问题:
微服务意味着要将单体应用中的业务分成一个个自服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的 配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题。我们每一个微服务自己都带着一个application.yml,上百个配偶文件的管理。。。该如何解决呢?
分布式ConfigServer是什么?
SpringCloud Config为微服务架构中微服务提供集中化的外部配置支持,配置服务器为<mark>各个不同微服务应用的所有环境提供了一个中心化的外部配置</mark>。
- <mark>怎么用?</mark>
SpringCloud Config分为服务端和客户端两部分。
服务端也称为<mark>分布式配置中心</mark>,<mark>它是一个独立的微服务应用</mark>,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用的是git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便管理和访问配置内容。 - <mark>能做什么?</mark>
1. 集中管理配置文件
2. 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置我呢间,服务会向配置中心统一拉取配置自己的信息。
4. 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置。
5. 将配置信息以REST接口的形式暴露。 - 与GitHub整合配置
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式
==Config服务端配置:
配置流程图:
- 在GitHub创建仓储:
- copySSH协议git地址:
运行截图:
在本地指定的仓储位置上创建一个application.yml 文件。
<mark>记住</mark>:这里的application.yml文件内容必须以UTF-8的格式保存。(必须)
pwd:返回当前目录
git status:git监控当前目录的文件。红色代表是监控到的文件。
git add .:提交到临时库(<mark>记住add后面有空格和一个点</mark>)。
git commit -m “init file”:把当前这个文件变成一个git能够管理的仓库。
git push origin master:上传到GitHub网站上去。
上传成功的截图:
**
<mark>部署文件到GitHub上步骤</mark>:
创建3344工程,
配置pom文件,需要添加Config的依赖如下:
<!-- 引入springcloud config的依赖 == start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 引入springcloud config的依赖 == end -->
完整的pom文件如下:
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lyj.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-config-3344</artifactId>
<dependencies>
<!-- 引入springcloud config的依赖 == start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 引入springcloud config的依赖 == end -->
<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==start -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.10.0.201712302008-r</version>
</dependency>
<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==end -->
<!-- 引入图形化监控== start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 引入图形化监控== end -->
<!-- 引入熔断机制 依赖 ==start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!-- 引入熔断机制 依赖 ==end -->
<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>
<!-- 引入热部署插件依赖 ==start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- 引入热部署插件依赖 ==end -->
</dependencies>
</project>
创建application.yml文件,配置如下:
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: git@github.com:lingxi-lyj/microservicecloud-config.git #github上面的git仓库名字(SSH协议链接或者)
# SSH协议链接: git@github.com:lingxi-lyj/microservicecloud-config.git
# https://github.com/lingxi-lyj/microservicecloud-config
# 以上是该仓储访问链接, 冒号后面就是GitHub用户名,访问链接前缀为"git@",后缀为".git"。
创建主程序application。在主程序头上添加@EnableConfigServer注解,开启分布式Config 功能。
主程序如下:
package com.lyj.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer//开启分布式Config功能。
public class Config_3344_StartSpringApp {
public static void main(String[] args) {
SpringApplication.run(Config_3344_StartSpringApp.class, args);
}
}
在C盘的hosts文件里配置映射:
添加:
“127.0.0.1 config-3344.com”
测试:
运行结果:
下面的这个访问地址不存在,并且application-xxxx.yml,中的 “xxx”中有特殊字符“;”,所以访问是失败的,如果不包含特殊字符,则返回是空的下下面的一张图
配置的读取规则:
如图:
访问规则:
测试如下规则
测试下面的规则:
4.
5.
SpringCloud Config客户端配置与测试
开发流程图:
microservicecloud-config-client.yml配置:
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/
然后将该文件上传到github上去。
然后在父工程下创建子模块3355工程。
pom文件引入以下依赖:
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lyj.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-config-client-3355</artifactId>
<dependencies>
<!-- 引入springcloud config客户端的依赖 == start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 引入springcloud config客户端的依赖 == end -->
<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==start -->
<!-- <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>4.10.0.201712302008-r</version> </dependency> -->
<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==end -->
<!-- 引入图形化监控== start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 引入图形化监控== end -->
<!-- 引入熔断机制 依赖 ==start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!-- 引入熔断机制 依赖 ==end -->
<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>
<!-- 引入热部署插件依赖 ==start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- 引入热部署插件依赖 ==end -->
</dependencies>
</project>
这个时候不在创建application.yml 文件,是创建bootstrap.yml 文件,配置如下:
spring:
cloud:
config:
#需要从GitHub上读取的资源名称,注意没有yml后缀名
name: microservicecloud-config-client
profile: dev #本次访问的配置项
label: master
#本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址
uri: http://config-3344.com:3344
<mark>为什么是bootstrap.yml文件呢?</mark>
然后再创建一个application.yml文件,刚才那个是系统级的,而这个是用户级的,application.yml配置如下:
spring:
application:
name: microservicecloud-config-client
这里的application.yml配置的name名字一定要与bootstrap.yml文件配置的config-name名字要一致。
然后再在系统C盘里的hosts里添加映射“127.0…0.1 client-config.com”
创建ConfigClientRest类文件
package com.lyj.springcloud.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 :从自己配置文件里读取信息并赋值给这里的变量。 */
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
private 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;
}
}
创建主程序类:
package com.lyj.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);
}
}
测试:
3344自测链接:http://config-3344.com:3344/application-dev.yml
如果要切换开发模式,只需要修改下面的profiled的值,修改为为GitHub里的application.yml仓储文件里的profile的值,即可切换application.yml环境模式。