SpringCloud实战8-Bus消息总线
好了现在我们接着上一篇的随笔,继续来讲。上一篇我们讲到,我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的发送post请求,
我们能受的了吗?这比之前的没配置中心好多了,那么我们如何继续避免挨个挨个的向服务发送Post请求来告知服务,你的配置信息改变了,需要及时修改内存中的配置信息。
这时候我们就不要忘记消息队列的发布订阅模型。让所有为服务来订阅这个事件,当这个事件发生改变了,就可以通知所有微服务去更新它们的内存中的配置信息。这时Bus消息总线就能解决,你只需要在springcloud Config Server端发出refresh,就可以触发所有微服务更新了。
如下架构图所示:
Spring Cloud Bus除了支持RabbitMQ的自动化配置之外,还支持现在被广泛应用的Kafka。在本文中,我们将搭建一个Kafka的本地环境,并通过它来尝试使用Spring Cloud Bus对Kafka的支持,实现消息总线的功能。
Kafka使用Scala实现,被用作LinkedIn的活动流和运营数据处理的管道,现在也被诸多互联网企业广泛地用作为数据流管道和消息系统。
Kafak架构图如下:
Kafka是基于消息发布/订阅模式实现的消息系统,其主要设计目标如下:
1.消息持久化:以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
2.高吞吐:在廉价的商用机器上也能支持单机每秒100K条以上的吞吐量
3.分布式:支持消息分区以及分布式消费,并保证分区内的消息顺序
4.跨平台:支持不同技术平台的客户端(如:Java、PHP、Python等)
5.实时性:支持实时数据处理和离线数据处理
6.伸缩性:支持水平扩展
Kafka中涉及的一些基本概念:
1.Broker:Kafka集群包含一个或多个服务器,这些服务器被称为Broker。
2.Topic:逻辑上同Rabbit的Queue队列相似,每条发布到Kafka集群的消息都必须有一个Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
3.Partition:Partition是物理概念上的分区,为了提供系统吞吐率,在物理上每个Topic会分成一个或多个Partition,每个Partition对应一个文件夹(存储对应分区的消息内容和索引文件)。
4.Producer:消息生产者,负责生产消息并发送到Kafka Broker。
5.Consumer:消息消费者,向Kafka Broker读取消息并处理的客户端。
6.Consumer Group:每个Consumer属于一个特定的组(可为每个Consumer指定属于一个组,若不指定则属于默认组),组可以用来实现一条消息被组内多个成员消费等功能。
我们这里主要针对Spring Cloud Bus对Kafka的支持,实现消息总线的功能,具体的Kafka,RabbitMQ消息队列希望自己去找资料来学习一下。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>1.4.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-kafka</artifactId> <version>1.3.2.RELEASE</version> </dependency>
接着要注意一下,client1的配置文件要改为bootstrap.yml,因为这种配置格式,是优先加载的,上一篇随笔有讲过,client1的配置如下:
server: port: 7006 spring: application: name: cloud-config cloud: config: #启动什么环境下的配置,dev 表示开发环境,这跟你仓库的文件的后缀有关,比如,仓库配置文件命名格式是cloud-config-dev.properties,所以profile 就要写dev profile: dev discovery: enabled: true #这个名字是Config Server端的服务名字,不能瞎写。 service-id: config-server #注册中心 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/ #是否需要权限拉去,默认是true,如果不false就不允许你去拉取配置中心Server更新的内容 management: security: enabled: false
接着启动类如下:
@SpringBootApplication @EnableDiscoveryClient public class Client1Application { public static void main(String[] args) { SpringApplication.run(Client1Application.class, args); } }
接着将client中的TestController赋值一份到client1中,代码如下:
@RestController //这里面的属性有可能会更新的,git中的配置中心变化的话就要刷新,没有这个注解内,配置就不能及时更新 @RefreshScope public class TestController { @Value("${name}") private String name; @Value("${age}") private Integer age; @RequestMapping("/test") public String test(){ return this.name+this.age; } }
接着还要在先前的随笔中的模块中的Config Server加入如下配置:
#是否需要权限拉去,默认是true,如果不false就不允许你去拉取配置中心Server更新的内容 management: security: enabled: false
接着还要做一点就是,在config-client,config-client1,和config-Server都要引入kafka的依赖,如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-kafka</artifactId> <version>1.3.2.RELEASE</version> </dependency>
我们工程准备好了,暂时先放在这里,下面进行Kafka的安装下载,首先我们去Kafka官网kafka.apache.org/downloads 下来官网推荐的版本,
首先我们进到下载好的Kafka目录中kafka_2.11-1.1.0\bin\windows 下编辑kafka-run-class.bat如下:
找到这条配置 如下:
set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp %CLASSPATH% %KAFKA_OPTS% %*
可以看到%CLASSPATH%没有双引号,
因此用双引号括起来,不然启动不起来的,报你JDK没安装好,修改后如下:
set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp "%CLASSPATH%" %KAFKA_OPTS% %*
接着,打开config文件夹中的server.properties配置如下:
可以看到是连接到本地的zookeeper就行了。
接着我们进行先启动zookeeper,再启动Kafka,如下:
当看到上面的信息证明启动Zookeeper启动成功。、
接下来再开一个CMD启动Kafka,如下:
看到这些信息说明Kafka启动成功了
好了,接下来把前面的工程,两个注册中心,一个springcloud-config-server,两个springcloud-config-client,springcloud-config-client1启动起来,
可以看到springcloudBus是在0分片上,如果两个config-client启动都出现上面信息,证明启动成功了。
好了现在我们进行访问一下config-server端,如下:
再访问两个client,如下:
好了,好戏开始了,现在我们去git仓库上修改配置中心的文件,将年龄改为24,如下:
接下来,我们我们用refresh刷新配置服务端配置,通知两个client去更新内存中的配置信息。用postman发送localhost:7000/bus/refresh,如下:
可以看到没有返回什么信息,但是不要担心,这是成功的通知所有client去更新了内存中的信息了。
接着我们分别重新请求config-server,两个client,刷新页面,结果如下:
两个client如下:
可以看到所有client自动更新内存中的配置信息了。
到目前为止,上面都是刷新说有的配置的信息的,如果我们想刷新某个特定服务的配置信息也是可以的。我们可以指定刷新范围,如下:
指定刷新范围
上面的例子中,我们通过向服务实例请求Spring Cloud Bus的/bus/refresh
接口,从而触发总线上其他服务实例的/refresh
。但是有些特殊场景下(比如:灰度发布),我们希望可以刷新微服务中某个具体实例的配置。
Spring Cloud Bus对这种场景也有很好的支持:/bus/refresh
接口还提供了destination
参数,用来定位具体要刷新的应用程序。比如,我们可以请求/bus/refresh?destination=服务名字:9000
,此时总线上的各应用实例会根据destination
属性的值来判断是否为自己的实例名,
若符合才进行配置刷新,若不符合就忽略该消息。
destination
参数除了可以定位具体的实例之外,还可以用来定位具体的服务。定位服务的原理是通过使用Spring的PathMatecher(路径匹配)来实现,比如:/bus/refresh?destination=customers:**
,该请求会触发customers
服务的所有实例进行刷新。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android之父创立硬件孵化器 他说人工智能和量子计算是未来
北京时间6月15日早间消息,有“Android之父”之称的安迪·鲁宾(Andy Rubin)于几年前从谷歌离职,成立了一家资金3亿美元的硬件孵化器Playground。 自那时以来,他一直忙于设想硬件的未来,而这并不仅仅包含机器人。在彭博科技大会上,他展示了两款硬件:用于无人机的信号收发机,以及能提供触感反馈和音乐的背包。这两款硬件都代表了真实世界与互联网和数据互动的新方式,而这也是鲁宾认为技术未来的发展方向。 鲁宾在大会上表示:“我认为,新机会在于从离线来源,而非云计算平台取得数据。这是机器人的领域。机器人能行走,配备的移动传感器能感知周围环境并展开互动,从互动中进行学习。在计算机科学中,我们将其称作感应、计划和执行。从以往经验来看,在执行环节,如果你通过云计算平台去做,那么将会被困在云计算之中。如果你无法与真实世界互动,那么就会被封闭在玻璃瓶里。机器人代表了执行的环节。在完成感应和计划环节之后,你可以将这些信息反馈回真实世界。” 在Playground,鲁宾和他的团队正在孵化约15家公司。他的团队由约15名工程师组成,其中包括计算机和机械专家。如果有公司能设想出计算机与真实世界互动...
- 下一篇
传统企业云计算应用实践
参与调研即可下载本期资料,包含ppt文档及视频链接:点击下载 大家好,今天来和大家分享下关于传统企业云计算应用实践和个人的一些看法,从而抛砖引玉,一起关注云计算在这个时代带给传统企业的价值和变革。 互联网+时代给传统企业粗放式的各自为政的业务模式带来很大冲击,每个行业为迎接互联网+都在主动或被动转型,包含业务模式创新,管理的创新,在推进互联网+的道路上,有很多实现变革的道路,管理类,技术类很多维度, 云计算是实现多维度变革的最佳手段,通过云计算推动业务创新,使传统企业降本增效,保持竞争力,那么,在企业自身诉求下,哪些业务转型中需要云计算支撑的呢? 云是个技术概念,也是一种商业模式 大家知道云计算是一个技术概念,源自于变形计算,发展到现在,成为了一种理念,或是一种商业模式,根据需要实现服务,降低资源交付成本,从IT资源扩张到整个社会资源交付方式,从云计算的整体框架看,很多分类方法,像私有云,公有云,社区云,混合云,有一些基本属性:大规模扩展,虚拟化实现,面向服务,其中有一些独有的特点,自服务,快捷交付等。 其中应用模块分三个层级:SaaSPaaS IaaS ,如图: 云计算带来的变革 从...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16