本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容。
本文系志愿者整理,供配合学习中心课程使用,不做商业用途。
Spring Cloud Alibaba是Spring Cloud的一个子项目。致力于提供微服务开发的一站式解决方案,项目包含开发分布式应用服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开 发分布式应用服务;Spring Cloud Alibaba基于Spring Cloud,符合Spring Cloud标准;Spring Cloud Alibaba是阿里的微服务解决方案,只需要添加一些注解和少量配置,就可以将Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
第一节:微服务架构演变过程(上)
传统单体架构——分布式架构——SOA面向服务架构——微服务架构模式
传统架构
传统的架构,也就是为单点应用,也就是大家在早期所学习的JavaEE知识SSH或者SSM架构模式,会采用分层架构模式。
优点:开发简单、运维简单
缺点:该架构模式没有对我们的业务逻辑实现拆分,所有的代码都写入到同一个项目中,只适合小团队或者个人形式开发,不适合团队模式协同工作开发
第二节:微服务架构演变过程(下)
微服务架构模式
微服务架构模式是从SOA架构模式演变过来, 比SOA架构模式粒度更加精细,让专业的人去做专业的事情(专注),目的是提高效率,每个服务与服务之间互不影响,微服务架构中每个服务必须独立部署、互不影响,微服务架构模式体现轻巧、轻量级、适合于互联网公司开发模式。
第三节:详解Nacos的产生与应用
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
默认的端口号是8848。
第四节:Nacos如何整合SpringCloud ?
本节介绍了Nacos整合SpringCloud的详细的步骤过程,通过会员服务(生产者),订单服务(消费者)的案例,引入Maven依赖,配置文件,完成生产者注册,以及消费者调用生产者。
第五节:如何实现客户端负载均衡?
本地负载均衡器基本的概念:我们的消费者服务从我们的注册中心获取到集群地址列表,缓存到本地,然后本地采用负载均衡策略(轮训、随机、hash一致性、权重等),实现本地的rpc远程的。
本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,即本地负载均衡器。属于客户端负载均衡器。
第六节:怎样构建一个微服务项目?
mayikt-opefeign-parent---父工程
---mayikt-service-api----微服务Api接口层,定义了接口没有任何代码的业务实现
----mayikt-member-service-api---会员提供开放接口
----mayikt-order-service-api---订单提供开放接口
---mayikt-service-impl----微服务Api实现层
----mayikt-member-service-impl---会员实现层
----mayikt-order-service-api---订单实现层
微服务架构基本样式,最大的优点能够对我们feign实现复用机制。
第七节:如何基于Nacos实现分布式配置中心?
分布式配置中心实现原理:
1、本地应用读取我们云端分布式配置中心文件(第一次建立长连接)
2、本地应用读取到配置文件之后,本地jvm和硬盘中都会缓存一份。
3、本地应用与分布式配置中心服务器端一直保持长连接。
4、当我们的配置文件发生变化(MD5 | 版本号)实现区分,将变化的结果通知给我们的本地应用及时的刷新我们的配置文件。
第八节:如何基于Nacos集群部署方案?
Nacos 核心帮助我们做的事情:注册中心、分布式配置中心
注册中心:没有必要将数据持久化到数据库中,可以持久化到本地的硬盘。
分布式配置中心: 默认是将数据持久化到本地嵌入式的数据库改为持久化到myql中
第九节:什么是微服务网关?
微服务网关是整个微服务API请求的入口,可以实现过滤Api接口。
作用:可以实现用户的验证登录、解决跨域、日志拦截、权限控制、限流、熔断、负载均衡、黑名单与白名单机制等。
微服务中的架构模式采用前后端分离,前端调用接口地址都能够被抓包分析到。
第十节:Gateway怎样实现服务转发?
Gateway整合Nacos实现服务转发。
微服务网关能够做的事情,Nginx也可以实现。
相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。
不同点:
Nginx采用C语言编写的
在微服务领域中,都是自己语言编写的,比如我们使用java构建微服务项目,Gateway就是java语言编写的。
毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。
Nginx实现负载均衡的原理:属于服务器端负载均衡器。
Gateway实现负载均衡原理:采用本地负载均衡器的形式。
第十一节:如何保证微服务接口的安全?
接口分为内网和外网接口。
外网接口:基于OATUH2.0构建开放平台 比如appid、appsocet获取accesstoken调用接口。
内网接口:都是当前内网中实现通讯,相对于来说比较安全的。
1、需要保证接口幂等性问题(基于Token)
2、接口采用安全加密传输 https协议
3、防止数据被篡改 md5验证签名
4、使用微服务网关实现Api授权认证等、黑名单白名单。
5、对我们的接口实现服务的保护 隔离、熔断、降级等等。
最后使用apiswagger管理我们的微服务接口。
第十二节:如何动态请求参数网关?
动态网关:任何配置都实现不用重启网关服务器都可以及时刷新网关配置。
基于数据库表形式的设计
网关已经提供了API接口
1、直接新增
2、直接修改
思路:
默认加载时候
1、当我们的网关服务启动的时候,从我们数据库查询网关的配置。
2、将数据库的内容读取到网关内存中
网关配置要更新的时候,需要同步调用
第十三节:什么是SpringCloud Sentinel?
前哨以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。
前哨具有以下特征:
- 丰富的应用场景:前哨兵承接了阿里巴巴近10年的双十一大促流的核心场景,例如秒杀(即突然流量控制在系统容量可以承受的范围),消息削峰填谷,传递流量控制,实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接收应用的单台机器秒级数据,甚至500台以下规模的整合的汇总运行情况。
广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的集成模块,例如与Spring Cloud,Dubbo,gRPC的整合。您只需要另外的依赖并进行简单的配置即可快速地接入Sentinel。 - 完善的SPI扩展点:Sentinel提供简单易用,完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理,适应动态数据源等。
第十四节:Sentinel如何保证规则的持久化?
默认的情况下Sentinel的规则是存放在内存中,如果Sentinel客户端重启后,Sentinel数据规则可能会丢失。
解决方案:
Sentinel持久化机制支持四种持久化的机制。
- 本地文件
- 携程阿波罗
- Nacos
- Zookeeper
第十五节:SpringCloud网关如何实现限流?
从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
- route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
- 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
第十六节:sentinel怎样实现熔断降级?
sentinel支持服务的熔断降级
熔断类似于保险丝,在超出了阈值的情况下,在一定的时间内不会执行业务逻辑,直接执行服务降级的方法。
服务降级:利用本地fallback方法,返回一个有好的提示给客户端,不会真实的去执行业务逻辑。
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
第十七节:Sentinel实现热点词限流
可以根据访问频繁的参数实现限流。
热点参数限流:对接口热词实现限流
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
第十八节:什么是分布式事务?
分布式事务产生的背景
分情况来定。
1、在单体的项目中,多个不同业务逻辑都是在同一个数据源中实现事务管理,是不存在分布式事务此时出现异常会直接抛出,用户体验不好,可以此时问题,因为同一数据源的情况下都是采用事务管理器,相当于每个事务管理器对应一个数据源。
2、在单体的项目中,有多个不同的数据源,每个数据源中都有自己独立的事务管理器,互不影响,那么这时候也会存在多数据源事务管理:解决方案jta+ Atomikos
第十九节:SpringCloud 解决分布式事务的两种方式
LCN基本实现原理
发起方与参与方都与我们的LCN管理器一直保持长连接;
发起方在调用接口之前,先向LCN管理器申请一个全局的事务分组id;
发起方调用接口的时候在请求头中传递事务分组id;
参与方获取到请求头中有事务分组的id的,则当前业务逻辑执行完实现假关闭,不会提交或者回滚当前的事务。
发起方调用完接口后,如果出现异常的情况下,在通知给事务协调者回滚事务,这时候事务协调则告诉给参与方回滚当前的事务。
Seata的实现原理
Seata有3个基本组成部分:
事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
事务管理器(TM):定义全局事务的范围:开始全局事务,提交或回滚全局事务。
资源管理器(RM):管理分支事务正在处理的资源,与TC进行对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。