http://118.25.172.253/2018/11/16/分布式配置中心spingcloud-config-server搭建/html
分布式配置中心个人项目早就在使用了,是我一个同事搭建的,对于这个,我只是了解一点。因此抽空本身搭建了一个,其中也发现了很多问题。因此写了这篇文章记录一下搭建过程!相信跟着我写的步骤,,大部分人应该能够搭建成功的!经过这篇文章后,你也能够学会单机、集群下实现应用的热部署java
Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。使用Config Server,您能够在全部环境中管理应用程序的外部属性。客户端和服务器映射的概念与Spring Environment和PropertySource抽象相同,所以它们与Spring应用程序很是契合,但能够与任何以任何语言运行的应用程序一块儿使用。随着应用程序经过从开发人员到测试和生产的部署流程,您能够管理这些环境之间的配置,并肯定应用程序具备迁移时须要运行的一切。服务器存储后端的默认实现使用git,所以它轻松支持标签版本的配置环境,以及能够访问用于管理内容的各类工具。能够轻松添加替代实现,并使用Spring配置将其插入。git
以上简介来自springcloud的中文文档github
这里咱们使用github做为咱们的配置文件仓库。web
如今github上建立一个仓库,个人仓库名叫springcloud-config-server-repospring
将仓库克隆到本地apache
在仓库下新建一个目录,叫config-server-client,里面放三个配置文件json
config-server-client-dev.yml
config-server-client-product.yml
config-server-client-test.yml
复制代码
配置文件里面都只有一行。bootstrap
开发环境后端
environment: dev
复制代码
测试环境
environment: test
复制代码
线上环境
environment: product
复制代码
通常来讲,config-server-client表明你项目的文件,里面三个文件是这个项目开发、测试、线上的三个配置文件! 4. 将配置文件提交到github上。。仓库就已经搭建好了,效果见下图!
搭建以前,先介绍一下我使用的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>
复制代码
新建一个maven工程,取名springcloud-config-server
修改pom文件,加入以下依赖
<!--配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
复制代码
新建配置文件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
复制代码
编写启动类
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的依赖包影响,,将多余的依赖包都移除,从新启动项目,一切正常!
建立项目springcloud-config-server-client
修改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>
复制代码
在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中配置配置中心的地址,让项目在启动的时候去拉此项目在配置中心的配置文件,再进行加载!
建立启动类。。
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提供的动态刷新配置功能。。
步骤:
客户端pom文件新增依赖
<!--config-client须要 若没有 则没法刷新配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
在须要刷新的配置上,再其类上加 @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
就可使集群中机器自动刷新配置,实现热部署!
上面的配置修改后,须要人工去请求单机或集群的接口来实现热部署。这是比较浪费资源的。咱们能够经过git的webhook的来实现自动化构建操做。这样的话,在咱们推送代码到线上分支时,git会自动监控文件,若是文件发生了变化,就能够调用咱们的/actuator/bus-refresh
实现集群热部署了。
至此,springcloud的分布式配置中心已经搭建完成!