目录
1微服务
1.1什么是微服务
程序中的微服务,就是将各个业务系统的共性再进行抽取,做成独立的服务,如图所示:
1.1.1为什么需要微服务
对系统分而治,解决因并发访问过大带来的系统复杂性(例如:业务,开发,测试,升级,可靠性等)
1.1.2微服务设计的特点
单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但会带来一定的维护成本
1.2SpringCloud Alibaba微服务解决方案
1.2.1概述
Spring Cloud Alibaba 是Spring Cloud的一个子项目,致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
1.2.2核心组件分析
Spring Cloud Alibaba 默认提供了如下核心功能(先了解):
- 服务限流降级:
默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:
基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
- 分布式配置管理:
基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:
基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 分布式任务调度:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行。
1.2.3解决方案架构设计
基于Spring Cloud Alibaba实现的微服务,解决方案设计架构如图所示:
2Nacos
2.1背景
在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
常用注册中心:Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google)
如何选择注册中心:社区活跃度,稳定性,功能,性能等
2.2概述
Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。
官网:https://nacos.io/zh-cn/docs/quick-start.html
2.3服务注册与调用入门
业务描述:
创建两个项目Module分别为服务提供者和服务消费者,两者都要注册到NacosServer中(这个server本质上就是一个web服务,端口默认为8848),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),如图所示:
2.3.1服务注册调用顺序
配置文件(yml)------->消费端(服务端) ------->pom.xml文件--------->Nocos----------->数据库
2.4Nacos常见bug
- 启动nacos时,JAVA_HOME环境变量定义错误,例如:
说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的
- Nacos的application.properties配置文件中,连接数据库的配置错误.
- 服务注册时,服务名不正确,例如:
- 服务调用时,连接异常,例如:
- 服务调用时底层404问题,例如:
- 在使用Feign接口的时候,@PathVariable 的参数没有写,例如:
2.5负载均衡
2.5.1概述
一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?
2.5.2服务调用
2.6Feign接口
2.6.1Feign是什么
2.6.2Feign应用实践
@EnableFeignClients //当时用这个注解描述配置类时,主要用于告诉spring框架,要对使用@FeignClient描述的接口创建实现类以及对象
@FeignClient (name(valuse)="服务名",contextId = "接口名首字母小写",fallbackFactory = ProviderFalbackFactory.class)
参数说明:
contextId :一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务启动就会失败
FallbackFactory:,当我们在进行远程服务调用时,假如调用的服务突然不可用了或者调用过程超时了,一般服务消费端会给出具体的容错方案,例如,在Feign应用中通FallbackFactory接口的实现类进行默认的相关处理
2.7配置中心
2.7.1概述
配置中心:存储项目配置信息的一个服务
为什么需要配置中心: 动态管理发布配置,无需重启服务,更好保证服务的可用
配置中一般要配置的内容:经常变化的配置数据-日志级别,线程池、连接池
配置中心选型时要重点考虑的因素:市场活跃度、稳定性、性能、易用
2.7.2nacos配置入门
@RefreshScope注解的作用:在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化)
2.7.3nacos配置管理模型
3Sentinel限流熔断应用实践
3.1概述
在我们日常生活中,经常会在淘宝、天猫、京东、拼多多等平台上参与商品的秒杀、抢购以及一些优惠活动,这些场景都无一例外的会引起服务器流量的暴涨,导致网页无法显示、APP反应慢、功能无法正常运转,甚至会引起整个网站的崩溃。
我们如何在这些业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?我们可以在系统负载过高时,采用限流、降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生。例如Sentinel。
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel核心分为两个部分:
- 核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。
3.2Sentinel限流
我们系统中的数据库连接池,线程池,nginx的瞬时并发,MQ消息等在使用时都会跟定一个限定的值,这本身就是一种限流的设计。
限流的目的防止恶意请求流量、恶意攻击,或者防止流量超过系统峰值。
- sentinel中的阈值应用类型?(两种-QPS,线程数)
- Sentinel的限流规则中默认有限流模式?(直连,关联,链路)
- Sentinel的限流效果有哪些?(快速失败,预热,排队)
3.3
Sentinel降级应用实践
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)
3.4Sentinel 异常处理
Sentinel中限流,降级的异常父类是?(BlockException)
系统提供了默认的异常处理机制,假如默认处理机制不满足我们需求,我们可以自己进行定义。
定义方式就是可以直接或间接实现BlockExceptionHandler接口,并将对象交给spring管理。
3.5Sentinel热点规则
热点:经常被访问的数据,比如:id
热点规则的限流模式只有QPS模式(这才叫热点)
参数索引为@SentinelResource(“res”)注解的方法参数下标,0代表第一个参数,1代表第二个参数。res为形参。
热点数据的访问出现限流以后底层异常是?(ParamFlowException)
3.6Sentinel系统规则(了解)
系统在生产环境运行过程中,经常需要监控服务器的状态,看服务器CPU、内存、IO等的使用率;主要目的就是保证服务器正常的运行,不能被某些应用搞崩溃了;而且在保证稳定的前提下,保持系统的最大吞吐量。
3.7Sentinel授权规则(重要)
我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。
实现:
定义RequestOriginParser接口的实现类,在接口方法中解析请求参数数据并返回,底层会基于此返回值进行授权规则应用,并且交给spring管理。
- Sentinel如何识别白名单和黑名单?(在拦截器中通过调用RequestOriginParser对象的方法检测具体的规则)
- 授权规则中RequestOriginParser类的作用是什么?(对流控应用值进行解析,检查服务访问时传入的值是否与RequestOriginParser的parseOrigin方法返回值是否相同。)
4.网关Gateway应用实践
4.1背景分析
一个大型系统在设计时,经常会被拆分为很多个微服务。客户端要如何去调用 这么多的微服务呢?客户端可以直接向微服务发送请求,每个微服务都有一个公开的URL,该URL可以直接映射到具体的微服务,如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的架构,会存在着诸多的问题,例如,客户端请求不同的微服务可能会增加客户端代码或配置的复杂性。还有就是每个服务,在调用时都需要独立认证。并且存在跨域请求,也在一定程度上提高了代码的复杂度。基于微服务架构中的设计及实现上的问题,为了在项目中简化前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度,更好保护内部服务,提出了网关的概念。
4.2概述
Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 等技术开发的一个网关组件,它旨在为微服务架构提供一种简单有效的统一的 API入口,负责服务请求路由、组合及协议转换,并且基于 Filter 链的方式提供了权限认证,监控、限流等功能。
依赖Netty与WebFlux(Spring5.0),不是传统的Servlet编程模型(Spring MVC就是基于此模型实现)
4.3具体实现概述
- 网关项目中的负载均衡是如何实现?(基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)
- 网关项目中过滤器的类型?(GlobalFilter,GatewayFilter)
- 网关项目中的请求处理逻辑是如何实现的?(XxxHandlerMapping–谓词逻辑->XxxWebhandler-Filters–>…)
5详细访问如下帖子
说明:该贴只是简单的知识体系整理,详细访问如下帖子:
3.配置中心