SpringCloud config分布式配置
1.分布式系统面临的问题--配置文件的问题
微服务意味着要将单体应用中的业务拆分成一个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.application,那上百个配置文件要修改起来,会比较麻烦。
2.SpringCloud config分布式配置中心概述
-
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置
-
SpringCloud Config分为服务端和客户端两部分
-
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口
-
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以通过git客户端工具来方柏霓和访问配置内容
3.SpringCloud Config实战
前提:在负载均衡及Ribbon文章中Ribbon实战项目的基础上进行开发
3.1前期准备部分
前提:安装了git(这里不再详细说明),在桌面上右击可以看到git的选项,表明安装成功
-
在gitee账号创建一个新仓库(如果还没有账号,可以先注册一个账号,再进行这一步的操作)
-
此时可以得到如下的仓库信息
-
如果想要添加README.md文件的也可以添加进去啊u,我这里添加了,仓库信息如下所示
-
接着把它拉到本地上,这里有四种方式,看个人方便来选择方式拉取项目,我这里选择ssh的方式拉去项目
-
先复制链接,然后在放置项目的文件夹中右击页面,在弹出的选项中选择Git Bash Here
-
在弹出的命令行界面中,输入
git clone 刚刚复制的链接
,回车,提示是否继续连接,输入yes
,再次回车,发现没有权限
-
查找原因,发现gitee账号上的公钥是另外一部电脑的,需要重新设置,选择设置-->SSH公钥,把已有的公钥删掉(gitee账号上的和C盘-->用户-->当前电脑账号-->.ssh文件下的文件),重新设置
-
点击上一张图中的“怎样生成公钥”的链接,可以查看详细教程,下面红色框框的命令就是用来生成公钥的,这里-t和-C后面的内容可以设置成自己的
-
打开C盘-->用户-->当前电脑账号-->.ssh文件,右击空白处,选择弹出的选项中Git Bash Here,输入上一步骤中的命令(注意修改把-t和-C后面的内容修改成自己的),然后一路回车即可生成公钥
-
在C盘-->用户-->当前电脑账号-->.ssh文件目录下中杰克看到生成公钥的文件
-
然后将公钥复制到gitee上面,然后点击确定,在弹出的弹框中输出密码,验证通过即可添加公钥成功
-
重复4,5,6这几个步骤,把项目拉取下来,项目目录结构如下
13.在项目目录下创建三个配置文件,分别是application.properties、application-dev.properties、application-test.properties,对应的内容如下
- application.properties
spring.profiles.active=dev
- application-dev.properties
spring.profiles=dev spring.application.name=springcloud-config-dev
- application-test.properties
spring.profiles=test spring.application.name=springcloud-config-test
14.在命令行中依次执行下面命令,即可将代码提交到仓库中
cd springcloud-config//进入到项目目录下
git add . //添加当前目录的所有文件到暂存区
git commit -m "first commit"//提交暂存区到仓库区
git push origin master//提交到主分区
3.2Config服务端
- 创建一个名称为springcloud-config-server-3344的maven项目,导入config-server依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
- 在配置文件application.properties中编写配置
#服务端口号
server.port=3344
#应用名称
spring.application.name=springcloud-config-server-3344
#连接远程仓库,这里的仓库连接是https的,不是ssh的
spring.cloud.config.server.git.uri=自己的gitee的https的链接
- 在src/main/java目录下创建com.zixin.springcloud包,并在该包下创建启动类,然后在启动类上添加
@EnableConfigServer
注解,用于开启Config服务端
package com.zixin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
//开启config服务端
@EnableConfigServer
@SpringBootApplication
public class ConfigServer_3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigServer_3344.class, args);
}
}
-
运行springcloud-config-server-3344项目,发现控制台有如下的报错信息
原因:在giteeithub上创建的仓库是私有的 ,无法安全连接到gitee仓库
解决方法:在application.properties中配置上自己gitee的用户名和密码#gitee的用户名 spring.cloud.config.server.git.username=自己gitee的用户名 #gitee的密码 spring.cloud.config.server.git.password=自己gitee的密码
-
重新运行项目,访问
http://localhost:3344/
,出现下面的页面,表示项目运行成功
-
访问
http://localhost:3344/application-dev.properties
,控制台出现了下面的错误
原因:依赖冲突
解决方法:把config-server的版本号去掉即可 -
重新运行项目,分别访问
http://localhost:3344/application-dev.properties
和http://localhost:3344/application-test.properties
,发现无法访问到devz和test配置文件的信息,只有下面中的信息,查找原因发现是我的配置文件命名出现空格导致的,这里把本地的配置文件中的空格去掉,然后再一次用命令把修改后的配置文件提交到仓库即可
-
再次分别访问
http://localhost:3344/application-dev.properties
和http://localhost:3344/application-test.properties
,得到如下结果,表示成功
3.3Config客户端
-
在3.1中的远程仓库拉下来的springcloud-config项目目录下创建三个配置文件,分别是config-client.properties、config-client-test.properties、config-client-test.properties,对应的内容如下
- config-client.properties
spring.profiles.active=dev
- config-client-dev.properties
server.port=8201 spring.profiles=dev spring.application.name=config-client-8201 eureka.client.service-url.defaultZone=http://localhost:7001/eureka
- config-client-test.properties
server.port=8202 spring.profiles=test spring.application.name=config-client-8202 eureka.client.service-url.defaultZone=http://localhost:7001/eureka
- config-client.properties
-
在命令行中依次执行下面命令,即可将代码提交到仓库中
cd springcloud-config//进入到项目目录下
git add . //添加当前目录的所有文件到暂存区
git commit -m "first commit"//提交暂存区到仓库区
git push origin master//提交到主分区
- 创建一个项目名为springcloud-config-client-3355的maven项目,导入eureka-client和config-client依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
-
创建两个配置文件,分别命名为bootstrap.properties和application.properties
- bootstrap.properties
#服务级别的配置 #需要从git上读取的资源名称,不要后缀 spring.cloud.config.name=config-client #当前的配置环境 spring.cloud.config.profile=dev #当前的代码分支 spring.cloud.config.label=master #访问配置的地址 spring.cloud.config.uri=http://localhost:3344
- application.properties
#用户级别的配置 server.port=3355 spring.application.name=springcloud-config-client-3355
-
在src/main/java目录下创建com.zixin.springcloud包,并在该包下创建启动类ConfigClient_3355
package com.zixin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClient_3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355.class, args);
}
}
- 在com.zixin.springcloud包下创建controller文件夹,饼子啊该文件夹中创建ConfigClientController,编写一个获取远程配置的方法
package com.zixin.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private String port;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;
@RequestMapping("/config")
public String getConfig(){
return "applicationName:"+applicationName
+ "eurekaServer:"+eurekaServer
+ "port:"+port;
}
}
-
运行springcloud-config-server-3344、eureka-server-7001以及springcloud-config-client-3355项目,访问
http://localhost:7001/
,可以看到config-client-8201服务注册到eureka注册中心中
-
分别访问
http://localhost:3344/master/config-client-dev.properties
和http://localhost:3344/master/config-client-test.properties
,也可以获取到对应的配置信息如下所示
-
访问
http://localhost:8201/config
请求,也可以拿到远程仓库中config-client-dev.properties配置文件的信息
-
将bootstrap.properties配置文件中的
spring.cloud.config.profile
值修改为test,重新运行springcloud-config-client-3355项目,访问http://localhost:8202/config
,可以拿到远程仓库中config-client-test.properties配置文件的信息