分布式配置中心SpringCloud Config

分布式配置中心SpringCloud Config

文章目录

    • 分布式配置中心SpringCloud Config
      • 快速入门
        • 构建配置中心
        • 配置规则详解
        • 客户端配置映射
      • Git 配置仓库
      • 本地仓库
      • 属性覆盖
      • 安全保护
      • 服务化配置中心
      • 失败快速响应与重试
      • 动态刷新配置

快速入门

构建配置中心

构建 config-server 9012 项目

pom 依赖


<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.0modelVersion>

    <groupId>com.zk.springcloud.configgroupId>
    <artifactId>springcloud-configartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>jarpackaging>

    <name>springcloud-configname>
    <description>Demo project for Spring Bootdescription>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.5.RELEASEversion>
        <relativePath/> 
    parent>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <java.version>1.8java.version>
        <spring-cloud.version>Finchley.SR1spring-cloud.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-config-serverartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>


project>

启动类

@SpringBootApplication
@EnableConfigServer
public class SpringcloudConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConfigApplication.class, args);
    }
}

配置文件

spring.application.name=config-server
server.port=9012

spring.cloud.config.server.git.uri=http://www.github.com/LJaer/zkTest.git
spring.cloud.config.server.git.search-paths=spring_cloud_in_action/config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=123456

配置规则详解

spring_cloud_in_action/config-repo 目录下创建四个文件

didispace.properties
didispace-dev.properties
didispace-test.properties
didispace-prod.properties

文件内容分别为

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

访问:http://localhost:9012/didispace/prod/master 返回

{"name":"didispace","profiles":["prod"],"label":"master","version":"921fa4b99b5b35d7aa48a4a1ab420895463c6e58","state":null,"propertySources":[{"name":"http://hcgit.hengchang6.com/zhangkai170308/zkTest.git/spring_cloud_in_action/config-repo/didispace-prod.properties","source":{"from":"git-prod-1.0"}},{"name":"http://hcgit.hengchang6.com/zhangkai170308/zkTest.git/spring_cloud_in_action/config-repo/didispace.properties","source":{"from":"git-default-1.0"}}]}

访问:http://localhost:9012/didispace-prod.properties 返回

from: git-prod-1.0

访问: http://localhost:9012/master/didispace-prod.properties 返回

from: git-prod-1.0

客户端配置映射

创建 config-client 9013 项目

pom 依赖


<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.0modelVersion>

    <groupId>com.zk.springcloud.configgroupId>
    <artifactId>springcloud-config-clientartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>jarpackaging>

    <name>springcloud-config-clientname>
    <description>Demo project for Spring Bootdescription>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.5.RELEASEversion>
        <relativePath/> 
    parent>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <java.version>1.8java.version>
        <spring-cloud.version>Finchley.SR1spring-cloud.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-configartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>


project>

启动类

@SpringBootApplication
public class SpringcloudConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConfigClientApplication.class, args);
    }
}

配置文件需要命名为:bootstrap.properties

spring.application.name=didispace
server.port=9013

spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:9012/

访问:http://localhost:9013/from 获得 git-dev-1.0

Git 配置仓库

使用本地仓库,脱离 Git 服务端

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

${user.home} 代表当前用户的所属目录

本地仓库

指定一个固定的位置存储

spring.cloud.config.server.git.basedir=
spring.cloud.config.server.svn.basedir=

属性覆盖

加载 config 9012 项目里

spring.cloud.config.server.overrides.name=didi
spring.cloud.config.server.overrides.from=shanghai

访问 http://localhost:9013/from 返回 shanghai

安全保护

config 9012 项目里添加 Spring Security 依赖

        
            org.springframework.boot
            spring-boot-starter-security
        

启动后打印,生成随机秘密吗

2018-10-10 10:59:52.727  INFO 53668 --- [           main] .s.s.UserDetailsServiceAutoConfiguration : 

Using generated security password: e1815bf6-2207-4b48-8dcc-219a81c6c2aa

使用自定义密码

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

客户端 config-client 配置如下

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

服务化配置中心

config-server 9012 项目改造

添加依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

配置文件

eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/

启动类添加注解 @EnableDiscoveryClient

访问 http://localhost:9001/ 查看到 CONFIG-SERVER 已注册到 Eureka

config-client 9013 项目改造

添加依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

配置文件,在 bootstrap.properties

eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/
#直接访问配置中心
#spring.cloud.config.profile=dev
#spring.cloud.config.label=master
#spring.cloud.config.uri=http://localhost:9012/

eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/

#通过注册中心访问配置中心	
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=CONFIG-SERVER

启动类添加注解 @EnableDiscoveryClient

访问 http://localhost:9001/ 查看到 DIDISPACE 已注册到 Eureka

访问 http://localhost:9013/from 可以获得 shanghai

失败快速响应与重试

当 config-server 9012 服务关闭下,config-client 失败快速响应

在 config-client 9013 配置文件 bootstrap.properties 添加如下配置

spring.cloud.config.fail-fast=true

在未配置该属性之前,不启动 config-server 9012 ,直接启动 config-client 9013 打印一堆其他加载内容和报错

2018-10-10 15:32:25.796 ERROR 52624 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'from' in value "${from}"

加上该属性后,重试,加载内容变少,快速响应失败

2018-10-10 15:34:39.677 ERROR 35584 --- [           main] o.s.boot.SpringApplication               : Application run failed
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing

重试

spring.cloud.config.fail-fast=true

该配置开启的前提下,客户端 config-client 9013 添加如下依赖

        
            org.springframework.retry
            spring-retry
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

重启 config-client 9013 连接 config-server 失败后,会进行重试

可以自定义

#重试间隔时间,默认为 1000 毫秒
spring.cloud.config.retry.multiplier=
#下一次间隔的乘数,默认1.1
spring.cloud.config.retry.initial-interval=
#最大间隔时间,默认 2000 毫秒
spring.cloud.config.retry.max-interval=
#最大尝试次数,默认6
spring.cloud.config.retry.max-attempts=

动态刷新配置

Spring Boot 2.0 迁移指南

Spring Cloud系列(二) 应用监控与管理Actuator

config-server 9012 配置文件注释,并且开启 actuator 下其他路径

#spring.cloud.config.server.overrides.name=didi
#spring.cloud.config.server.overrides.from=shanghai
management.endpoints.web.exposure.include=*

添加 pom 依赖

        
            org.springframework.boot
            spring-boot-starter-actuator
            2.0.2.RELEASE
        

添加 @RefreshScope 注解

@RestController
@RefreshScope
public class TestController {

    @Value("${from}")
    private String from;

    @GetMapping("/from")
    public String from(){
        return this.from;
    }

}

访问 http://localhost:9013/from 获得 git-default-1.0

修改 git 上 git-default-1.0 为 git-default-2.0 ,再访问 http://localhost:9013/from 获得 git-default-1.0

POST 方式访问 http://localhost:9013/actuator/refresh 会返回 [“config.client.version”,“from”]

访问 http://localhost:9013/from 获得 git-default-2.0

你可能感兴趣的:(框架学习)