image.png

学习的一些组件,约十个
Netflix: EurekaRibbon,Feign,HystrixZuul
Alibaba:(NacosSentinel)
Cloud :GatewayOpenFeign,Security,Zookeeper

分布式

RPC思想原理

 RPC
 Netty(Socket)+自定义序列化

RestAPI (严格来说,SpringCloud是使用Rest方式进行服务之间交互的,不属于RPC)
HTTP+JSON

分布式思想与概念

高并发

Tomcat默认最大请求150,Tomcat8.0之后默认并发数为200。当超过并发拥有250,应考虑集群
具体承载需要看cpu数量,分配内存越多性能越高,但会加重GC负担。
 maxThreads=”1000” 最大并发数 ,默认值为200
 minSpareThreads=”100”//初始化时创建的线程数,默认值为10

注册中心的演变

zookeeper —>Eureka —>Nacos

服务雪崩

服务之间复杂调用,一个服务不可用导致整个系统崩溃。

降级熔断

解决服务雪崩,某个服务频繁超时,直接将其短路,返回兜底数据(虚拟值)。

限流

限制某服务每秒调用本服务的频率。
爬虫防Ddos(洪水)攻击。

网关

路由转换,安全,限流,缓存,日志,监控,重试,熔断等。

服务跟踪

追踪服务的调用链,记录整个系统执行请求过程

Elastic Compute Service(ECS)弹性计算服务

动态扩容,压榨服务器闲时能力,避免资源浪费

maven复习


pom标签,提供锁定版本+子modlue不用写groupId和version的作用,不会引入jar包!

统一管理jar包版本

SpringBoot项目快捷启动

Edit Configurations - -> Templates - -> Add Configuration Type (Spring Boot)
以后就可以批量启动微服务

RestTemplate远程调用

Spring提供用于访问Rest服务的模板工具类,提供多种便捷访问远程Http服务的方法。简单便捷的访问Restful服务模板类。
三个参数(请求地址,请求参数,转换的对象类型)
两个常用方法: postForObject( ),getForObject( )

Eureka 服务注册与发现组件

@EnableEurekaClient
@EnableEurekaService
服务治理 —>实现服务注册与发现
传统的RPC远程调用框架,服务间的依赖关系复杂,所以需要服务治理。实现服务调用,负载均衡,容错等。
使用

  1. 服务端依赖(spring-cloud-starter-netflix-eureka-server),客户端(spring-cloud-starter-netflix-eureka-client)
  2. 配置yml

服务端

  1. eureka:
  2. instance:
  3. hostname: localhost
  4. client:
  5. register-with-eureka: false
  6. fetchRegistry: false
  7. service-url:
  8. defaultZone: http://localhost:7001/eureka

客户端

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka
  1. 启动类加Eureka的注解。服务端(@EnableEurekaServer),客户端@EnableEurekaClient

Ribbon负载均衡

Ribbon = 负载均衡(客户端) + RestTemplate
负载均衡算法原理:请求数 % 服务器集群总数

未来替代方案:Spring Cloud LoadBalancer

默认策略 —>轮询
默认心跳时间 —>30秒
默认移出时间 —>90秒(没有收到心跳,服务注册表将移出此节点)

使用

  1. EurekaClient 依赖(spring-cloud-starter-netflix-ribbon)自带Ribbon
  2. @LoadBalanced :RestTemplate集成Ribbon进行负载均衡
  3. 主启动类:@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”,configuration = MySelfRule.class),用于配置类定制化负载策略

Ribbon核心组件Irule

默认策略:RoundRobinRule(轮询)
随机策略:RandomRule

OpenFeign远程调用

OpenFeign就是在Feign上支持了SpringMVC注解和@ResponseBody(把bean转json)

  • Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
  • SpringCloud对Feign进行了封装,使其支持了SpringMVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

@EnableFeignClients :启动类添加启用OpenFeign功能
@FeignClient(spring.application.name):在接口中使用,然后把接口复制过来。用于远程调用。

使用

  1. 创建feign模块,需要openfeign,注册中心
  2. yml配置,服务名,端口号
  3. 启动类启用@EnableFeignClients ,@EnableEurekaClient
  4. Feign接口添加@Component(声明JDK动态代理),@FeignClient(spring.application.name),接口方法与远程调用的Controller方法一致
  5. 控制层@Resource
  6. 依赖注入即可调用远程方法

