SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config

Spring Cloud Config

  • 快速入门
    • 构建配置中心
    • 配置规则详解
    • 客户端配置映射
  • 服务端详解
    • Git配置仓库
    • SVN配置仓库
    • 本地文件系统
    • 安全保护
    • 高可用配置
  • 客户端详解
    • URI指定配置中心
    • 服务化配置中心
    • 失败快速响应与重试
    • 获取远程配置

快速入门

构建配置中心

通过SpringCloudConfig构建一个分布式配置中心,分成三步:

  • 创建一个基础的Spring Boot工程,命名为config-server,在pom.xml中引入依赖:
<dependencies>
	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-config-serverartifactId>
		<version>1.4.5.RELEASEversion>
	dependency>
dependencies>
  • 创建Spring Boot的程序主类,并添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能
@EnableConfigServer
@SpringBootApplication
public class HelloApplication {
     
	public static void main(String[] args) {
     
		SpringApplication.run(HelloApplication.class, args);
	}
}
  • 在application.properties中添加配置服务的基本信息以及Git仓库的相关信息
spring.application.name=config-server
server.port=7001
spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

spring.cloud.config.server.git.uri:配置Git仓库位置
spring.cloud.config.server.git.searchPaths:配置仓库路径下的相对搜索位置,可以配置多个
spring.cloud.config.server.git.username:访问Git仓库的用户名
spring.cloud.config.server.git.password:访问Git仓库的密码

配置规则详解

在码云上建立自己的git仓库http://git.oschina.net/dongarea/SpringCloud-Learning/,新建四个配置文件

dongarea.properties
dongarea-dev.properties
dongarea-test.properties
dongarea-prod.properties

并为每个配置文件设置不同的值,如下:

from=git-default-1.0
from=git-dev-1.0
from=git-test-1.0
from=git-prod-1.0

同时创建一个config-label-test分支,并将各配置文件中的值用2.0作为后缀
启动应用,访问配置信息的URL与配置文件的映射关系如下所示:

  • /{application}/{profile}[/{label}]
    如:访问http://localhost:7001/dongarea/prod/config-label-test
{
    "name":"dongarea",
    "profiles":[
        "prod"
    ],
    "label":"config-label-test",
    "version":"4b2a044ee54afe2e849aa3b1d747a3d60aa959eb",
    "state":null,
    "propertySources":[
        {
            "name":"http://git.oschina.net/dongarea/SpringCloud-Learning/spring_cloud_in_action/dongarea-prod.properties",
            "source":{
                "from":"git-prod-2.0"
            }
        },
        {
            "name":"http://git.oschina.net/dongarea/SpringCloud-Learning/spring_cloud_in_action/dongarea.properties",
            "source":{
                "from":"git-default-2.0"
            }
        }
    ]
}
  • /{application}-{profile}.yml
    如:
    SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config_第1张图片
    -/{label}/{application}-{profile}.yml
    比如:访问localhost:7001/config-label-test/dongarea-prod.yml
    SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config_第2张图片

客户端配置映射

  • 创建一个Spring Boot应用,命名为config-client,并在pom.xml中引入下述依赖:
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
		<version>1.4.5.RELEASE</version>
	</dependency>
</dependencies>
  • 创建Spring Boot主类
@SpringBootApplication
public class HelloApplication {
     
	public static void main(String[] args) {
     
		SpringApplication.run(HelloApplication.class, args);
	}
}
  • 创建bootstrap.properties配置,来指定获取配置文件的config-server位置
spring.application.name=dongarea
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
server.port=7002

spring.application.name:对应配置文件规则中的{application}部分
spring.cloud.config.profile:对应配置文件规则中的{profile}部分
spring.cloud.config.label:对应配置文件规则中的{label}部分
spring.cloud.config.uri:配置中心config-server的地址
这些属性必须配置在bootstrap.properties中,因为jar包之外的配置会优先

  • 创建一个RESTful接口来返回配置中心的from属性,通过@Value绑定配置服务中配置的from属性
@RefreshScope
@RestController
public class TestController {
     
    @Value("${from}")
    private String from;
    @RequestMapping("/from")
    public String from(){
     
        return this.from;
    }
}

启动config-server应用,再启动config-client应用,访问http://localhost:7002/from,可以获取配置内容并输出对应环境的from内容

服务端详解

Git配置仓库

连接Git在线开发:

spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

本地离线开发(仅供测试使用):

spring.cloud.config.server.git.uri=file://${user.name}/config-repo

SVN配置仓库

  • 在pom.xml中引入SVN的依赖配置
<dependency>
	<groupId>org.tmatesoft.svnkitgroupId>
	<artifactId>svnkitartifactId>
	<version>1.8.10version>
dependency>
  • 在application.properties中使用SVN的配置属性来指定SVN服务器的位置
spring.cloud.config.server.svn.uri=svn://localhost:443/dongarea/SpringCloud-Learning/
spring.cloud.config.server.svn.search-paths=/spring_cloud_in_action
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password

本地文件系统

使用本地文件系统的存储方式来保存配置信息,通过spring.profiles.active=native来实现
指定具体的配置文件位置:spring.cloud.config.server.native.searchLocations
为了更好的内容管理和版本控制,建议还是使用Git仓库的方式

安全保护

  • 在配置中心config-server的pom.xml中加入依赖
<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-securityartifactId>
dependency>

