内容简介:分布式配置中心我的项目早就在使用了,是我一个同事搭建的,对于这个,我只是了解一点。所以抽空自己搭建了一个,其中也发现了不少问题。所以写了这篇文章记录一下搭建过程!相信跟着我写的步骤,,大部分人应该可以搭建成功的!通过这篇文章后,你也可以学会单机、集群下实现应用的热部署Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器映射的概念与Spring Environment和Property
分布式配置中心我的项目早就在使用了,是我一个同事搭建的,对于这个,我只是了解一点。所以抽空自己搭建了一个,其中也发现了不少问题。所以写了这篇文章记录一下搭建过程!相信跟着我写的步骤,,大部分人应该可以搭建成功的!通过这篇文章后,你也可以学会单机、集群下实现应用的热部署
简介
Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器映射的概念与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。可以轻松添加替代实现,并使用Spring配置将其插入。
以上简介来自 springcloud的中文文档
配置中心仓库搭建
这里我们使用github作为我们的配置文件仓库。
-
现在github上创建一个仓库,我的仓库名叫springcloud-config-server-repo
-
将仓库克隆到本地
-
在仓库下新建一个目录,叫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上。。仓库就已经搭建好了,效果见下图!
配置中心服务器端搭建
搭建之前,先介绍一下我使用的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
就可以使集群中机器自动刷新配置,实现热部署!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 分布式 配置中心
- Zabbix分布式配置
- 分布式配置中心 duic
- 阿里云推出应用配置管理大杀器 ACM,分布式架构下配置推送秒级生效
- 轻松构建微服务之分布式配置中心
- 分布式配置中心:Spring Cloud Config
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。