基于spring-cloud-config的分布式git配置更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Little_Matches/article/details/84112447

首先我们新建一个模块server-config

需要安装rabbitmq,用于推送配置
https://www.cnblogs.com/ericli-ericli/p/5902270.html

引入依赖:

pom.xml

<?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>spring-cloud-config</groupId>
    <artifactId>spring-cloud-config</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <file.encoding>UTF8</file.encoding>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
        </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>

配置文件设置:
需要注意git如果设置为私有仓库,最好用ssh+key,RSA密钥的生成方法就不在这里赘述了,如果为公有的话,哪种方法都可以,这里给出私有仓库的方法

application.properties

#服务端口
server.port=8887
#服务名称
spring.application.name=spring-cloud-config-server
#服务注册中心
eureka.client.service-url.defaultZone=http://localhost:8881/eureka/
#服务的git仓库地址
#支持两种方法:一、url+账号密码 二、ssh+key
#此处使用ssh+key
#spring.cloud.config.server.git.uri=https://gitee.com/leftbehindmatches/spring-cloud-examples.git

#git的ssh地址
spring.cloud.config.server.git.uri=git@gitee.com:leftbehindmatches/spring-cloud-examples.git
#可以使用本地的ssh配置,但这里忽略本地的ssh设置,这里使用远程设置
spring.cloud.config.server.git.ignoreLocalSshSettings= true
#RSA私钥 这里需要拼接起来,全显示绿色才正确, 首行需添加\n\ ,其他行添加\, 倒数第二行添加\n\,最后一行不用加
spring.cloud.config.server.git.privateKey=-----BEGIN RSA PRIVATE KEY-----\n\
MIIEpAIBAAKCAQEA1RtREwf+Gb8EM1brcax9BVMaSwzeUxZQ8ico2AOCK/mbKY4B\
n+tUqJHVUWtTqGx0DbEOjGbqPkwAfel7IZbA8GBn3D0ybDjHSB7dq445p6F7WTUA\
GzL8//loKlLqnS+p5dkB9M36T7pQIO4ic9EnqCtSeD67DYbnYhdG7WGzuvByA5YV\
Sky3CMJF1P0UtX1z7AKRt/MXsM7EaaCrtJOBplR8qOA4E53jU4e1ExZjMKvS8/om\
og7fby4udAKHJaIUsUwyIxlYpDpsL0rF8X2mKwRrlABh3dq4WD1jbu0IAzvk2xZs\
PkI30jS3rIE7TeFTXzopK4HU6Xn/sdrXyOOVeQIDAQABAoIBAQCKKi3EQvhRxPB6\
QK5hgs2DuD9hzTQPdnaAqTbn5k5tKGWa6YDQKAk5SWOeaBFTLw2HGvYtvUO9pBTl\
jYzRWCY7MqXjuqGIXL+HWMurQIjMz/ti+OPavpIde5w3ZI7L3m0uoiWMjEbvjgIJ\
****************************************************************
1po5gu5v/33dw97Fukm9cw+qs2RyX473FHXA4roRAoGAFcdyd15gxL7YqZHmqG1S\
fWn46fFl/QCjPLWqEsFAbK3OoNlId2o+BujiYOgZJX9RN0jvGfOvFoSjdUKfMrRI\
A1MCZidZnkCHPGeN1ELR9BLJriJYbWTYA4+dXfLS7KKqQJPS32vVvT1BYORYHO/E\
P8tybvfNseCTkGLvG6GsybkCgYEAiWuzHlzNL/TCQojOcK+H4a+JTxIc4gfPqDxl\
PS53gdnQKTea7aZQnE7ck+oT4DxDP0tdDKhRpBeycOktKXc7zjBsbKMVpeV/Pe58\
9bKFo2OLa06aMKzMO4gQIpacHq7fWS4MCW76K5LGubfCZoMu5P6ihN0evEgANbcq\
89zQIGECgYAM8ky1izFo6pz2tD6f9Uh+FkBi5ybS9EQPmXlLT01zTaMTNESWj6Vl\
RiJgYFSD79EFAvCn8hXMhHgd/wM1HW8X7wg8XnjhlaSzwfrzOtjt//G0t0MyDFqB\
hZ0WDHwwLhfWLBEaYR457m3v9xRr8uZvbso5JfBL4UWEvNxW41ubaw==\n\
-----END RSA PRIVATE KEY-----