超时重试与次数
OpenFeign默认等待一秒钟,超过后报错。
yml配置文件,配置ribbon开启重试和设置重试次数
配置hystrix超时时间

所以有时候我们需要设置Feign客户端的超时控制,也即Ribbon的超时时间,因为Feign集成了Ribbon进行负载均衡

使用Feign调用接口分两层,ribbon的调用和hystrix的调用,所以ribbon的超时时间和Hystrix的超时时间的结合就是Feign的超时时间

一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)

日志使用
默认是NONE,不显示任何日志

  1. 调用端添加配置类Logger.Level,返回Logger.Level.(日志级别)

日志级别NONE,BASIC,HEADERS,FULL

  1. 配置文件配置logging

Hystrix熔断器(停更进维)

代替方案:Alibaba Sentinel
一个用于处理分布式系统的延迟容错的开源库,保证一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(Fallback),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证线程不会被不必要的占用,从而避免故障蔓延导致的雪崩。
Jar包spring-cloud-starter-netflix-hystrix

服务降级(Fullback)

@HystrixCommand
服务器忙,不让客户端等待,立刻返回一个友好提示。
以下情况将导致降级(然后介绍三种降级实现)

程序运行异常
超时自动降级
服务熔断触发服务降级
线程池/信号量打满也会导致服务降级
人工降级

hystrix服务降级案例(服务提供者)

  1. 参考Openfeign案例先准备一个远程调用。
  2. 写一个兜底方法(方法名随意,参数与返回结果要与被兜底的方法一样)
  3. 给被兜底方法加@HystrixCommand注解,属性关联上兜底方法,配置上兜底条件(如:超时)
  4. 主启动类激活:@EnableCircuitBreaker
  5. 测试超时或算数异常,都会走降级方法

hystrix服务降级案例(远程调用端,服务消费者)

  1. yml配置feign.hystrix.enable=true
  2. 主启动 @EnableHystrix(等价于@EnableCircuitBreaker)
  3. 给被兜底方法加@HystrixCommand注解,属性关联上兜底方法,配置上兜底条件(如:超时)
  4. 写一个兜底方法(方法名随意,参数与返回结果要与被兜底的方法一样)

全局降级方法
类上@DefaultProperties(defaultFallback = “方法名”)
此时此类中所有方法都会走这个兜底方法

独立降级处理类
实现Feign接口,Feign接口上使用@FeignClient,并且属性指定fallback = 兜底类.class
为每一个接口增加兜底方法

服务熔断(Breaker)

多次降级,达到阈值熔断,降级的特殊形式。
@HystrixCommand,默认10秒内20次调用并有50%失败,就会启动熔断机制。
达到最大服务访问后,直接拒绝访问,拉闸断电。然后调用服务降级方法。是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个服务响应时间太长时,会进行服务降级,进而熔断该节点的调用,快速返回错误的响应信息。
当检测到该节点正常后,恢复调用链路。
image.png

服务限流(Flowlimit)

秒杀高并发等操作,排队有序进行。

接近实时监控(服务监控HystrixDashboard)

@EnableHystrixDashboard
会持续记录所有通过Hystrix发起的请求执行信息,并以统计报表和图标的形式展示 给用户。包括每秒执行多少请求,多少成功,失败等。

Gateway网关

功能:过滤, 反向代理,流控,熔断,日志,鉴权。。。是微服务架构的入口。
SpringCloudGateway底层使用了Netty通讯框架。

三大核心概念

Route路由:网关的基本模块,由ID,目标URI,一系列的断言和过滤器组成,断言为true则匹配路由。

Predicate断言:开发人员可以匹配HTTP请求中的所有内容,如果请求与断言相匹配则进行路由。
断言有很多种类,如路径,时间范围,Cookie,请求头等匹配条件

Filter过滤:可以在请求被路由前或者之后对请求进行修改。
过滤器有31种之多,自定义过滤器实现GlobalFilter,Ordered接口,方法IoC中即可。

Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量控制等有着非常重要的作用

入门案例

