如何正确使用 Spring Cloud?【中】
3. Spring 集成了哪些常用组件?
从 2004 年发布 1.0 版本开始,Spring 目前已经演进至 5.x 版本了,为不同时期的应用开发提供了强有力的支撑。现在我们正面对微服务、DevOps、云计算这些新的挑战,Spring 家族的新生力量 Spring Cloud 又将给我们提供哪些方面的支撑呢?概括起来说,我觉得主要分为四类:
- 在单个微服务的构建上,它提供了一套应用开发框架,主体是基于 Spring Framework 这个生态的开源产品。
- 在水平维度服务集成上,它以 Starter 的方式集成了大量常用组件和微服务全家桶,达到开箱即用,降低我们开发微服务的难度,提升效率,避免重复投入。
- 在垂直维度资源调度上,它可以跟 Cloud Foundry、Kubernetes、Docker 等平滑集成,让应用上云更加简单,让资源调度变得更加智能高效,让应用具备更大的弹性。
- 在研发流程全线连通上,它可以跟 DevOps 相关系统做一些配合和优化,以便应用能够更加顺畅地通过各个研发环节,让持续集成、持续交付更加高效。
接下来,我们将展开每个点来看一看。首先,我们来看一下它究竟集成了一些什么样的常用组件:
- 监控服务类,包括主机监控(Vector)、应用监控(Actuator)等;
- 存储服务类,包括关系型数据库(MySQL)、文档型数据库(MangoDB)、内存型数据库(Redis)等;
- 消息服务类,包括 ActiveMQ、RocketMQ、Kafka 等;
- 安全服务类,包括 OAuth2.0、JWT 等。
4. Spring Cloud 微服务全家桶有哪些?
除了常用组件之外,Spring Cloud 还集成了微服务全家桶,开箱即用:
- 服务注册发现类,包括:Eureka、Consul、Zookeeper、Etcd 等;
服务注册:每个微服务组件都向注册中心登记自己提供的服务,包括服务的主机、端口号、版本号、通讯协议等信息。注册中心按照服务类型分类组织服务清单,同时以心跳检测的方式监测清单中服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
服务发现:在服务治理框架下,服务间的调用不再通过具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。
- 服务调用框架类,包括:Ribbon、Feign 等;
客户端负载均衡,将负载均衡逻辑集成到消费方,消费方从注册中心获知服务有哪些实例可用,然后再按照某种策略从这些地址中选择一个服务实例进行访问。
- 服务容错组件类,包括:Hystrix 等;
服务熔断:某个目标服务不可用或大量访问超时,系统将断开该服务的调用,对后续的调用请求,系统不再继续转发至此服务,直接返回失败应答,从而快速地释放资源;如果目标服务情况好转,则恢复调用。服务降级:在应急屏蔽或服务熔断情况下,直接返回本地缺省的应答。
- 统一配置中心类,包括:Spring Cloud Config、Spring Cloud Bus 等;
在服务构建阶段,配合构建流水线,为服务软件包或镜像提供配置;在服务运维阶段,动态调整服务配置,满足运维的灵活性需求;在服务开发阶段,提供配置 API 将配置外置化,供其他系统调用。
- 服务网关代理类,包括:Zuul、Spring Cloud Gateway 等;
主要提供服务路由功能,即接收消费方的所有请求,按照某种策略将请求转发至服务提供方。同时,在服务网关中完成一系列横切面的功能,例如:权限校验、请求计量、流量控制、服务质量、请求管理、响应管理、版本管理等。
- 调用链路监测类,包括:Spring Cloud Sleuth,封装了 Dapper、Zipkin 和 HTrace 等;
微服务架构下组件的数量众多,一个业务请求可能需要调用多个服务,调用的复杂性决定了错误和异常难以定位。我们需要知道每个请求到底有哪些服务参与,调用顺序是怎么样的,从而清楚每个调用步骤,出现问题也能很快定位。
通常我们会采用 Eureka 作为服务注册中心,实现服务注册与发现;通过 Ribbon 和 Feign 实现服务的消费以及客户端负载均衡;通过 Spring Cloud Config 实现应用不同环境的外部化配置以及版本管理。为了让服务集群更为健壮,借助 Hystrix 的融断机制来避免微服务架构中个别服务出现异常时引起故障蔓延和雪崩。服务网关 Zuul 为微服务架构门户,将权限控制、计量计费等较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
本文主要价值是帮助大家梳理出 Spring Cloud 相关的知识框架,也就是我们常说的全局视角或者上帝视角。有了这个框架之后,我们可以根据自己的需要按图索骥找相关节点的资料来研究学习,不至于陷入细节找不到方向。当然,考虑到我们每个人的工作学习情况不同,平时遇到的问题也不同,本文内容无法覆盖所有人遇到的问题,欢迎大家留言提问,也欢迎关注「 IT老兵哥 」交流互动,谢谢!
本系列其他文章索引如下:
如何正确使用 Spring Cloud?【中】的更多相关文章
- Spring Cloud中关于Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- 如何正确使用 Spring Cloud?【上】
如何更快地交付软件,每周.每天甚至每个小时向用户发布新特性?如何让新员工在入职后就能部署代码?在如此快的节奏下如何保证质量?快,我们应用开发面临的主要挑战,交付越快就越能紧密地收集到用户反馈,从而更有 ...
- 如何正确使用 Spring Cloud?【下】
5. Spring Cloud 如何融合 DevOps? 接下来,我们来了解一下 Spring Cloud 在与 DevOps 融合方面可以做哪些事情,它是如何让应用持续交付更加快捷的?我们都知道,D ...
- 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...
- Spring Cloud中负载均衡器概览
在上篇文章中(RestTemplate的逆袭之路,从发送请求到负载均衡)我们完整的分析了RestTemplate的工作过程,在分析的过程中,我们遇到过一个ILoadBalancer接口,这个接口中有一 ...
- Spring Cloud中Feign如何统一设置验证token
代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过 ...
- Spring Cloud中的负载均衡策略
在上篇博客(Spring Cloud中负载均衡器概览)中,我们大致的了解了一下Spring Cloud中有哪些负载均衡器,但是对于负载均衡策略我们并没有去详细了解,我们只是知道在BaseLoadBal ...
- Spring Cloud中服务的发现与消费
之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...
随机推荐
- cenos7搭建gitlab
git.github和gitlab的区别 git:是一种版本控制系统,是一个命令,是一种工具 gitlib:是基于实现功能的开发库 github:是一个基于git实现的在线代码仓库软件 gitlib可 ...
- day 17 re模块 正则表达式
import re 引用re模块 查找 finall:匹配所有,每一项都是列表中的一个元素 search:只匹配从左到右的第一个,得到的不是直接的结果而是一个变量,通过group方法获取结果,没 ...
- SpringMVC 前端传递list到后台
---恢复内容开始--- 1.前端获取传入后台的list 2.ajax写法: $.ajax({ type: 'post', url: url, async:false, dataType:" ...
- .NET Core应用框架AA介绍(二)
AA的开源地址 https://github.com/ChengLab/AAFrameWork AA框架是一个基础应用框架,是建立在众多大家熟知的流行工具之上并与之集成.比如:ASP.NET Core ...
- Spring(Bean)1
Spring支持3种依赖注入的方式 (DI依赖注入)*属性注入 (配置bean set方法注入) <bean id="car" class="spring.bean ...
- mysql 中文不显示问题
MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation).对于字符集的支持细化到四个层次: 服务器(ser ...
- java8 按两个属性分组,并返回扁平List; stream排序
--------------- java8 按两个属性分组,并返回扁平List /** * 设置大区小区分组排序 * @param dtoList */ private List<Perform ...
- 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币
原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos ...
- 有趣的css3实战案例剖析—(背景动态渐变)
对于css3的学习,更多的是在于对新特性和基础理论的熟悉,这篇文章通过一个案例带领大家了解css3里一些理论知识,也将一些技巧加以总结,从而提高大家的开发效率: 本次案例为(背景颜色渐变),运用css ...
- C#DateTime格式转换全介绍
DateTime与字符串转换: DateTime()与转换为字符串主要依靠DateTime().ToString(string format) 函数,以我的理解,参数format大体分为单个字母和多个 ...