SpringCloud(八)Spring Cloud Config(1)——基础入门

前面我们已经知道如何搭建一个Spring Cloud微服务架构的系统。这个架构里面可能有几个微服务,可能有几十个微服务,也可能有上百个微服务甚至更多。假如,有一天我们改下日志打印级别这个想法,如果只有少量的微服务我们可以一个一个去改,那么如果有非常多的微服务也要一个一个去改吗,不仅工作量大而且容器出错。这该怎么办呢?

不要着急我们今天来看下这个东西Spring Cloud Config,它可以帮助我们把这些微服务的配置进行集中管理。除此之外,还可以

不同环境,不同配置,开发环境,测试环境,生产环境各一套配置互不干扰。

运行期间动态调整配置,系统在运行状态下,也可以动态的更新调整配置从而对整个系统生效。

自动刷新,当源配置发生改变时,各个微服务里面的配置会自动刷新。

 

当然了,能够提供配置中心管理组件的不仅是Spring Cloud Config,还有:

Spring系列的Spring Cloud Config,Spring Cloud zookpeeper,Spring Cloud consul,

百度的disconf,阿里的diamond,携程的apollo

今天呢我们主要来看Spring Config Cloud,请继续往下看。

实战项目源码托管地址:https://github.com/cddofficial/SpringCloudRepo

目录

1 Spring Cloud Config概述

1.1 简介

2 Spring Cloud Config Server

2.1 简介

2.2 实战

2.2.1 创建远程git仓库

2.2.2 复制得到microservice-config-server项目

2.2.3 处理microservice-config-server

2.3.4 测试

3.Spring Cloud Config Client

3.1 简介

3.2 实战

3.2.1 复制得到microservice-config-client项目

3.2.2 修改microservice-config-client项目

3.2.3 测试

3.2.4 Spring Cloud Config Client启动流程

3.2.5 注意事项

4.相关文档资料


1 Spring Cloud Config概述

1.1 简介

spring cloud config 为分布式系统外部化配置和客户端的支持,它包括了config server和config client两部分。由于config server和config client都实现了对spring environment和PropertySource的映射,因此spring cloud config非常适合spring应用程序,当然也可以和其他语言编写的应用程序配合使用。

config server是一个可横向扩展,集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用git存储配置内容(也可使用subversion,本地文件系统或valut存储配置),因此可以很方便的实现对配置的版本控制与内容审计。

config client是config server的客户端,用于操作存储在config server上的配置属性。

1.2 原理架构图

Spring Cloud Config的架构是什么呢,如下图:

上图中:

           Config Server指的是Spring Cloud Config Server,下文中的Config Server同理;

           Config Client指的是Spring Cloud Config Client,下文中的Config Client同理;

服务的配置信息我们存放在远程git仓库,Config Server从远程git仓库拉取配置信息,然后其他的Conifg Client又从Config Server获取配置信息,继而对所在微服务生效。

2 Spring Cloud Config Server

2.1 简介

Spring Cloud Config Server为外部配置(名称-值对或等效的YAML内容)提供了一个基于HTTP资源的API,可以通过注解嵌入到Spring Boot项目里面。其主要负责从远程git仓库拉取配置信息,又为Spring Config Client提供配置信息源。

2.2 实战

2.2.1 创建远程git仓库

接着在github上新创建一个仓库config-repo-demo,把该仓库clone到本地,给里面添加两个文件application.yml和

foobar-dev.yml,这两个文件内容分别如下(用notepad++打开):

application.yml:

foobar-dev.yml:

接下来把这个仓库所有的修改全部提交到github服务器上去,登录到github上把这个仓库的clone地址复制下来,如下:

2.2.2 复制得到microservice-config-server项目

复制eureka-server-service-discover微服务重命名为microservice-config-server微服务(至于如何复制这里不再赘述,请看eureka——实战中的 “2.4.1 创建可乐微服务” 的 “复制得到eureka-client-coke),导入到IDE工具中,导入后,项目结构如下图:

2.2.3 处理microservice-config-server

