SpringCloud

141 阅读10分钟

SpringCloud-Alibaba_使用教程

微服务

  微服务是一种架构模式,提倡将单一的应用程序分为一组小的服务,服务直接相互协调配合,为用户提供最终价值。每个服务能够被独立的部署到生产环境上。

微服务的特点:小、独、轻、松。

  • 小:每个微服务力度小,每个服务是针对一个单一职责的业务能力的封装。

  • 独:独立部署运行和扩展,代码相对单体项目来说更易理解。

  • 轻:系统相比较复杂单体应用更为简洁轻量化,每个服务因为独立部署,还可以跨语言编写,使得微服务架构更为灵活。

  • 松:低耦合性,不同模块之间依赖低,相互关联小,提高容错性,比如说直播间,聊天室是一个服务,直播是一个服务,聊天室出现问题,并不影响直播的使用,只需要单独修复聊天室的错误即可,不像之前需要整个服务都关闭。

微服务的缺点

  微服务应用是分布式系统,所以会带来固有的复杂性,所以部署一个微服务应用,测试一个基于微服务的应用也是一个很复杂的任务;
  服务之间虽然是低耦合,但是要相互依赖;
  微服务的数据管理也很麻烦,是分布式的,保持数据的一致性是个问题,需要用到分布式事务。

SpringCloud

  SpringCloud 并不是一个框架,而是一个微服务整体架构,是一个生态圈,里面包含了很多服务,各个服务独立存在,互不干扰。SpringCloud 是一个基于 SpringBoot 实现的云应用开发工具。

官网:https://spring.io/projects/spring-cloud

它的优缺点有

  约定优于配置,基于注解,没有配置文件,而且多数组件都比较轻量级,开发简便,SpringCloud之间的组件都是解耦的,开发人员可以灵活选择组件。但是项目结构复杂,每一个服务都需要单独启动,所以部署门槛比较高。

核心成员

1.Spring Cloud Netflix

  Spring Cloud Netflix是市场上第一套微服务架构解决方案,为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如:服务发现,断路器,网关等)

常用组件

服务治理/注册中心:spring-cloud-netflix-eureka

  和Feign一样,主要提供服务和发现服务,就是所有的服务都注册到这里

客户端负载均衡:spring-cloud-netflix-ribbon

  主要是客户端的负载均衡的服务调用,Feign 的使用比 Ribbon 更加方便,只需要创建一个接口,然后再上面添加 @FeignClient 然后指定提供者就行,它的负载均衡也是借助 Ribbon 实现的,而 Ribbon 需要创建实体类,注入 RestTemplate,发送消息给指定的提供者

服务容错保护:spring-cloud-netflix-hystrix

  服务熔断,服务降级,服务状态的监控。

  熔断器,是应对雪崩效应的一种微服务链路保护机制,主要用于服务的降级处理和熔断处理,防止单个服务故障,从而耗尽服务器的资源,线程资源,最终导致微服务中服务的级联崩溃。还会默认对请求进行缓存。

  熔断器有三个状态:开路,闭路,半开路

  在一定时间内,默认5秒,超过一定次数,默认20次,并且请求失败率超过百分之五十,熔断器自动切换成开路状态,所有请求都会直接返回失败,不再请求服务器,保持开路时间一段时间,默认5秒,然后修改为半开路状态,会放行一个请求到服务器,如果成功则熔断器切换成闭路状态,如果失败,切换成开路状态;

  如果服务异常,可以定义一个fallback方法,当服务异常或者超时时,会去执行fallback方法,在指定方法上加@HystrixCommand(fallbackMethod = "方法名"),也可用@DefaultProperties(defaultFallback = "方法名")来指定全局降级方法,指定fallbackMethod 的使用指定的降级方法,没有指定的使用全局降级方法。

  feign也可开启hystrix的降级方法,如果提供者出现异常、或者提供者宕机,可以使用某个类继承带有feign接口,重写的方法即是降级方法。

  如果提供者使用了@HystrixCommand降级方法返回参数则不会触发feign的降级方法,如果没有使用则会使用到feign的降级方法。

网关:spring-cloud-netflix-zuul

  实现路由分配,网关介于服务端与客户端的中间层,所有外部服务都会先经过网关,客户只能跟网关进行交互,实现统一入口,通过路由分配到指定的微服务上;实现过滤处理,比如登录校验,参数校验,版本比对等等

  Zuul1.X是一个基于阻塞I/O的API,采用的是Tomcat容器,Zuul1.X是基于Servlet的一个阻塞式处理模型,Servlet是一个简单的网络IO模型,当请求进入Servlet容器时,Servlet容器就会为其绑定一个线程,一旦并发高,严重影响请求的处理时间

2018 年 12 月 12 日,Netflix 宣布 Spring Cloud Netflix 系列技术栈进入维护模式(不再添加新特性)