#配置文件所在的目录  这里需要注意的是根路径spring-cloud-examples, 但是路径开头不需要横杆\
spring.cloud.config.server.git.search-paths=spring-cloud-config/config-repo
#配置文件所在的分支
spring.cloud.config.label=master

#这里需要使用rabbitmq来进行刷新
spring.rabbitmq.host=127.0.0.1
#rabbitmq的端口为5672,并不是浏览器查看端口
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

#总线刷新
management.endpoints.web.exposure.include=bus-refresh

在github或者gitee上建立配置文件存放地址:
这里是使用gitee,存放在config-repo:

https://gitee.com/leftbehindmatches/spring-cloud-examples/tree/master/spring-cloud-config/config-repo

新建三个文件,文件名为:a-config-dev.properties

name=match-1
version=dev

a-config-prod.properties

name=match-2
version=prod

a-config-test.properties

name=match-3
version=test

仓库中的配置文件会被转换成web接口,访问可以参照以下的规则:

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

以a-config-dev.properties为例子,它的application是a-config,profile是dev。client会根据填写的参数来选择读取对应的配置。

依次启动eureka-server,spring-cloud-config-server再调用

由于已经设置了配置文件的根路径了,这里直接访问即可

http://localhost:8887/a-config/test

可以看到浏览器返回

{"name":"a-config","profiles":["test"],"label":null,"version":"6d70c58fc75ac8b3f7a2218347c8be67352b710c","state":null,"propertySources":[{"name":"[email protected]:leftbehindmatches/spring-cloud-examples.git/spring-cloud-config/config-repo/a-config-test.properties","source":{"name":"match","age":"18","version":"test"}}]}

再次调用 http://localhost:8887/a-config/dev

可以看到读取到dev的信息

{"name":"a-config","profiles":["dev"],"label":null,"version":"6d70c58fc75ac8b3f7a2218347c8be67352b710c","state":null,"propertySources":[{"name":"[email protected]:leftbehindmatches/spring-cloud-examples.git/spring-cloud-config/config-repo/a-config-dev.properties","source":{"name":"match","age":"18","version":"dev"}}]}

改造eureka-client 为eureka-config

pom.xml

<?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>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <artifactId>eureka-config-client</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <file.encoding>UTF8</file.encoding>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>

    <dependencies>
        <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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>

这里需要

application.properties与bootstrap.properties
不然会报错,原因暂时没找到

application.properties为空
东西都写在bootstrap.properties

server.port=8888
spring.application.name=eureka-config

eureka.client.service-url.defaultZone=http://localhost:8881/eureka/

#这里为配置文件的名称
spring.cloud.config.name=a-config
#这里为配置文件的后缀
spring.cloud.config.profile=dev
#spring.cloud.config.uri=http://localhost:8887/
spring.cloud.config.label=master
#开启Config服务发现支持
spring.cloud.config.discovery.enabled=true
#指定server端的name,也就是server端spring.application.name的值
spring.cloud.config.discovery.serviceId=spring-cloud-config-server

## 刷新时,关闭安全验证
#Spring boot 2.0的改动较大,/bus/refresh全部整合到actuator里面了,变成了/actuator/bus-refresh,所以之前1.x的management.security.enabled全部失效,不适用于2.0
#2.0的properties配置是这样的:
management.endpoints.web.exposure.include=bus-refresh
## 开启消息跟踪
spring.cloud.bus.trace.enabled=true

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

application.java:

package top.littlematch.eureka.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RefreshScope
@RestController
public class EurekaConfigApplication {
    public static void main(String[] args){
        SpringApplication.run(EurekaConfigApplication.class, args);
    }

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

    @RequestMapping("/hello")
    public String hello(@RequestParam(name = "name") String name) {
        return "你好," + name + "。版本号:" + version;
    }
}

启动eureka-config, 浏览器访问:

http://localhost:8888/hello?name=match

你好,match。版本号:dev

修改a-config-dev.properties文件

name=match_1
version=test

修改版本号后, push到git

使用连接刷新配置
(2.0的刷新连接变更为如下)
http://localhost:8888/actuator/bus-refresh

再次访问, 已实现刷新:

http://localhost:8888/hello?name=match

你好,match。版本号:test

gitee代码地址: https://gitee.com/leftbehindmatches/spring-cloud-examples/tree/master/spring-cloud-config

猜你喜欢

转载自blog.csdn.net/Little_Matches/article/details/84112447
今日推荐