1.修改pom文件

删掉eureka-server依赖,添加config-server依赖,修改后截图如下:

整个pom文件代码如下:

<?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.0.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<groupId>com.cdd.cloud</groupId>
	<artifactId>microservice-config-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server-service-discover</name>
	<description>Demo project for Spring Boot</description>
 
	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
 
	<dependencies>
		<!-- config server依赖 -->
		<dependency>
    		<groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-config-server</artifactId>
 		</dependency>
 		
 		<!-- test依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
    <dependencyManagement>
	    <dependencies>
	      <dependency>
	        <groupId>org.springframework.cloud</groupId>
	        <artifactId>spring-cloud-dependencies</artifactId>
	        <version>Finchley.SR2</version>
	        <type>pom</type>
	        <scope>import</scope>
	      </dependency>
	    </dependencies>
  	</dependencyManagement>
 
	<!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
 
</project>

2 修改启动类

修改启动类名称为:MicroserviceConfigServerApplication,删掉@EnableEurekaServer 注解,给启动类打上@EnableConfigServer    注解,修改后启动类的代码如下:

package com.cdd.demo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
 
@SpringBootApplication
@EnableConfigServer	// 启用Config server
public class MicroserviceConfigServerApplication {
 
	public static void main(String[] args) {
		SpringApplication.run(MicroserviceConfigServerApplication.class, args);
	}
}

3 修改yml文件

修改yml文件,其中spring.cloud.config.server.git.uri的值就是远程git仓库cloud-config-git-repo的clone地址,其中.git后缀可以不要,整个yml文件内容截图如下:

2.3.4 测试

启动microservice-config-server项目,可以根据下面的规则去查看刚才的配置内容(提交到远程github服务器的)。

项目启动成功后,在浏览器地址栏输入请求地址,请求地址要和上面的规则匹配上:

浏览器输入:http://localhost:7070/abc-default.yml,响应页面如下,可以看到确实是刚才application.yml文件中的内容:

这个请求路径http://localhost:7070/abc-default.yml中的abc-default.yml,因为在远程git仓库没有配置文件和它匹配,所以就返回默认的配置文件application.yml的内容,并且请求路径后面的".yml"后缀也可以是".properties"同样可以拿到正确的配置信息。

接下来,浏览器再访问:http://localhost:7070/foobar-dev.properties,这个请求路径用的是“.properties”后缀,应该获取到远程git仓库的foobar-dev.yml配置文件的内容,响应页面如下:

的确是这样的展示的是foobar-dev.yml配置文件的内容,说明的我们的Spring Cloud  Config Sever已经搭建成功了。

3.Spring Cloud Config Client

3.1 简介

Spring Cloud Config Client简单翻译就是Spring Cloud Config客户端,从Spring Cloud Conifg server(Spring Cloud Config服务端)获取配置信息,这些Spring Cloud Config Server或是Spring Cloud Config Client都可以集成到eureka client上。为所在微服务

3.2 实战

3.2.1 复制得到microservice-config-client项目

复制microservice-config-server微服务重命名为microservice-config-client微服务(至于如何复制这里不再赘述,请看eureka——实战中的 “2.4.1 创建可乐微服务” 的 “复制得到eureka-client-coke),导入到IDE工具中,导入后,项目结构如下图:

3.2.2 修改microservice-config-client项目

1.修改pom文件

添加spring-cloud-starter-config依赖,这个依赖中包含config client依赖,该依赖截图如下:

等maven更新完成后,我们来看下现在该项目中是否存在spring-cloud-config-client依赖,如下图,可见

spring-cloud-config-client依赖的确存在了:

整个pom文件内容如下:

<?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.0.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<groupId>com.cdd.cloud</groupId>
	<artifactId>microservice-config-client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server-service-discover</name>
	<description>Demo project for Spring Boot</description>
 
	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
 
	<dependencies>
		<!-- config client所在的依赖 -->
		<dependency>
    		<groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-starter-config</artifactId>
 		</dependency>
 		
 		<!-- test依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
    <dependencyManagement>
	    <dependencies>
	      <dependency>
	        <groupId>org.springframework.cloud</groupId>
	        <artifactId>spring-cloud-dependencies</artifactId>
	        <version>Finchley.SR2</version>
	        <type>pom</type>
	        <scope>import</scope>
	      </dependency>
	    </dependencies>
  	</dependencyManagement>
 
	<!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
 
