白话SpringCloud | 第八章:分布式配置中心的服务化及动态刷新
前言
上一章节,简单介绍了分布式配置中心
Spring Cloud Config
的使用。同时,我们也遗漏了一些问题,比如如何配置实时生效,当服务端地址变更或者集群部署时,如何指定服务端地址?回想,在服务注册章节,服务提供者和服务消费者,同时往注册中心进行注册和获取服务地址,而本身注册中心又支持高可用配置。所以,对于配置中心,我们也可以将Server端
和Client端
往注册中心进行注册,借此实现配置中心的服务化,无需指定具体的ip地址,直接根据服务名称进行调用。
- 关于高可用
- Server端
- Client端
- refresh实现刷新
- 参考资料
- 总结
- 最后
- 老生常谈
前言
关于高可用
将配置中心服务化,本身是为了实现高可用。而实现高可用的手段是很多的,最常用的就是负载均衡
。客户端不直连服务端,而是访问负载均衡
服务,由负载均衡
来动态选择需要访问的服务端。只是Spring Cloud Config
天然的就能进行服务化配置,所以,实际中可以根据实际的业务需求来进行合理化抉择的。
其次,对于使用了git
或者svn
作为存储方式时,本身配置仓库的高可用也是一个需要考虑的事项。本身如github
或者码云
这些第三方git
仓库而言,已经实现了高可用了。但一般上部署的微服务都是内网服务,所以一般上是使用如gitlab
开源的git
仓库管理系统进行自建,此时就需要考虑本身仓库的高可用了。
注意:本身教程为了不混淆各知识点,所以都是独立项目进行实例,而不是在原工程上进行修改。
本章节教程采用了多模块工程进行构建实例。父类项目名为:spring-cloud-config-ha
。同时创建服务化的配置文件:my-config-client-ha-dev.properties
和my-config-client-ha-test.properties
my-config-client-ha-dev.properties
config=this is dev!
my-config-client-ha-dev.properties
config=this is test!
Server端
创建子工程:spring-cloud-confg-ha-server
0.加入pom依赖。
<!-- config server 依赖 --><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.配置文件加入注册中心相关配置。
spring.application.name=spring-cloud-config-ha-server
server.port=15678#配置文件git配置
spring.cloud.config.server.git.uri=https://github.com/xie19900123/spring-cloud-learning.git
# 搜索路径,即配置文件的目录,可配置多个,逗号分隔。默认为根目录。
spring.cloud.config.server.git.searchPaths=spring-cloud-config-repo
# git用户名和密码 针对私有仓库而言需要填写
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=#添加注册中心配置
# 注册中心地址 -此为单机模式
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka
# 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的
eureka.instance.prefer-ip-address=true
# 实例名称 最后呈现地址:ip:15678
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
2.启动类加入@EnableDiscoveryClient
和@EnableConfigServer
,前者开启服务发现功能,后者声明一个config server
。
/*** config server 服务化* * @author oKong**/
@SpringBootApplication
@EnableConfigServer
//注意这里也可使用@EnableEurekaClient
//但由于springcloud是灵活的,注册中心支持eureka、consul、zookeeper等
//若写了具体的注册中心注解,则当替换成其他注册中心时,又需要替换成对应的注解了。
//所以 直接使用@EnableDiscoveryClient 启动发现。
//这样在替换注册中心时,只需要替换相关依赖即可。
@EnableDiscoveryClient
@Slf4j
public class ConfigServerHaApplication {public static void main(String[] args) throws Exception {SpringApplication.run(ConfigServerHaApplication.class, args);log.info("spring-cloud-config-ha-server启动!");}
}
关于Eureka
相关知识点,可以查看:《第二章:服务注册与发现(Eureka)-上》和《第三章:服务注册与发现(Eureka)-下》,这里就不加以阐述了。
3.启动应用,同时启动Eureka
服务端。访问下Eureka
服务端地址:http://127.0.0.1:1000/ ,可以看见服务注册成功了。
访问:http://127.0.0.1:15678/my-config-client-ha-dev.properties 可以看见配置信息了。
Client端
创建子工程:spring-cloud-confg-ha-client
0.加入pom依赖。
<!-- config client 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- eureka client 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
1.配置文件修改,bootstrap.properties
添加注册中心配置。
bootstrap.properties
# 设置分支
spring.cloud.config.label=master
# 环境变量
spring.cloud.config.profile=dev
# 是否使用注册中心方式进行获取
spring.cloud.config.discovery.enabled=true
# 服务端地址
# 在不使用注册中心模式下 直接填写实际地址
#spring.cloud.config.uri=http://127.0.0.1:5678
# 注册中心应用id
spring.cloud.config.discovery.service-id=spring-cloud-config-ha-server#添加注册中心配置
# 注册中心地址 -此为单机模式
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka
# 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的
eureka.instance.prefer-ip-address=true
# 实例名称 最后呈现地址:ip:15678
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
application.properties
# 设置应用名称,需要和配置文件匹配
spring.application.name=my-config-client-ha
server.port=15666
注意:注册中心的相关配置需要放在bootstrap.properties
中,这样才能利用注册中心进行服务端服务地址获取。
2.启动类,加入@EnableDiscoveryClient
,开启服务发现功能。
/*** 服务化方式调用config server* * @author oKong**/
@SpringBootApplication
@EnableDiscoveryClient
@Slf4j
public class ConfigClientHaApplication {public static void main(String[] args) throws Exception {SpringApplication.run(ConfigClientHaApplication.class, args);log.info("spring-cloud-config-ha-client启动!");}}
3.创建控制层,测试配置参数。
/*** config client 简单示例* @author oKong**/
@RestController
public class DemoController {@Value("${config}")String config;@GetMapping("/")public String demo() {return "返回的config参数值为:" + config;}
}
4.启动应用。一般上应用能启动成功,就说明服务化已经成功了。
启动时,可以看见已经往注册中心去获取服务端地址了。
2018-10-10 23:15:15.302 INFO 26412 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://192.168.2.102:15678/
2018-10-10 23:15:20.728 INFO 26412 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=my-config-client-ha, profiles=[dev], label=master, version=f2645253a37db433d806914b1d04d6aba428831c, state=null
此时,我们访问:http://127.0.0.1:15666/ ,即可看见配置信息返回了。
refresh实现刷新
在默认情况下,客户端是不会自动感知配置的变化的。此时,我们可以使用/refresh
端点来进行配置更新。
现在,我们改造下客户端。
0.加入端点依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
1.修改下变量使用类,加入@RefreshScope
注解,标记在访问/refresh
时,进行变量的更新操作。
/*** config client 简单示例* @author oKong**/
@RestController
@RefreshScope//使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
public class DemoController {@Value("${config}")String config;@GetMapping("/")public String demo() {return "返回的config参数值为:" + config;}
}
重点就是注解@RefreshScope
了。
2.配置文件开启端点refresh
。这里需要注意,2.0
之后,默认只开启了端点info
、health
。其他的需要通过management.endpoints.web.exposure.include
进行额外配置。
#开启监控端点
management.endpoints.web.exposure.include=refresh
3.启动应用,此时,动态修改下远程仓库的参数值为:config=this is dev refresh!!!
,
使用Postman
使用POST
访问:http://127.0.0.1:15666/actuator/refresh
。
返回值即为有变动的参数值。
再次访问:http://127.0.0.1:15666/ 可以看见已经是最新的配置参数值了。
参考资料
https://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_spring_cloud_config
https://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#refresh-scope
总结
本章节主要讲解了如何将配置中心注册为一个服务,客户端像普通的服务消费者一样,根据服务名即可获取服务端地址,进而进行参数的获取。同时讲解了当属性参数有变时,客户端如何进行感知变化进行参数动态更新。大家应该可以想到,当我们客户端越来越多时,一个个去执行
refresh
时不太现实的,虽然我们可以通过类似webhook
功能当有提交记录时,主动去触发各客户端的refresh
方法,在前期项目比较少的情况下,不失为一个好方法,只需要维护一份待更新的客户端地址列表即可。但当服务越来越多时,维护此列表也是令人头疼的。此时,我们可以使用Spring cloud bus
消息总线进行通知。由于目前Spring cloud bus
知识点尚未开始讲解,同时作者也比较少使用消息总线,所以待查阅相关之后介绍Spring Cloud bus
章节时,再来进行讲解如何使用消息总线
进行全自动的配置更新操作。
最后
目前互联网上大佬都有分享
SpringCloud
系列教程,内容可能会类似,望多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有错误之处,还望提出,谢谢。
老生常谈
- 个人QQ:
499452441
- 微信公众号:
lqdevOps
个人博客:http://blog.lqdev.cn
源码示例:https://github.com/xie19900123/spring-cloud-learning
原文地址:http://blog.lqdev.cn/2018/10/11/SpringCloud/chapter-eight/
转载于:https://www.cnblogs.com/okong/p/springcloud-eight.html
白话SpringCloud | 第八章:分布式配置中心的服务化及动态刷新相关推荐
- SpringCloud与SpringConfig分布式配置中心
Github上配置SpringCloud的配置文件: 问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能 ...
- SpringCloud学习系列之四-----配置中心(Config)使用详解
前言 本篇主要介绍的是SpringCloud中的分布式配置中心(SpringCloud Config)的相关使用教程. SpringCloud Config Config 介绍 Spring Clou ...
- 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)...
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f6-config/ 本文出自方志朋的博客 在上一篇文章讲述z ...
- springcloud config 分布式配置中心
一.介绍 1.场景: 微服务系统中,系统多.实例多,如果每个系统都有自己一套配置加载.维护的机制,会导致在生产过程中因为配置问题引发的不必要的沟通成本.故障风险.需要采用分布式配置中心统一管理.统一实 ...
- 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
转:https://blog.csdn.net/forezp/article/details/70037291 最新版本: 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spr ...
- SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪
Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...
- springcloud 分布式配置中心 config server config client
---------------------------------------------------------------------------------------------------- ...
- springcloud分布式配置中心(二)-阿波罗apollo
1.Springcloud的分布式配置中心组件 组件一般有两个,springcloud config,apollo.apollo有一个好处是apollo有界面,这是apollo的一个优势. sprin ...
- SpringCloud学习(十八):Config分布式配置中心的介绍与搭建
目录 一.概述 1.分布式系统面临的配置问题 2. Config配置中心是什么 3.Spring Config能做什么 二.Config总控中心配置与测试 1.在Gitee上新建仓库 2.本地硬盘目录 ...
最新文章
- JavaScript模块化开发技术概述
- python经典好书-有哪些 Python 经典书籍?
- 数据结构源码笔记(C语言):可变长度字符串的快速排序
- 为什么一定要好好睡觉?
- 确定最小的正整数n,使得n!的结尾恰好有1987个0
- 手机优酷APP怎么上传视频
- Spring -- 入门,装备集合,自动装配,分散装配,自定义编辑器
- tomcat日志输出控制
- 最积阴德的4件事,哪怕做过一件,也会累积大功德!
- java设计模式-可复用面向对象软件的基础(一)
- 电子工程师不得不读的十大经典书籍
- ORACLE 正則表達式
- 禁止国外IP连接服务器
- Python爬虫实战之爬取链家广州房价_04链家的模拟登录(记录)
- 分享 百度网盘搜索引擎原理以及实现部分源码
- 54个站在人类智商巅峰的男人!告诉你2400年的物理学史里都有什么……
- 黑龙江科学杂志黑龙江科学杂志社黑龙江科学编辑部2022年第24期目录
- [JavaScript犀牛书]第二章 词法结构
- fiddler工具使用大全(全网最详细)
- linux 820m驱动下载,下载:NVIDIA显卡最新177.67版驱动For Linux
热门文章
- hdu 3007【爬山算法】
- [YTU]_2575( 交通工具信息)
- 3.3 matlab用switch语句实现选择结构
- matplotlib显示中文(显现中文之后负号无法显示)
- Sicily1798. Alice and Bob[策略问题]
- t1plus 用什么服务器系统,T1 Plus商贸宝普及版与用友T1系统哪个更好呢?
- 并发编程--线程池与进程池
- H3C PPP MP配置示例二(续)
- 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST
- c# 说说开发通用通信库,尤其是分布式服务的通信