分布式配置中心spingcloud-config-server搭建

分布式配置中心spingcloud-config-server

分布式配置中心我的项目早就在使用了,是我一个同事搭建的,对于这个,我只是了解一点。所以抽空自己搭建了一个,其中也发现了不少问题。所以写了这篇文章记录一下搭建过程!相信跟着我写的步骤,,大部分人应该可以搭建成功的!

简介

Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器映射的概念与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。可以轻松添加替代实现,并使用Spring配置将其插入。

以上简介来自springcloud的中文文档

配置中心仓库搭建

这里我们使用github作为我们的配置文件仓库。

  1. 现在github上创建一个仓库,我的仓库名叫springcloud-config-server-repo
  2. 将仓库克隆到本地
  3. 在仓库下新建一个目录,叫config-server-client,里面放三个配置文件

    config-server-client-dev.yml    
    config-server-client-product.yml    
    config-server-client-test.yml
    

    配置文件里面都只有一行。

开发环境

    environment: dev

测试环境

    environment: test

线上环境

    environment: product

一般来说,config-server-client代表你项目的文件,里面三个文件是这个项目开发、测试、线上的三个配置文件!
4. 将配置文件提交到github上。。仓库就已经搭建好了,效果见下图!

image

配置中心服务器端搭建

搭建之前,先介绍一下我使用的springcloud版本。这里我是使用最新的版本。。你们可以把下面代码放到自己项目的父pom依赖中

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


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


    <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/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  1. 新建一个maven工程,取名springcloud-config-server
  2. 修改pom文件,加入如下依赖

    <!--配置中心-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    
  3. 新建配置文件application.yml如下

    server:
        port: 8083
    
    spring:
        application:
            name: config-server
        cloud:
            config:
                server:
                    git:
                        uri: https://github.com/kingrocy/springcloud-config-server-repo.git
                        searchPaths: '{application}' #application代表客户端的名称 这种写法的目的是根据项目名称将配置文件区分开
                        username:
                        password:
                label: master
    
  4. 编写启动类

    package com.yunhui;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    /**
     * @Author: Yun
     * @Description:
     * @Date: Created in 2018-05-24 17:54
     */
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class);
        }
    }
    

到此,我们的配置中心服务器端已经搭建完成了!我们启动应用,在浏览器下输入如下地址进行测试:http://localhost:8083/config-server-client/dev

如果浏览器返回下面json 则代表服务器端搭建完成!

    {
        "name": "config-server-client",
        "profiles": [
            "product"
        ],
        "label": null,
        "version": "9f48ac3dfd2d4bf14d3bef631188fe22dad57a45",
        "state": null,
        "propertySources": [
            {
                "name": "https://github.com/kingrocy/springcloud-config-server-repo.git/config-server-client/config-server-client-product.yml",
                "source": {
                    "environment": "product"
                }
            }
        ]
    }

通过配置中心服务器端访问配置文件有如下几种形式

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

其中application为项目名称 profile为环境名称 label为github 分支名称(默认为master)

踩坑一:通过输入http://localhost:8083/config-server-client/dev在浏览器端返回不了json。。一直返回xml,而且配置中心客户端获取配置文件时,一直获取不到!

解决办法:上面的问题是因为在配置中心的pom文件中导入了一些多余的springcloud的依赖包影响,,将多余的依赖包都移除,重新启动项目,一切正常!

配置中心客户端搭建

  1. 创建项目springcloud-config-server-client

  2. 修改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">
        <parent>
            <artifactId>springcloud</artifactId>
            <groupId>com.yunhui</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>springcloud-config-server-client</artifactId>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.4.RELEASE</version>
            </dependency>
    
            <!-- eureka client需要  若没有,eureka client无法启动(启动后会自动停止)踩坑二 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
        </dependencies>
    </project>
    
  3. 在resource目录下创建bootstrap.yml文件

    server:
        port: 8084
    
    spring:
        application:
            name: config-server-client
        cloud:
            config:
                profile: dev
                label: master
                uri: http://localhost:8083
    
    #springboop 2.0之后 spring-boot-starter-actuator将/refresh等接口关闭了。。通过下面配置开启 踩坑三
    management:
        endpoints:
            web:
                exposure:
                    include: "*"
    

注意:此处的配置文件是叫bootstrap,而不是application。。因为bootstrap配置文件时优先于applictaion加载的。。所以我们在bootsrap中配置配置中心的地址,让项目在启动的时候去拉此项目在配置中心的配置文件,再进行加载!

  1. 创建启动类。。

    package com.yunhui;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author: Yun
     * @Description:
     * @Date: Created in 2018-05-24 18:26
     */
    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    public class ConfigServerClientApplication {
    
        public static void main(String[] args){
            SpringApplication.run(ConfigServerClientApplication.class);
        }
    
        @Value("${environment}")
        String environment;
    
        @RequestMapping("/env")
        public String from() {
            return environment;
        }
    }
    

启动项目,在浏览器中输入http://localhost:8084/env。若浏览器中显示dev,则客户端配置拉取成功!若没有,则检查配置!

配置客户端无需重启动态刷新配置

在之前的步骤中,我们搭建的配置中心服务端以及客户端都已经成功了,客户端已经可以拉取配置中心的配置文件了。但是如果我们改了配置中心的配置文件,,此时我们的客户端是拉取不到最新的配置文件的。。如果想要最新的配置文件生效,还是得将项目重启,此时,我们使用config-server提供的动态刷新配置功能。。

步骤:
1. 客户端pom文件新增依赖

    <!--config-client需要 若没有 则无法刷新配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  1. 在需要刷新的配置上,再其类上加 @RefreshScope注解。。再使用post请求 请求http://localhost:8084/actuator/refresh,这样客户端就会刷新在@RefreshScope下所有使用@Value引用的配置属性了。

至此,springcloud的分布式配置中心已经搭建完成!

项目源码:springcloud学习笔记

猜你喜欢

转载自blog.csdn.net/qq_29992111/article/details/80455340