分布式配置中心SpringCloud Config

分布式配置中心SpringCloud Config

快速入门

构建配置中心

构建 config-server 9012 项目

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zk.springcloud.config</groupId>
    <artifactId>springcloud-config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud-config</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</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>

启动类

@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 依赖

<?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>

    <groupId>com.zk.springcloud.config</groupId>
    <artifactId>springcloud-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud-config-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

    <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>
        </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>

启动类

@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 依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

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

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 项目改造

添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

配置文件

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

启动类添加注解 @EnableDiscoveryClient

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

config-client 9013 项目改造

添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

配置文件,在 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 添加如下依赖

        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

重启 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 依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

添加 @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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值