统一配置中心概述
如果微服务架构中没有使用统一配置中心时,所存在的问题:
- 配置文件分散在各个项目里,不方便维护
- 配置内容安全与权限,实际开发中,开发人员是不知道线上环境的配置的
- 更新配置后,项目需要重启
Spring Cloud Config就是我们通常意义上的配置中心。Spring Cloud Config-把应用原本放在本地文件的配置抽取出来放在中心服务器,本质是配置信息从本地迁移到云端。从而能够提供更好的管理、发布能力。
Spring Cloud Config分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。
在SpringCloud中我们使用config组件来作为统一配置中心:
一、配置Config-Server服务器端
根据上图知道我们的项目拉取的配置都是由这个Config-Server服务提供的,所以我们这里先介绍Config-Server服务器应该怎么配置,先看pom.xml文件需要添加的核心依赖:
添加的核心依赖就是这个,如果IDE无法自动下载,请到本地仓库手动删除后再reimport让maven重新下载,接下来看看启动类:
接下来看看我们的application.yml文件中的核心配置,这里是关键
server:
port: 8762
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/xulijun137/spring-cloud-config.git #配置文件所在仓库
###如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写。
#username: your_username # 登录账号
#password: your_password #登录密码
default-label: master #配置文件分支
search-paths: config1 #配置文件所在根目录
这里没有配置注册中心的地址,因为这里不是服务提供者,不需要注册到注册中心,从上面可以看到我们配置了Git仓库地址和登录账号、密码(如果是公共的仓库则不需要配置,私人仓库需要配置)、文件分支和文件的根目录,我的Git仓库如下:
这四个配置文件是放到文件夹config1下的,现在我们启动这个服务,其他的服务都可以暂时关闭不管,试着用浏览器获取这些配置文件里的信息:
需要说明:配置文件必须是xxx-xxx.yml或者xxx-xxx.properties的命名方式,扩展名SpringCloud目前只支持yml和properties这两种方式,这里我们用SpringCloudConfig方式获取我们远程仓库里的配置文件信息http://localhost:8762/ronne/dev
这里SpringCloudConfig提供了一套访问规则如下:
/{appication}/{profile}/[{label}]
/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
/{label}/{application}-{profile}.yml
补充说明如下:
再试着加入label访问一下地址http://localhost:8762/master/ronne-dev.yml,效果截图如下:
最后再看看这种访问方式http://localhost:8762/ronne/dev/master
这里我们的Config-Server服务器就配置成功了,接下来我们会建立一个消费者服务看看他是怎么从这个配置服务器上拉取远程仓库的信息并成功展示的
二、配置Config-Client消费端
先看我的pom.xml配置文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xu</groupId>
<artifactId>service-consumer-config-8769</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-consumer-config-8769</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.M3</spring-cloud.version>
</properties>
<dependencies>
<!--Spring Cloud Config 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.48</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
在客户端我们需要新建一个bootstrap.yml或者bootstrap.properties文件,这个文件是优先于application.yml或者application.properties这个文件最先启动的,在这里我们填写我们需要获取的配置文件的信息:
spring:
cloud:
config:
uri: http://localhost:8762
name: ronne-dev #配置文件名,不要扩展名yml
profile: dev #在项目名称后面-dev的内容,简介。
label: master #当configserver的后端存储是Git时,默认是master
application.yml配置文件里配置应用的名称和端口:
server:
port: 8769
spring:
application:
name: config-client
看看我们的启动类有什么不同,其实没什么不同,什么其他的额外注解都没有添加:
最后我们看看我们的Controller中是什么写的以获取配置服务器拉取Git的配置:
package com.xu.serviceconsumer.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //开启更新功能
public class HelloController {
@Value("${nickName}")
private String nickName;
@RequestMapping("/hello")
public String from() {
return "Hello----------->\t" +this.nickName;
}
}
我们再看看我们的提交到Git上的配置文件写的什么:
最后我们看看上面的Controller能否成功获取配置服务器拉取的配置信息,我们先启动config-server成功之后再启动这个config-client客户端,启动正常后就是如下:
我们打开浏览器在地址栏输入http://localhost:8081/hello得到结果是:
可以看到我们成功了,但是这里有个bug我一直没有搞清楚,就是我们的配置服务器的客户端配置的是8769,但是启动后居然是8081端口,看图:
后续等我找到原因了我再更新这篇文章,今天的课就先到这里了,谢谢大家!
===============================================================================