前言

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3

本文基于前面的文章eureka-server的实现。

参考

概述

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,所以需要分布式配置中心组件。Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。

本篇涉及项目的结构为一个Config Server单机模式和适用于链接Git仓库,一个Config Client通过server来展示配置文件数据。 同时使用两个bus来模拟配置文件刷新。

创建config-server工程

Config-server功能

  • 用于外部配置的http,基于资源的api
  • 加密和解密属性
  • 使用可嵌入spring boot的应用程序

1.1 创建配置中心server:config-server

1.2 添加config-server的pom.xml相关依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.3 添加config-server的application添加配置信息

#加载本地文件配置
spring:
application:
name: config-server
profiles:
active: native #加载本地配置
cloud:
config:
server:
native: #加载本地目录文件
search-locations: /Users/xxxx/config-server server:
port: 13081 eureka:
instance:
hostname: eureka1.client.com
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

1.4 启动类ConfigServerApplication增加注解

package spring.cloud.demo.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication { public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
} }

至此,一个单机本地config-server就搭建完成

1.5 创建配置中心client:config-client

1.6 添加config-client的pom相关依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.7添加config-client的bootstrap.yml相关配置(注意这里不是application.yml)

bootstrap.yml

spring:
application:
name: config-client
cloud:
config:
label: master
profile: dev
fail-fast: true
uri: http://localhost:13081 #通过域名访问配置中心服务端
discovery:
enabled: true
eureka:
instance:
hostname: eureka1.client.com
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

1.8新建从服务端请求的配置文件config-client-dev.yml

客户端从服务端获取资源配置的路径规则:

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

本文采用第二种规则。

配置内容:

spring:
application:
name: config-client server:
port: 52601 eureka:
instance:
hostname: eureka1.client.com
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/ info: local-config-client-dev

将新建的config-client-dev.yml放到config-server配置的/Users/xxxx/config-server目录下,如果config-server没有配置目录,默认使用resources目录下。

1.9 ConfigClientApplication增加注解

package spring.cloud.demo.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientApplication { public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
} }

2.0 创建测试类

在config-client创建测试Controller:ConfigClientController

package spring.cloud.demo.configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* 测试是否能获取到配置信息的controller
* @auther: maomao
* @DateT: 2019-09-17
*/
@RestController
public class ConfigClientController { @Value("${info}")
private String info; @RequestMapping("/config/info")
public String info() {
return info;
} }

2.1 启动相关服务

分别启动eureka-server、config-server、config-client。访问:http://localhost:52601/config/info,显示如下

证明本地配置文件已经生效。

2.2 从远程git加载资源配置文件

修改config-server的application.yml配置文件:

##加载本地文件配置
#spring:
# application:
# name: config-server
# profiles:
# active: native #加载本地配置
# cloud:
# config:
# server:
# native: #加载本地目录文件
# search-locations: /Users/fengfujie/config-server #加载远程git仓库资源文件
spring:
application:
name: config-server
cloud:
config:
server:
git:
# 配置git仓库的地址
uri: https://github.com/fengfujie25/sping-cloud-config
# git仓库的账号
username: xxxxxx
# git仓库的密码
password: xxxxxx server:
port: 13081 eureka:
instance:
hostname: eureka1.client.com
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

重新启动config-server服务。然后刷新http://localhost:52601/config/info地址,显示如下

证明已经成功获取了远程git资源的配置信息。

2.3 通过服务名称访问config-server

以上配置都是通过域名访问的config-server,为了保证系统的高可用,因为生产环境的配置服务中心都是集群配置,所有客户端才通过服务名称来访问。

修改config-client的bootstrap.yml

spring:
application:
name: config-client
cloud:
config:
label: master
profile: dev
fail-fast: true
#uri: http://localhost:13081 #通过域名访问配置中心服务端
discovery:
enabled: true
service-id: config-server #通过服务访问配置中心服务端 eureka:
instance:
hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

spring.cloud.config.discovery.service-id:通过服务名称访问配置中心服务端

重新启动config-client.并访问http://localhost:5301/config/info,显示结果同【2.2】则代表配置信息已生效,证明是通过服务名称访问的config-server.

至此,spring cloud集成config的配置就全部完成。但是存在一个问题,如果修改远程git仓库的资源配置,项目并不会刷新,所以配置信息是不生效的。

2.4 动态刷新config-server配置

动态刷新config-serve配置方式

  • 基于RabbitMQ动态刷新
  • 原生刷新(伪动态刷新)

本文采用比较简单的原生刷新方式。

2.4.1增加相关pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.4.2 在ConfigClientController增加@RefreshScope注解
package spring.cloud.demo.configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @auther: maomao
* @DateT: 2019-09-17
*/
@RestController
@RefreshScope
public class ConfigClientController { @Value("${info:error}")
private String info; @RequestMapping("/config/info")
public String info() {
return info;
} }

