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

栏目: 后端 · 发布时间: 7年前

内容简介:分布式配置中心我的项目早就在使用了,是我一个同事搭建的,对于这个,我只是了解一点。所以抽空自己搭建了一个,其中也发现了不少问题。所以写了这篇文章记录一下搭建过程!相信跟着我写的步骤,,大部分人应该可以搭建成功的!通过这篇文章后,你也可以学会单机、集群下实现应用的热部署Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器映射的概念与Spring Environment和Property

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

简介

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上。。仓库就已经搭建好了,效果见下图!

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

配置中心服务器端搭建

搭建之前,先介绍一下我使用的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>
     
             <!-- 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.context.config.annotation.RefreshScope;
     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
     @RestController
     @RefreshScope
     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>
    复制代码
  2. 在需要刷新的配置上,再其类上加 @RefreshScope注解。。再使用post请求 请求 {客户端IP}:{客户端端口}/actuator/refresh 这个url,这样客户端就会刷新在@RefreshScope下所有使用@Value引用的配置属性了。

通过上面两个步骤,我们实现了单机情况下的客户端获取最新配置文件的方法.但这个方法是基于我们的客户端很少,没有几个的情况下,我们可以用这种人工的方式。但是在我们的客户端是一个大的集群,里面的机器有几十甚至上百,那采取这种方式就是不可行的。所以我们需要采用下面的这种方式来集群推送配置信息

集群下热部署

原理:

集群下的消息推送是依赖于消息队列,配置中心能够主动进行信息推送,将最新的配置信息通过消息队列分发到集群的机器中,集群中的机器自动读取,重新加载
复制代码

步骤:(注意:以下步骤需要在配置中心服务器和客户端都需要进行操作的)

  • pom文件中添加springcloud的封装的消息组件

    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bus-amqp</artifactId>
      </dependency>
    复制代码
  • spring-cloud-starter-bus-amqp默认是整合rabbitmq,我们只需在配置文件中加入rabbitmq的相关配置信息即可使用

    spring:    
          rabbitmq:
              host: 192.168.0.16
              port: 5672
              username: 用户名
              password: 密码
    复制代码

通过上面的配置,配置中心服务器和客户端就会在启动的时候自动连上rabbitmq。springcloud提供了一个api给消息集群。通过post请求调用集群中的任意一台机器(包括配置中心服务器和客户端)的下面这个url {ip}:{port}/actuator/bus-refresh 就可以使集群中机器自动刷新配置,实现热部署!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Usability for the Web

Usability for the Web

Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95

Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具