前言

欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud。

本系列适合有一定Java以及SpringBoot基础的同学阅读。

每篇文章末尾都附有本文对应的Github源代码,方便同学调试。

Github仓库地址:

github.com/qqxx6661/sp…

菜鸟SpringCloud实战入门系列

你可以通过以下两种途径查看菜鸟SpringCloud实战入门系列

  • 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
  • 菜鸟SpringCloud实战入门专栏导航页(CSDN)

前文回顾:

  • [菜鸟SpringCloud实战入门]第一章:构建多模块的Maven项目+创建注册中心Eureka子模块
  • [菜鸟SpringCloud实战入门]第二章:创建服务提供者并在Eureka进行注册
  • [菜鸟SpringCloud实战入门]第三章:将Eureka改造为高可用集群
  • [菜鸟SpringCloud实战入门]第四章:远程调用服务实战
  • [菜鸟SpringCloud实战入门]第五章:熔断器Hystrix的使用 + 可视化监控Hystrix Dashboard和Turbine
  • [菜鸟SpringCloud实战入门]第六章:配置中心Spring Cloud Config初体验
  • ...更多文章请查看上方:菜鸟SpringCloud入门实战专栏导航页

实战版本

  • SpringBoot:2.0.3.RELEASE
  • SpringCloud:Finchley.RELEASE

-----正文开始-----

配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造

客户端Refresh:客户端主动获取配置信息

经过上一章节配置好Spring Cloud Config后,客户端(config-client模块)能够获得从服务端(config-server模块)传来的配置文件信息。

文末写出了一个问题,客户端并不能获取更新后的配置信息,想要刷新信息,必须重启config-client模块,这显然不切实际。

实验:验证客户端无法更新

下面做一个实验,启动客户端和服务端,随后更新dev配置文件,新加了(new):

随后push到远程仓库,我们再次直接访问服务端的 http://localhost:8769/spring-cloud-config-dev.properties :

发现更新成了新的配置文件。

之后访问客户端:

发现依然是老的配置文件信息,客户端只在启动时获取了当时的配置文件信息。

开启更新机制

我们只需要在config-server模块中进行改动。

实现Refresh机制需要添加依赖spring-boot-starter-actuator,这个依赖在我们的root模块中就已经添加,在config-server模块就不需要重复添加了。如果你在root父模块没有添加,那么就需要加上。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码

大坑:

对需要刷新的类加上注解@RefreshScope

当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置。

注意这里不是直接加载主类上,除非你的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;@RestController
@RefreshScope
public class HelloController {@Value("${config.hello}")private String hello;@RequestMapping("/hello")public String from() {return this.hello;}
}
复制代码

对于springboot 1.5.X 以上版本,需要在配置文件中关闭安全认证。

management.security.enabled=false
复制代码

对于springboot 2,上述配置不起作用,需要修改server端配置文件,将端口暴露:

management:endpoints:web:exposure:include: "*"
复制代码

还要将客户端端口暴露:

management:endpoints:web:exposure:include: refresh
复制代码

测试:

我们开启服务端和客户端,先测试下未更新前获取的配置信息:

随后我们修改配置文件并push:

然后以post请求访问 curl -v -X POST "http://localhost:8002/actuator/refresh"

得到了:

如果在不变更的情况下,再次发送POST请求:

使用Webhook监听配置更新

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。Webhook来监测你在Github.com上的各种事件,最常见的莫过于push事件。如果你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的地址。

如此一来,你就可以通过这种方式去自动完成一些重复性工作,比如,你可以用Webhook来自动触发一些持续集成(CI)工具的运作,比如Travis CI;又或者是通过 Webhook 去部署你的线上服务器。下图就是github上面的webhook配置。

这种机制适用于只有少数微服务的情况,在大量未服务的情况下,这种机制就显得捉襟见肘。

消息总线机制

如果项目少配置少的情况可以通过/refresh来手动刷新配置,如果项目比较复杂的情况呢这种肯定是行不通的,Spring Cloud Bus消息总线可以解决配置修改的真正的动态刷新。我们放在下一章进行学习。

配置中心服务化和高可用改造

目前我们的两个子模块config-server和config-client是相互耦合的,client需要输入server的地址来调用它,这样的调用违反了低耦合原则(低耦合:就是A模块与B模块存在依赖关系,那么当B发生改变时,A模块仍然可以正常工作,那么就认为A与B是低耦合的。)

现在我们就是用之前学习的Eureka来对配置中心进行改造。

服务端改造

改造集中在两方面,一个是在注册中心注册,一个是开启多个服务端达到高可用的目的。

添加依赖(由于eureka的依赖在我们的父模块已经添加,所以对于config-server模块我们不需要改动):

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency>
</dependencies>
复制代码

配置文件新增注册配置:

server:port: 8769
spring:application:name: spring-cloud-config-servercloud:config:server:git:uri: https://xxxxxxxxxxx.git # 配置git仓库的地址search-paths: config-repo                              # git仓库地址下的相对地址,可以配置多个,用,分割。username: xxxxxx                                     # git仓库的账号password: xxxxx                                   # git仓库的密码
# 客户端调用需要
management:endpoints:web:exposure:include: "*"
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
复制代码

启动类添加@EnableDiscoveryClient:

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}
复制代码

客户端改造

依赖修改:同服务端相同,我们不需要修改,父模块将注册中心等都已经引入(见第一章)

启动类添加@EnableDiscoveryClient:同上。

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

配置文件yml修改:

在前面我们给config-client子模块配置了两个yml文件,一个是传统application.yml一个是bootstrap.yml,bootstrap.yml的启动优先于application.yml

