Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
Spring Cloud组件列表
组件 | 功能 |
Spring Cloud Netflix | 针对多种Netflix组件提供的开发工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。 |
Netflix Eureka | 云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。 |
Netflix Hystrix | 容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 |
Netflix Zuul | 边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。 |
Spring Cloud Bus | 事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。 |
Spring Cloud Cli | 基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。 |
Spring Cloud Config | 配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储、Git以及Subversion。 |
Spring Cloud Security | 安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。 |
Spring Cloud for Cloud Foundry | 通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。 |
Spring Cloud Consul | 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。 |
Spring Cloud Stream | 数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。 |
Spring Cloud Zookeeper | 操作Zookeeper的工具包,用于使用zookeeper方式的服务注册和发现。 |
Netflix Archaius | 配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。 |
Spring Cloud Sleuth | 日志收集工具包,封装了Dapper,Zipkin和HTrace操作。 |
Spring Cloud Data Flow | 大数据操作工具,通过命令行方式操作数据流。 |
|
|
|
|
|
|
|
|
http://m.blog.youkuaiyun.com/u010870518/article/details/77773908
http://blog.youkuaiyun.com/pandawang1989/article/details/72802416
微信小程序:
http://blog.youkuaiyun.com/zuoliangzhu/article/details/53862576
12.1 配置管理实现原理
配置管理在线更新功能使用事件总线,即spring-cloud-bus来发布状态变化,并且使用分布式消息来发布更新事件,而分布式消息最终使用了RabbitMQ来实现消息的收发;
1. 在线更新流程
使用配置管理,实现在线更新的一般遵循下列步骤:
- 更新Git仓库的配置文件;
- 以POST指令触发更新请求;
- 配置管理服务器从Git仓库中读取配置文件,并将配置文件分发给各个客户端,同时在RabbitMQ中发布一个更新消息;
- 客户单订阅RabbitMQ消息,收到消息之后更新;
源代码RefreshBusEndpoint extends AbstractBusEndpoint
其中publish将会发布一个更新事件,调用RabbitMQ进行消息发布,然后由客户端收到消息之后执行更新
2. 更新消息的分发原理
配置管理服务器中的消息分发是从spring-cloud-bus中调用spring-cloud-stream组件来实现的,而spring-cloud-stream使用RabbitMQ实现了分布式消息的分发;
RabbitMQ的消息服务一般需要创建一个交换机Exchange和一个队列Queue,然后将交换机和队列进行绑定。而在设计配置服务器的时候并没有做这方面的工作,所做的工作仅仅是配置引用spring-cloud-bus的依赖和设置连接RabbitMQ服务器的参数而已。只是这个工作spring-cloud-stream已经帮我们实现了;
具体可以查看RabbitMessageChannelBinder的源代码
RabbitMQ中有四种交换机(Fanout、Direct、Topic、Header)
使用配置管理服务的客户端都订阅了RabbitMQ服务器的消息,当收到更新消息的时候,即从配置管理服务器中取得更新文件,然后在本地上执行更新配置的流程;
12.2 发现服务源代码分析
在使用发现服务的时候,只需要简单的通过注解@EnableEurekaServer来标注一个应用为发现服务器,通过注解@EnableDiscoveryClient来标注一个应用为发现服务的客户端,服务器就会实现服务注册的功能,客户端将会从服务器中取得已经注册的可用服务列表;
1. 服务端的服务注册功能
服务注册是发现服务的一个主要功能,可以从注解@EnableEurekaServer的定义中顺藤摸瓜的找到其实现的源代码。
超类的AbstractInstanceRegistry的register对客户端进行注册,然后将在线的客户端存入到注册队列recentRegisteredQueue中
其中的一个缺陷,就是如果客户端关闭了,在发现服务器的控制台中,还能查看到这个客户端,只有重启发现服务器,才能更新这个客户端列表;
2. 客户端注册和提取服务列表
客户端除了自身在发现服务器上注册之外,它还要从服务器中取得已经注册的其他客户端,以得到一个可用的服务列表(其他注册的客户端),这部分的核心代码可以从com.netflix.discovery.DiscovertyClient中找到。
在源码中可以看到主要是将客户端的名称、IP地址和端口号等信息通过一个instanceInfo对象发给发现服务器进行注册。
客户端执行注册使用计划任务的方式来实现,而客户端从发现服务器中更新其他在线的客户端列表也使用了一个定时任务来管理。源代码:EurekaClient
TimerTask定时从发现服务器中取得其他在线的客户端列表,以备使用;
单纯的发现服务,并不能看出它有多大的用途,它只有与动态路由、复杂均衡和监控服务等一起使用,才能发挥其强大的功能;
12.3负载均衡代码剖析
当一个应用启用发现服务的功能之后,会默认启用Ribbon的负载均衡服务。Ribbon通过发现服务获取在线的客户端,为具有多个实例的客户端建立起负载均衡实例列表,然后通过一定的均衡负载算法,实现负载均衡的管理机制;
Ribbon默认结合使用Eureka发现服务,启用负载均衡管理机制;
当没有配置ribbon.eureka.enabled参数的时候,它默认被设定为true
负载均衡源代码分析:
BaseLoadBalancer
程序中加载了一些初始配置,即设定的默认负载均衡规则RoundRobinRule,这是一个使用简单轮询算法的复杂均衡规则。一个负载均衡服务的实现,就是通过一定的负载均衡算法,从可用的服务实例列表中,为请求者提供一个可用的服务;
RoundRobinRule的实现代码中,使用一个循环,从可用的服务列表中,按照顺序选择一个可用的服务,配置了服务的几个实例,第一次调用将访问第一个服务实例,第二次调用将访问第二个服务实例,以此类推,当调用到服务列表的最后一个服务之后再从头来过;
除了RoundRobinRule,Ribbon还提供了一些其他的复杂均衡机制,如加权响应时间规则WeightedResponseTimeRule、区域感知规则:ZonAvoidanceRule、随机规则:RandomRule等;
12.4 分布式消息实现原理演示
使用RabbitMQ实现分布式消息分发,在分布式系统中具有很大的用途,为各个应用之间传递消息和数据提供了很大的方便,并且其松耦合的结构和异步处理机制不会影响系统的性能;
使用spring-cloud-stream可以非常简单的使用RabbitMQ的异步消息,Spring Cloud的配置管理中的分布式消息分发也是通过调用spring-cloud-stream组件来实现的。
实例代码:
https://github.com/chenfromsz/spring-cloud-stream-demo