zoukankan      html  css  js  c++  java
  • SpringCloud-分布式配置中心(基于SpringBoot2.X)

    一、配置中心的作用:可以将多种应用的配置进行集中式的管理,将这些配置统一存放到git或svn里面存储;

    二、搭建SpringCloud-Config-Server

    2.1如图后续步骤勾选Config Server即可;

    创建好后的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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>me.silentdoer</groupId>
        <artifactId>springcloud-config-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springcloud-config-server</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.RELEASE</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>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    
    </project>
    

      

    2.2创建好后在Application上加上@EnableConfigServer注解,并且修改application.properties文件(貌似SpringCloud的标准文件是bootstrap.properties|yml,但是我用application.properties也可以,如果同时存在据说bootstrap.properties优先于application.properties)为:

    # config-server服务的端口
    server.port=8888
    # 服务名 spring.application.name=config-server #表示这个是config-server不需要去发现服务,它不依赖其他服务 spring.cloud.config.discovery.enabled=false # 配置git仓库地址 spring.cloud.config.server.git.uri=https://github.com/Silentdoer/config-server-repo.git # 配置仓库的搜索目录,必须配置(相对于根目录),如果要填写多种应用的配置可以用英文逗号分隔 spring.cloud.config.server.git.search-paths=qq-api,wechat-api # 配置仓库的分支 spring.cloud.config.label=master # 访问git仓库的用户名,如果是私密仓库需要填这两个 #spring.cloud.config.server.git.username=xxxx # 访问git仓库的用户密码 #spring.cloud.config.server.git.password=xxxx

    到这里,SpringCloud的Config-Server就创建好了;

    可以启动Config-Server,然后访问http:localhost:8888/qq-prod.properties来看server是否启动成功;(如果用的是properties格式的配置还需要添加额外的转换器否则消费者看到的是中文乱码【浏览器看到是乱码可以不用管】)

    我这边访问后是这样子:

    注意,这里的访问方式有很多种:(这里用的是第二种,第一种的label是可以省略的)

    • /{application}/{profile}[/{label}]
    • /{application}-{profile}.yml
    • /{label}/{application}-{profile}.yml
    • /{application}-{profile}.properties
    • /{label}/{application}-{profile}.properties

    三、接着我们来创建Config-Server的消费服务,这里比如就叫qq-api;(注意这是个普通的Webapp,只不过添加了Config-Client的功能)

    步骤和上面差不多,不过勾选时要勾选Ops里的Actuator和Config Client和以及Web应用相关的东西(根据自己需求);

    创建好后的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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>me.silentdoer</groupId>
        <artifactId>springcloud-qq-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springcloud-qq-api</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <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.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </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>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    
    </project>
    

      

    接着将qq-api的application.properties内容改为:

    #application.properties可以认为是application-default.properties
    server.port=8080
    # 和git里的文件名对应
    spring.application.name=qq-prod
    # 远程仓库的分支
    spring.cloud.config.label=master
    # 和git里的文件名对应
    spring.cloud.config.profile=prod
    # 指明配置服务中心的网址
    spring.cloud.config.uri=http://localhost:8888/
    # 暴露刷新配置的接口,然后调用curl -X POST http://localhost:8080/actuator/refresh即可刷新配置,但是相关的bean仍然需要@RefreshScope
    # 否则虽然这个config-client程序里的某个properties属性刷新了,但是它的老的值已经赋值给了这个bean的对应的属性,所以还是用的老的bean值;
    management.endpoints.web.exposure.include=health,info,refresh
    

    然后再添加一个Controller用于测试:

    @RestController
    @RequestMapping("/api/backstage/test")
    @RefreshScope
    public class TestController {
    
        @Value("${country:瓜瓜国}")
        private String country;
    
        @GetMapping("test1")
        public String test1() {
            System.out.println(this.country);
            return this.country;
        }
    }
    

    这里的@RefreshScope是为了调用curl -X POST http://localhost:8080/actuator/refresh是能够将这个bean刷新从而应用最新的配置值;

    调用该接口获取的配置就是在Git仓库里的配置,如果commit更新了该key的value值,那么调用refresh后这里再调用接口获取的会是最新的配置值;

    四、健康监测

    通过GET请求调用http://localhost:8080/actuator/health,然后可以看到{"status":"UP"},这里UP表示Config-Server是好的,如果是DOWN那么表示无法连接到Config-Server;

    五、到此就结束了,SpringCloud的配置中心还是比较简单是实现的,后续还可以结合MQ和消息总线来实现更新配置文件后自动通知应用来刷新配置;

    六、一些有问题的地方:

    1.经过测试,如果通过spring.cloud.config.name来读取多配置(必需在指定的搜索目录的根目录【Git根目录也默认会搜索】,网上的searchPaths的*不是指同时搜索子目录,而是如xxx*表示xxx开头的目录,但内部的子目录不会搜索),那么qq-api是能够读取到wechat-api里的配置的,所以这里的配置中心其实不是为多种应用准备的?

  • 相关阅读:
    Haproxy的安装与配置
    keepalived工作原理和配置说明
    服务器集群与负载均衡基础知识
    Linux磁盘分区与格式化
    第12章 在.NET中操作XML
    第16章 多线程
    第10章 网络编程
    第8章 流和序列化
    关于引用类型作为参数加上ref与不加ref的区别
    第3章 C#中的委托和事件
  • 原文地址:https://www.cnblogs.com/silentdoer/p/10402423.html
Copyright © 2011-2022 走看看