此方式同时还要修改@Value注解内容为@Value("${info:error}"),因为刷新的时候需要配置信息有默认值,否则会报错。

2.4.3 重新启动config-client

访问http://localhost:5301/config/info,看服务是否可以正常访问。

然后可以修改git资源仓库中的配置信息。

  • 刷新http://localhost:5301/config/info,结果显示:

证明refresh已经生效。

此方式每次都需要手动刷新一下才行,比较麻烦。GitHub提供一种Webhooks方法可以实现不用每次手动刷新。

Payload URL: 触发后回调的URL

Content type: 数据格式,两种一般使用json

Secret: 用作给POST的Body加密的字符串,采用HMAC算法

Events: 触发的事件列表

事件类型 描述
Just the push event 仓库有push的时候触发,默认事件
Send me everything 派我来一切
Let me select individual events 选择个别事件

这样我们就可以利用Webhook的机制去触发客户端的更新,但是当客户端越来越多的时候,Webhook机制也不够优雅,每次增加客户端都需要改动Webhook也不现实。

其实,Spring cloud给了我们更好的解决方案-spring cloud bus。

spring cloud bus后续更新。

总结

本文简单的实现了config-server和config-client的单机和远程git仓库的配置的调用以及配置信息的简单的动态更新。

代码地址


《Srping Cloud 2.X小白教程》目录


转载请注明出处,

  • 联系方式:4272231@163.com

spring cloud 2.x版本 Config配置中心教程的更多相关文章

  1. Spring Cloud(八):配置中心(服务化与高可用)【Finchley 版】

    Spring Cloud(八):配置中心(服务化与高可用)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-04-26 |  本文接之前的<Spring Clou ...

  2. Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】

    Spring Cloud(七):配置中心(Git 版与动态刷新)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-04-24 |  Spring Cloud Confi ...

  3. Spring Cloud(九):配置中心(消息总线)【Finchley 版】

    Spring Cloud(九):配置中心(消息总线)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-05-07 |  我们在 Spring Cloud(七):配置中心 ...

  4. Spring Cloud第十一篇 | 分布式配置中心高可用

    ​ 本文是Spring Cloud专栏的第十一篇文章,了解前十篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  5. spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  6. spring cloud 2.x版本 Eureka Client服务提供者教程

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...

  7. spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  8. spring cloud 2.x版本 Zuul路由网关教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  9. spring cloud 2.x版本 Gateway动态路由教程

    摘要 本文采用的Spring cloud为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的几篇Spring cloud Gateway文章的实现. 参考 Gatew ...

随机推荐

  1. Redis学习笔记(九、Redis总结)

    1.Redis五大对象: 在Redis中有五大对象,分别是String.List.Hash.Set.Sorted Set. 这五大对象都有自己独特的编码方式,每个编码的实现都不一样,有自己独特的使用场 ...

  2. Vue父子组件数据双向绑定,子组件可修改props

    第一种,子组件通过监听父组件数据,子组件改变数据之后通知给父组件 原文链接:https://blog.csdn.net/m0_37728716/article/details/81776929 父组件 ...

  3. 3万字长文概述:通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?

    [转载]通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的 ...

  4. C++ 如何用百行代码实现线程安全的并发队列 | concurrent queue or blocking queue implemented in cpp

    本文首发于个人博客https://kezunlin.me/post/cabccf5c/,欢迎阅读最新内容! concurrent queue or blocking queue implemented ...

  5. SPARQL入门(一)SPARQL简介与简单使用

      知识图谱(Knowledge Graph)是当前互联网最炙手可热的技术之一,它的典型应用场景就是搜索引擎,比如Google搜索,百度搜索.我们在百度搜索中输入问题"中国银行的总部在哪&q ...

  6. javascript截取字符串的最后几个字符

    在JavaScript中截取字符串一般是使用内置的substring()方法和substr()方法,这两个方法功能都很强大,也都能实现截取字符串中的最后几个字符. substring()方法 Java ...

  7. Git详细学习教程

    作者:gafish https://github.com/gafish/gafish.github.com Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目 ...

  8. RocketMQ(一):推拉消费模型客户端实践

    消息中间件是为解耦生产者和消费者的目的,三大服务点:解耦.异步.削峰. 现在的的互联网系统中,mq已经必备基础设施了,我们已明显感觉它的必要性与强大.然而,它的本质是啥?存储转发系统罢了! MQ有很多 ...

  9. RabbitMQ与Spring的框架整合之Spring Cloud Stream实战

    1.RabbitMQ与Spring Cloud Stream整合实战.SpringCloud Stream整体结构核心概念图,如下所示: 图示解释:Outputs输出,即消息的发送端.Inputs输入 ...

  10. Web前端基础(11):JavaScript(五)

    1. 初识DOM 1.1 DOM介绍 1.1.3 什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定 ...