SpringCloud学到刚好够用之七-配置中心(spring-cloud-config)
文章目录
总览
spring cloud相关技术栈在现在各个互联网公司的普及率已经很高了,这次去面试,基本面试官都有提到这一块,但是有没有实际接触过,只能遗憾的摇摇头。这里记录下学习过程,将一些踩坑的经验写出来,供大家参考。这个系列只会写到很浅的一部分,如有兴趣深入,可以看"这个系列",将会给大家一个方向哈
基于SpringCloud的Greenwich.SR1,Jdk11,Maven,Idea开发
看的不过瘾
进阶使用
源码分析
简介
分布式配置中心
Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对Spring Environment和PropertySource抽象的映射,所以它除了适用于Spring构建的应用程序,也可以在任何其他语言运行的应用程序中使用。作为一个应用可以通过部署管道来进行测试或者投入生产,我们可以分别为这些环境创建配置,并且在需要迁移环境的时候获取对应环境的配置来运行。
置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。当然他也提供本地化文件系统的存储方式。
使用 spring Cloud 进行集中式配置管理,将以往的配置文件从项目中摘除后放到Git 或svn中集中管理,并在需要变更的时候,可以通知到各应用程序,应用程序刷新配置不需要重启。
基本原理
git 上存放我们的远程配置文件
config-server 连接到 git
config-client 连接到config-server
当我们启动config-client 服务的时候,client 会通过连接的 config-server 拿到远程git 上面的配置文件,然后通过 Spring 加载到对象中。
准备活动
- 一个eureka
- 在git上面搞一个配置项目(建议先直接用我的目录,调通之后自己再去建一个)
- 一个config-server
- 一个config-client
在git上面搞一个配置项目
我是直接在项目上面https://gitee.com/lizhaoandroid/spring-cloud-learning,添加了一个分支pro007-config-properties,然后建了一个文件夹config-v1,加了几个文件 config-client-dev.properties
foo = foo version 21
democonfigclient.message=hello spring io
结构可以看下:https://gitee.com/lizhaoandroid/spring-cloud-learning/tree/pro007-config-properties/config-v1
配置中心config-server
主要步骤
引入包,spring-cloud-config-server
修改相关配置,spring.cloud.config
启动类添加注解,@EnableConfigServer
上述步骤关键代码及图片
- 引入包,spring-cloud-config-server
<?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 http://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.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lizhaoblog.scl</groupId>
<artifactId>pro007-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>pro007-config-server</name>
<description>config-server project for Spring cloud</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 修改相关配置,spring.cloud.config
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8768
spring:
application:
name: service-config
cloud:
config:
# 配置 项目分支
label: pro007-config-properties
server:
git:
# 配置 项目地址
uri: https://gitee.com/lizhaoandroid/spring-cloud-learning
# 配置 在项目的哪个文件夹
searchPaths: config-v1
# username:
# password:
- 启动类添加注解,@EnableConfigServer
package com.lizhaoblog.scl.pro007configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class Pro007ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(Pro007ConfigServerApplication.class, args);
}
}
配置中心config-client
引入包,spring-cloud-config
修改相关配置,端口8769,
添加一个bootstrap.yml远程配置中心,这个东西会读取远程的配置
写一个controller,用于测试,是否加载到了远程配置
上述步骤关键代码及图片
- 引入包,spring-cloud-config
<?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 http://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.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lizhaoblog.scl</groupId>
<artifactId>pro007-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>pro007-config-client</name>
<description>config-client project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--表示为web工程-->
<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>
<scope>test</scope>
</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>
</project>
- 修改相关配置,端口8769,
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8769
- 添加一个bootstrap.yml远程配置中心,这个东西会读取远程的配置
spring:
application:
name: config-client
cloud:
config:
# 分支
label: pro007-config-properties
# 会去读取config-client-dev
profile: dev
# 自己项目中的config-server
uri: http://localhost:8768/
- 写一个controller,用于测试,是否加载到了远程配置
/*
* Copyright (C), 2015-2019
* FileName: ConfigCientTestController
* Author: zhao
* Date: 2019/4/21 17:41
* Description: 配置中心客户端测试控制器
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.lizhaoblog.scl.pro007configclient.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 〈一句话功能简述〉<br>
* 〈配置中心客户端测试控制器〉
*
* @author zhao
* @date 2019/4/21 17:41
* @since 1.0.0
*/
@RestController
public class ConfigCientTestController {
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi() {
return foo;
}
}
测试
主要步骤
运行eureka,config-server服务
访问http://127.0.0.1:8768/config-client/dev/pro007-config-properties (看总结部分,有网址信息)
运行config-client服务
访问http://127.0.0.1:8769/hi,看下是不是远程的foo值
上述步骤关键代码及图片
- 运行eureka,config-server服务
- 访问http://127.0.0.1:8768/config-client/dev/pro007-config-properties
{"name":"config-client","profiles":["dev"],"label":"pro007-config-properties","version":"b492b6b3ceb2608d41bb0b1114cc64d345676977","state":null,"propertySources":[{"name":"https://gitee.com/lizhaoandroid/spring-cloud-learning/config-v1/config-client-dev.properties","source":{"foo":"foo version 21","democonfigclient.message":"hello spring io"}}]}
- 运行config-client服务
- 访问http://127.0.0.1:8769/hi,看下是不是远程的foo值
foo version 21
总结
一般去搜config都会出来这个表
/{application}/{profile}[/{label}
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
当我想要访问https://gitee.com/lizhaoandroid/spring-cloud-learning/tree/pro007-config-properties/config-v1里面的 config-client-dev.properties文件时,可以输入的网址(1和5):
http://127.0.0.1:8768/pro007-config-properties/config-client-dev.properties
http://127.0.0.1:8768/pro007-config-properties/config-client-dev.properties
详细意思:
{label} 分支 pro007-config-properties
{application} 配置前缀 config-client
{profile} 最后一个-后面的内容 dev
广告时间
我是小王,一个喜欢抛转的码人。
- 所有代码都在这里:https://gitee.com/lizhaoandroid/spring-cloud-learning
- 本片对应的章节:pro007
- 我的csdn:https://lizhao.blog.csdn.net
- 我的联系方式:QQ3060507060
- 我的公众号:lizhaoblog、小王老店
- 我的银行卡及密码:*****************/