Spring Cloud微服务实践

Spring Cloud Config配置中心

Spring Cloud Config配置中心是什么

在分布式系统中,尤其是当我们的分布式项目越来越多,每个项目都有自己的配置文件,对配置文件的统一管理就成了一种需要,而 Spring Cloud  Config  就提供了对各个分布式项目配置文件的统一管理支持。Spring Cloud Config  也叫分布式配置中心,市面上开源的分布式配置中心有很多,比如国内的, 360  的QConf、淘宝的 diamond、百度的 disconf  都是解决分布式系统配置管理问题,国外也有很多开源的配置中心 Apache 的 Apache Commons Configuration、owner、cfg4j  等等;

Spring Cloud Config 是一个解决分布式系统的配置管理方案。它包含 Client和 Server 两个部分,Server 提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client 通过接口获取数据、并依据此数据初始化自己的应用。

Spring cloud 使用 git 或 svn 存放配置文件,默认情况下使用 git。

构建Spring cloud config配置中心

构建一个 spring cloud config 配置中心按照如下方式进行:

1、创建一个普通的 Spring Boot 项目

2、在 pom.xml 文件中添加如下依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

3、在入口类,也就是 main 方法的类上添加注解 @EnableConfigServer

4、在 application.properties 中配置一下 git 仓库信息,此处我们使用 GitHub( 也可以使用码云 gitee ) , 首先在我的 Github 上创建一个名为spring-cloud-config 的项目,创建之后,再做如下配置:

server.port=3721
spring.application.name=07-springcloud-config-server
spring.cloud.config.server.git.uri=https://github.com/myspring/sprin
g-cloud-config.git
spring.cloud.config.server.git.search-paths=config-center
spring.cloud.config.server.git.username=xxxx@163.com
spring.cloud.config.server.git.password=xxxx123456

其中:

● uri 表示配置中心所在仓库的位置

● search-paths 表示仓库下的子目录

● username 表示你的 GitHub 用户名

● password 表示你的 GitHub 密码

至此我们的配置中心服务端就创建好了。

构建Springcloud config配置中心仓库

接下来我们需要在 github 上设置好配置中心,首先在本地创建一个文件夹叫wkcto,然后在里面创建一个文件夹叫 config-center,然后在 config-center中创建四个配置文件,如下:

application.properties
application-dev.properties
application-test.properties
application-online.properties

在四个文件里面分别写上要测试的内容:

url=http://www.wkcto.com
url=http://dev.wkcto.com
url=http://test.wkcto.com
url=http://online.wkcto.com

然后回到 wkcto 目录下,依次执行如下命令将本地文件同步到 Github 仓库中:

说明:在使用命令之前先从 https://git-scm.com/ 网站下载安装 git 的 window 客户端

1、添加提交人的账号信息,git 需要知道提交人的信息作为标识;

git config --global user.name 'junge'
git config --global user.email 'junge@163.com'

2、将该目录变为 git 可以管理的目录;

git init

3、将文件添加到暂存区

git add config-center/

4、把文件提交到本地仓库;

git commit -m 'add config-center'

5、添加远程主机;

git remote add origin https://github.com/hnylj/spring-cloud-config.git

6、将本地的 master 分支推送到 origin 主机;

git push -u origin master

至此,我们的配置文件就上传到 GitHub 上了。

此时启动我们的配置中心,通过/{application}/{profile}/{label}就能访问到我们的配置文件了;

其中:

{application}表示配置文件的名字,对应的配置文件即application,
{profile}表示环境,有dev、test、online及默认,
{label}

通过浏览器上访问 http://localhost:3721/application/dev/master

返回的 JSON 格式的数据:

name 表示配置文件名 application 部分,profiles 表示环境部分,label 表示分支,version 表示 GitHub 上提交时产生的版本号,同时当我们访问成功后,在控制台会打印了相关的日志信息;当访问成功后配置中心会通过 git clone 命令将远程配置文件在本地也保存一份,以确保在 git 仓库故障时我们的应用还可以继续正常使用。

构建Spring cloud config配置中心客户端

前面已经搭建好了配置中心的服务端,接下来我们来看看如何在客户端应用中使用。

1、创建一个普通的 Spring Boot 工程 08-springcloud-config-client,并添加如下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2、创建 bootstrap.properties 文件,用于获取配置信息,文件内容如下:

(注意这些信息一定要放在 bootstrap.properties 文件中才有效)

server.port=3722

spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:3721/

其中:

name 对应配置文件中的 application 部分,profile 对应了 profile 部分,label 对应了 label 部分,uri 表示配置中心的地址。

3、创建一个 Controller 进行测试:

@RestController
@RefreshScope
public class ConfigController {
   @Value("${url}")
   http://www.wkcto.com
   private String url;
   @Autowired
   private Environment env;
   @RequestMapping("/cloud/url")
   public String url () {
      return this.url;
   }
   @RequestMapping("/cloud/url2")
   public String url2 () {
      return env.getProperty("url");
   }
}

我们可以直接使用@Value 注解注入配置的属性值,也可以通过 Environment对象来获取配置的属性值。

Spring cloud config配置中心客户端测试

通过客户端应用测试是否能够获取到配置中心配置的数据;

Spring cloud config的工作原理

Spring cloud Config Server 的工作过程如下图所示:

1、首先需要一个远程 Git 仓库,平时测试可以使用 GitHub,在实际生产环境中,需要自己搭建一个 Git 服务器,远程 Git 仓库的主要作用是用来保存我们的配置文件;

2、除了远程 Git 仓库之外,我们还需要一个本地 Git 仓库,每当 Config Server访问远程 Git 仓库时,都会克隆一份到本地,这样当远程仓库无法连接时,就直接使用本地存储的配置信息;

3、微服务 A、微服务 B 则是我们的具体应用,这些应用在启动的时会从 ConfigServer 中获取相应的配置信息;

4.当微服务 A、微服务 B 尝试从 Config Server 中加载配置信息的时候,ConfigServer 会先通过 git clone 命令克隆一份配置文件保存到本地;

5、由于配置文件是存储在 Git 仓库中,所以配置文件天然具有版本管理功能;

Spring cloud config的安全保护

生产环境中我们的配置中心肯定是不能随随便便被人访问的,我们可以加上适当的保护机制,由于微服务是构建在 Spring Boot 之上,所以整合 Spring Security是最方便的方式。

1、在 springcloud config server 项目添加依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2、在 springcloud config server 项目的 application.properties 中配置用户名密码:

spring.security.user.name=wkcto
spring.security.user.password=123456

3、在 springcloud config client 上 bootstrap.properties 配置用户名和密码:

spring.cloud.config.username=wkcto
spring.cloud.config.password=123456

4、最后测试验证;