我们修改bootstrap.yml,添加注册中心配置,并将config的配置加上:

  • spring.cloud.config.discovery.enabled :开启Config服务发现支持
  • spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
  • 删除spring.cloud.config.uri
spring:cloud:config:name: spring-cloud-configprofile: devlabel: masterdiscovery:enabled: trueservice-id: spring-cloud-config-server
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
复制代码

随后我们启动三个模块:

  • Eureka子模块
  • config-server
  • config-client

查看Eureka状态 http://localhost:8761/ :

为了达成高可用,我们将config-server的端口号再修改为8770,启动一个新的config-server,这样就有两个config-server同时为我们服务。

调用客户端接口:

本章代码

github.com/qqxx6661/sp…

参考

www.ityouknow.com/springcloud…

blog.csdn.net/youanyyou/a…

www.ityouknow.com/springcloud…

-----正文结束-----

菜鸟SpringCloud实战入门专栏全导航:通过以下两种途径查看

  • 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
  • 菜鸟SpringCloud实战专栏(CSDN)

关注我

我是蛮三刀把刀,后端开发。主要关注后端开发,数据安全,爬虫等方向。

来微信和我聊聊:yangzd1102

Github个人主页:

github.com/qqxx6661

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • Python爬虫相关技术实战
  • 后端开发相关技术实战
  • SpringCloud实战

同步更新公众号及以下全部博客:

1. Csdn

blog.csdn.net/qqxx6661

2. 知乎

www.zhihu.com/people/yang…

3. 掘金

juejin.im/user/5b4801…

4. 简书

www.jianshu.com/u/b5f225ca2…

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

[菜鸟SpringCloud实战入门]第七章:配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造...相关推荐

  1. [菜鸟SpringCloud实战入门]第五章:熔断器Hystrix的使用 + 可视化监控Hystrix Dashboard和Turbine

    前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...

  2. [菜鸟SpringCloud实战入门]第九章:服务网关Zuul体验

    前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...

  3. 【Abp VNext】实战入门(七):【1】xxx.Web网站层 —— API接口服务添加跨域访问支持

    一.前言 通过命令 abp new AoRuiDe.GasMonitoring 或者直接从官网下载的项目,默认没做跨域配置,会导致在前后端分离的网页中去访问后端接口的时候报错"Access- ...

  4. 数据中台实战入门篇:数据中台对内、对外合作机制

    前言 之前文章讲了 <数据中台实战入门篇:双中台战略>,主要解决了什么是中台.什么是数据中台.业务中台.什么公司适合搭建双中台体系这几个问题.本篇文章讲一下数据中台的人员构成.内部如何合作 ...

  5. springcloud(八):配置中心服务化和高可用

    在前两篇的介绍中,客户端都是直接调用配置中心的server端来获取配置文件信息.这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,serve ...

  6. (八)JAVA springcloud ssm b2b2c多用户商城系统源码:配置中心服务化和高可用

    server端改造 1.添加依赖 <dependencies><dependency><groupId>org.springframework.cloud</ ...

  7. java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统--配置中心服务化和高可用...

    在前两篇的介绍中,客户端都是直接调用配置中心的server端来获取配置文件信息.电子商务平台源码请加企鹅求求:一零三八七七四六二六. 这样就存在了一个问题,客户端和服务端的耦合性太高,如果server ...

  8. SpringBoot b2b2c 多用户商城系统(八):配置中心服务化和高可用

    server端改造 1.添加依赖 <dependencies><dependency><groupId>org.springframework.cloud</ ...

  9. 《Vue.js实战》第七章.组件

    7.1 组件作用: 提高代码复用性,使项目易于维护 7.1 组件的使用 7.1.1 组件注册-全局注册 全局注册后,任何vue的实例都可以使用该组件. Vue.component('my-compon ...

最新文章

  1. pip、conda 换国内源,大大提高下载速度
  2. MySQL中char与varchar的区别
  3. Google CEO Sundar Pichai :“谷歌最大的威胁就是自身的成功”
  4. Leetcode: Implement strStr()
  5. MySql链接字符串 各种程序连接大合集(包括asp.net,c#,等等)
  6. 只下载pycharm不安装python可以用吗_pycharm下怎么配置python
  7. python mac 安装pillow,关于python:安装了Pillow,但仍然得到“ImportError:没有名为PIL的模块”...
  8. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph(有源上下界最大流 模板)
  9. js模版引擎handlebars.js实用教程——结束语
  10. python性能解决_我们如何发现并解决Python代码中性能下降的问题
  11. pytorch修改tensor数据类型
  12. 2018.11.04 洛谷P1081 开车旅行(倍增)
  13. 函数进阶之生成器和迭代器
  14. java实现使用JDBC-ODBC桥操作数据库。
  15. HTML 4.0 语 法 教 学
  16. 学习掌握Excel程度的层级划分
  17. [python案例]金融知识图谱构建流程
  18. 机器学习服务文本识别能力演进,大幅提升识别准确率
  19. 腾讯云/阿里云域名注册解析备案
  20. windows redis 后台启动

热门文章

  1. System Center 2012 Process Automatic
  2. android.view.WindowManager$BadTokenException: Unable to add window — token null
  3. 【Angular】服务(Service)
  4. measure,layout,draw的相关方法
  5. Java---形参个数可变的方法
  6. jQuery可放大预览的图片滑块
  7. ASP.NET实现推送文件到浏览器的方法
  8. 编程技巧:使用异或操作符(XOR)交换两数值
  9. TCP的ACK确认系列 — 快速确认
  10. 管道实现进程间通讯 、WaitNamedPipe