2.Spring Cloud Alibaba

  Spring Cloud Alibaba 是 SpringCLoud 生态圈第二套主流微服务架构解决方案,致力于提供服务开发的一站式解决方案。

常用组件

网关:Spring Cloud -GateWay

  GateWay是SpringCloud自己研发的网关,是Zuul1.X版的替代,旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的功能,例如:熔断、限流、重试等

GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reator模式通信框架 Netty,还支持WebSocket,在高并发和非阻塞通讯时有很大优势。

使用GateWay的原因:

  1. Zuul2.X虽然发布了,但是还是个半成品,而且Netflix相关组件都进入维护期
  2. GateWay使用非阻塞的API,还支持WebSocket

GateWay的工作流程:

  1. 客户端向GateWay发出请求,然后在GateWay Handler Mapping中找到与请求相匹配的路由,将其发送到GateWay Web Handler。
  2. Handler再通过制定的过滤器来将请求发送到我们实际的服务执行业务逻辑,然后返回。
  3. 我们可以在发送代理请求之前进行参数校验、权限校验、流量监控、日志输出、协议转换等,可以在请求之后做响应内容、响应头的修改,日志的输出、流量监控等过滤链操作。

PS:GateWay不需要spring-boot-starter-web依赖

注册中心、配置中心:Nacos

Nacos官方GitHub地址:https://github.com/alibaba/Nacos

下载地址:https://github.com/alibaba/nacos/tags

为什么叫Nacos?

前四个字母分别为 Naming 和 Configuration 的前两个字母最后的 s 为 Service

是什么?可以做什么?

一个更利于构建云原生应用的动态服务发现、配置管理和服务管理平台,可以做注册中心和服务配置中心

Nacos自带Ribbon负载均衡,也可使用Feign进行负载均衡调用

分布式系统的流量防卫兵:Sentinel

Sentinel官网:https://sentinelguard.io/zh-cn/

github地址:https://github.com/alibaba/Sentinel

Sentinel是什么?做什么?

Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件。与Hystrix库相比,它提供了更丰富的功能,以及更直观的实现。

Sentinel分为两部分:

  • 核心库(Java客户端),不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。
  • 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

Sentinel流控规则

监控应用的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

资源名:唯一名称,默认请求路径

针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

阈值类型/单机阈值:

  • QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流
  • 线程数:当调用该api的线程数达到阈值时,进行限流,线程数是进入请求,如果指定线程数处理不过来,才会拦截

是否集群:不需要集群

流控模式:

  • 直接:api达到限流条件时,直接限流
  • 关联:当关联的资源达到阈值时,就限流自己,A关联服务B,B服务达到阈值,限流A阈值
  • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,达到阈值,就进行限流,  【api级别的针对来源】

流控效果:

  • 快速失败:超出阈值,直接失败,抛出异常
  • Waram Up(预热):根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过设置的预热时长,才慢慢达到设置的QPS阈值,用在平时访问量比较低,有时候会突然增加很多访问量,预热是为了保护系统,慢慢的把流量放进来
  • 排队等待:匀速排队,让请求以匀速的速度通过,比如设置了阈值为1,就算一次来了一百个请求,一次也只接受处理一个请求,与处理时间无关,如果排队时间大于设定的超时时间,还未被接收,则直接拒绝访问,阈值类型必须设置为QPS,否则无效,对应漏桶算法:以任意速率往桶中放入水滴,以固定速率从桶中流出水滴,桶中的容量是固定的,溢出的水滴会被拒绝访问,或调用降级方法。
    要注意:/testA 和 /testA/ 是两个路径,虽然请求结果一样,但是好像添加流控规则时要注意

Sentine熔断降级

Sentinel熔断降级在调用链路中某个资源出现不稳定状态时,对这个资源的调用进行限制,让请求快速失败,挡子源被降级后,在接下来的时间窗口之内,该资源都会自动熔断(默认是抛出DegradeException),Sentinel熔断和Hystrix不同,没有半开状态。

  • RT(平均响应时间,秒级):平均响应时间超过设定的阈值QPS >= 5,同时满足则触发降级,窗口期过后关闭断路器,RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX配置才能生效)。
  • 异常比例(秒级):QPS >= 5且异常比例(秒级统计)超过设定的阈值时,触发降级,时间窗口结束关闭断路器。
  • 异常数(分级)当资源近一分钟的异常数超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级的,当timeWindow小于60s,则熔断状态也是按照60s

Sentine热点限流

需要再接口上加上@SentinelResource(value = "唯一标识,一般是不带/的接口地址",blockHandler = "降级方法")

blockHandler管控制台配置违规,fallback管运行异常

设置热点的下标从0开始,根据阈值进行限定,如果不加blockHandler降级之后直接把异常打到前端,降级方法的参数要和需要降级的方法一致,多一个BlockException exception

并且只能用@SentinelResource里的value作为资源名才可进行热点限流

添加热点规则之后可以添加参数例外项,就是对某个vip参数值进行单独阈值限定