配置spring.cloud.gateway.routes相关项({路由ID(建议服务名),路由地址(uri),断言})
服务提供者集群模式下,http协议换成lb协议负载均衡,RRI换成服务名

curl测试工具(相当于不带图形化界面的postman)

crul http://localhost —cookie “user=9527”

Sleuth分布式链路请求追踪(获取数据)

复杂的分布式服务调用链路,任何一环出现问题将导致请求失败。
Sleuth提供了一套完整的服务跟踪的解决方案,并且兼容了zipkin

Zipkin(展示数据)

可以到github下载这个开源项目,端口号9411
启动:java -jar jar包全名

如果需要更详细的信息展示,则可使用专业的 Prometheus(数据采集) —> Grafana(显示)—>Altermanager(预警)

SpringCloudAlibaba

组件:Sentinel,Nacos,RocketMQ,Dubbo,seata,OSS,SMS

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

一整套解决方案,简单理解就是替换Netflix那一套
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

Nacos

Nacos = Eureka+Config+Bus
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
替代Eureka做服务注册中心。
替代Config做服务配置中心。(配置文件的好处是不需要编译,动态的修改配置,便于维护)

服务中心的选择
image.png
image.png

注册中心案例

服务提供者:

  1. 父工程加alibaba依赖
  2. 9001模块加入nacos的discovery依赖(发现与注册,集成了ribbon)
  3. 9001模块yml将9001模块注册到nacos
  4. 9001模块启动类加入@EnableDiscoveryClient(通用注解,能注册到各种服务中心上)
  5. 启动之后去nacos的服务列表查看是否注册成功(可以在nacos上下线服务或者设置权重,默认策略是轮询)

消费者:

  1. 服务创建同上
  2. 控制器用RestTemplate远程调用
  3. 因为服务提供者是集群,所以启动类加@LoadBalanced

配置中心

配置不便于维护,并且多配置文件时,如测试、运维、生产等多套配置,不便于切换。 需要加入config依赖。

配置文件优先级

nacos > bootstrap ->> application.properties >>application.yml

dataId
image.png
profile应该写出profiles!!
如nacos-config-client-dev.yml

控制器注解 @RefreshScope:Cloud的原生注解,能实现配置自带更新,(动态更新配置)

Nacos集群与持久化

辛辛苦苦做的配置,重启服务之后配置没了。
Nacos自带的嵌入式数据库derby,又不能保证数据一致性。所以我们持久化到MySQL。

  1. MySQL执行脚本 nacos-mysql.sql,此脚本在nacos的conf目录下。
  2. nacos默认有数据库,需要修改nacos配置文件,增加MySQL数据源的配置
  3. 此后的配置将由MySQL储存。

集群:

  1. 三个节点application.properties都配置MySQL的数据源。
  2. 三个节点cluster.conf都配置三个节点的ip
  3. nacos默认占用1G,三个节点startup.sh中修改内存大小
  4. ./startup.sh启动,默认就是集群,可在nacos节点列表查看启动状态

!修改nginx配置,连接nacos集群
image.png

Sentinel

实现熔断与限流

sentinel以流量为切入点,从流控熔断降级负载均衡等多个维度保证服务的稳定性。
image.png
image.png

使用案例

  1. java -jar sentinel.jar 启动
  2. 导入jar包
  3. 配置yml
  4. 启动后sentinel服务将注册到nacos
  5. 此时需要访问控制器,sentinel才能监测到

流控规则

image.png
image.png
image.png

降级策略

image.png

热点Key限流

@SentinelResource 使用此注解可修改默认的降级方法。value属性指定资源名(sentinel上的资源而不是方法名),blockHandler属性则是降级(兜底)方法

系统规则

针对所有的资源
image.png

@SentinelResource 自定义异常处理

重点是属性的使用,blockHandler只针对违规起作用,异常时不执行,同时设置时,违规处理方法优先

blockHandler 违规处理
image.png
fallback 异常处理
image.png

独立的降级处理类
image.png
image.png

异常排除(忽略异常,不进行降级)
exceptionsToIgnore = (异常类)
image.png

未来的框架

image.png

规则持久化(整合Nacos)

  1. 加入sentinel-datasource-nacos依赖
  2. yml注册到nacos
  3. 配置sentinel连接nacos