并修改配置文件:

security.user.name=user
security.user.password=123456

如果在客户端不配置相应的安全信息,则会报下面的错误:
SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config_第3张图片
在客户端也配置上安全信息,则通过校验

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

这种安全信息就像是暗号一样,需要双方都有才可以

高可用配置

  • 传统模式:
    多个Config Server对应一个Git仓库,通过负载均衡返回给客户端,实现高可用
    SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config_第4张图片
  • 服务模式:
    可将ConfigServer作为一个普通的微服务应用,纳入到Eureka的服务治理体系中.
    这样我们的微服务应用就可以通过配置中心的服务名来获取配置信息,这种方式比起传统的方式来说更加有利于维护,因为对于服务端的负载均衡配置和客户端的配置中心指定都通过服务治理机制一并解决了,既实现了高可用,也实现了自维护

客户端详解

URI指定配置中心

默认Spring Cloud Config会尝试连接http://localhost:8888
bootstrap.properties中配置服务端配置中心地址,才会覆盖默认配置

服务化配置中心

服务端配置

  • 修改config-server的pom.xml,增加spring-cloud-starter-eureka依赖,以实现将分布式配置中心加入Eureka的服务治理体系
<dependencies>
	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-config-serverartifactId>
		<version>1.4.5.RELEASEversion>
	dependency>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-securityartifactId>
	dependency>
	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-starter-eurekaartifactId>
		<version>1.4.6.RELEASEversion>
	dependency>
dependencies>
  • 在application.properties中配置参数eureka.client.serviceUrl.defaultZone以指定服务注册中心的位置
spring.application.name=config-server
server.port=7001
#Git配置管理
spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=dongarea
spring.cloud.config.server.git.password=j7k8l9;0

security.user.name=user
security.user.password=123456
#配置服务注册中心
eureka.client.service-url.defaultZone=http://localhost:1111/eureka
  • 在应用主类中,加上@EnableEurekaClient注解将config-server注册到服务注册中心上
@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class HelloApplication {
     
	public static void main(String[] args) {
     
		SpringApplication.run(HelloApplication.class, args);
	}
}
  • 启动应用,访问http://localhost:1111/,可以看到服务已经注册上去了
    config-server注册服务
    客户端配置:
  • 在config-client的pom.xml中新增spring-cloud-starter-eureka依赖,以实现客户端发现config-server服务
<dependencies>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-webartifactId>
	dependency>

	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-starter-configartifactId>
		<version>1.4.5.RELEASEversion>
	dependency>
	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-starter-eurekaartifactId>
		<version>1.4.6.RELEASEversion>
	dependency>
dependencies>
  • 在bootstrap.properties中,按如下配置:
spring.application.name=dongarea
spring.cloud.config.profile=dev
#指定服务注册中心,用于服务注册与发现
eureka.client.service-url.defaultZone=http://localhost:1111/eureka;
server.port=7002
#开启通过服务来访问Config Server的功能
spring.cloud.config.discovery.enabled=true
#指定Config Server注册的服务名
spring.cloud.config.discovery.service-id=config-server
spring.cloud.config.username=user
spring.cloud.config.password=123456
  • 在主类中,加入@EnableEurekaClient,用来发现config-server服务
@EnableEurekaClient
@SpringBootApplication
public class HelloApplication {
     
	public static void main(String[] args) {
     
		SpringApplication.run(HelloApplication.class, args);
	}
}
  • 完成配置后,启动应用并访问http://localhost:1111/,可以看到服务已经注册成功了
    Config Client
  • 继续访问http://localhost:7002/from/,返回如下页面
    SPRING CLOUD微服务实战笔记--分布式配置中心:Spring Cloud Config_第5张图片

失败快速响应与重试

在不启动config-server的情况下,启动客户端config-client时,会报错:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed;

主要是在报错之前,已经加载了很多东西
在bootstrap.properties中加上spring.cloud.config.failFast=true,直接验证config-server配置是否有误,加载信息少很多,达到了快速返回失败的效果

java.lang.IllegalStateException: No instances found of configserver (config-server)

在网络波动等其他间隙性原因导致的问题时,可以开启重试功能

  • 修改客户端的pom.xml,增加spring-retryspring-boot-starter-aop依赖:
<dependency>
	<groupId>org.springframework.retrygroupId>
	<artifactId>spring-retryartifactId>
dependency>
<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-aopartifactId>
dependency>
  • 启动客户端应用,显示客户端连接Config Server失败之后,会继续尝试,直到第6次失败之后,才返回错误信息

获取远程配置

通过URL和客户端配置的访问对应可以总结如下:

  • 通过向Config Server发送GET请求以直接的方式获取,可用下面的链接形式
    不带{label}分支信息,默认访问master分支,可使用
    1)/{application}-{profile}.yml
    2)/{application}-{profile}.properties
    带{label}分支信息,可使用:
    1)/{application}/{profile}[/{label}]
    2)/{/label}/{application}-{profile}.yml
    3)/{label}/{application}-{profile}.profile
  • 通过客户端配置方式加载的内容如下所示:
    1)spring.application.name:对应配置文件中的{application}内容
    2)spring.cloud.config.profile:对应配置文件中的{profile}内容
    3)spring.cloud.config.label:对应分支内容,如不配置,默认为master

你可能感兴趣的:(SpringCloud,SpringCloud)