</project>

2. 修改启动类

修改启动类的类名为:MicroserviceConfigClientApplication,移除掉启动类上的的@EnableConfigServer,修改后整个启动类代码如下:

package com.cdd.demo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class MicroserviceConfigClientApplication {
 
	public static void main(String[] args) {
		SpringApplication.run(MicroserviceConfigClientApplication.class, args);
	}
}

3 处理配置文件

一般在springboot项目中配置文件有这样的规则:

例如application.yml,application.properties。".yml“配置文件的优先级高于”.properties"配置文件。

例如bootstrap.yml,application.yml文件,bootstrap.yml的优先级高于applicaton.yml配置文件(有一处例外:服务器端口如果在application.yml和bootstrap.yml配置文件中都配置了,那么以applciaton.yml文件中配置为准生效,建议如果用bootstrap.yml配置时,就不要在application.yml文件中配置任何内容)。

(1)清空application.yml配置文件里面的所有内容。

(2)在resources目录下,新建一个bootstrap.yml配置文件,文件内容如下:

server:
  port: 7071
  
spring:
  application:
    name: foobar  #与远程配置文件名称有关,可与下面的profile值,拼成foobar-dev 
  cloud:
    config:
      uri: http://localhost:7070
      profile: dev
      label: master #当config server的后端存储是git时,默认是master

4 添加ConfigClientController类

在启动类所在的包下新建一个controller包,在该包下新建一个ConfigClientController类,该类完整代码如下:

package com.cdd.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigClientController {
	
	// 把配置文件中profile属性值注入到该属性
	@Value("${profile}")
	private String profile;
	
	@GetMapping("/profile")
	public String getProfile() {
		return profile;
	}

}

3.2.3 测试

接下来启动microservice-config-server,microservice-config-client项目,启动成功后,在

浏览器中输入:http://localhost:7071/profile ,响应页面如下,可以看到获取到了远程foobar-dev.yml文件的配置内容:

3.2.4 Spring Cloud Config Client启动流程

spring cloud config client在启动的时候,

先加载bootstrap.*里面的配置;

接着连接 spring cloud server ;

再去加载远程配置(git里面的);

最后去加载spring cloud config client里面的application.*文件

3.2.5 注意事项

1.如果远程配置的profile: profile-dev ,现在spring cloud config client的appliction.yml中配置的profile: abc,那么以哪个配置为准呢?答案是远程的。

2.如果spring cloud config client项目没有在bootstrap.yml或application.yml文件中配置应用程序名称,那么在请求的时候获取到的是远程的默认配置,就是远程application.yml文件中配置的profile: default-settings

3.如果我们在spring cloud config client的application.yml文件里面进行配置了(没有在bootstrap.yml文件中配置),启动config server后,再启动config client时会报下面这样的错,如下图:

这是因为spring cloud config client在启动的时候先加载bootstrap.*文件里面的配置,spring cloud config client里面的bootstrap.yml默认端口配置为8888。我们重新显示的写一个bootstrap.yml文件,在这个文件里面进行配置就行了。

 

到这里Spring Cloud Config的一个简单实例就算完成了。哪里有不对的地方希望大家批评指正啊!

 

4.相关文档资料

Spring Cloud Config,官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#_spring_cloud_config

Spring Cloud zookpeeper,官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#_spring_cloud_zookeeper

Spring Cloud consul,官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#_spring_cloud_consul

百度的disconf,官方学习文档:https://disconf.readthedocs.io/zh_CN/latest/

阿里的diamond,github上文档:https://github.com/gzllol/diamond

携程的apollo, github上文档:https://github.com/ctripcorp/apollo

发布了45 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41968788/article/details/103372262