一.SpringBoot自动化配置原理

1.@SpringBootConfiguration

proxyBeanMethods = true:Full模式,保证每个@Bean单实例的(默认)
proxyBeanMethods = false:Lite模式,每个@Bean新创建的

2.@Import注解使用

@Import提供4中用法:

  1. 导入Bean
    @Import(User.class)
    User user1 = applicationContext.getBean(“com.itheima.sh.pojo.User”, User.class);
    获取全限定名
  2. 导入配置类
    @Import(MyConfig.class) 此类上加了@Configuration注解
    User user1 = applicationContext.getBean(“getUser”, User.class); 通过方法名获取对象
  3. 导入 ImportSelector 实现类。一般用于加载配置文件中的类
    image.png**@Import(MyImportSelector.class)完成导入
  4. 导入 ImportBeanDefinitionRegistrar 实现类
    image.png
    @Import(MyImportBeanDefinitionRegistrar.class) 在此类中获取

    3.自动化配置

    二.SpringCloud微服务

    微服务架构:
    网关: zuul(淘汰 Netflix), SpringCloud Gateway(推荐)
    注册中心: Zookeeper、consul、Eureka、nacos(推荐)
    配置中心:SpringCloud config + bus(淘汰 Netflix)、apollo(携程)、nacos(推荐)
    远程调用: Ribbon、Feign(推荐), feign基于Ribbon实现
    熔断器:Hystrix(淘汰 Netflix), Alibaba Sentinel(推荐) 熔断降级
    分布式事务: Alibaba Seata-AT模式
    消息驱动:SpringCloud Stream(推荐)
    链路追踪:SpringCloud Sleath + zipkin, Skywalking(推荐)
    SpringCloud Alibaba 和 SpringCloud 关系:
    Alibaba 出现是为了解决 SpringCloud中相关组件不维护的问题,不是替代SpringCloud的,而是对SpringCloud的增强,所以Alibaba和SPringCloud可以配合使用

    1.Netflix Eureka 服务注册中心

    注意:
    1.注册中心宕机是否会影响服务间的调用?
    已经调用过的服务:不影响因为有本地缓存;新的服务则无法注册到注册中心
    2.Eureka如何保证集群高可用?
    原理:相互注册 集群:没有主从概念
    Eureka 时间 :
    心跳续约时间: 30s
    定时扫描间隔: 60s
    续约次数阈值: 0.85
    心跳的超时时间:90s

    服务的注册与发现

    image.png
    1、Eureka Server 启动成功,创建服务注册表,等待服务端注册。
    2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务,并获取Eureka Server的注册表并维护在本地。
    3、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。
    4、Eureka Client 获取到目标服务器信息,发起服务调用。
    5、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。
    6、Eureka Client 会每30s向 Eureka Server 发送一次心跳请求,证明客户端服务正常。
    7、当 Eureka Server 超过90s 没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。
    8、如果在15分钟内是否超过85%的客户端节点都没有正常的心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。
    9、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。

    自我保护机制:

    Eureka Server在90秒内没有收到Eureka Client的心跳,则可能会将该client从注册表删除。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制(如果在15分钟内超过85%的客户端节点都没有正常的心跳)。
    当进入自我保护机制后,会出现的情况:
    1)Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
    2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
    3)当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

    2.负载均衡组件Ribbon执行流程

    SpringCloud Alibaba dubbo 远程调用服务框架 RPC实现
    SpringCloud Ribbon 组件服务调用框架 HTTP 协议
    ac6ed8e6612d6e796f4b6c41c6f5150.png

    负载均衡算法:

    ILoadBalancer 接口:专门定义负载均衡算法的接口,
    Server SchooseServer(key): 基于负载均衡的算法得到对应服务实例
    1、RoundRobinRule(轮询算法)
    2、RandomRule(随机算法)
    3、AvailabilityFilteringRule():会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量
    过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
    4、BestAviableRule():会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    5、WeightedResponseTimeRule():根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高
    6、ZoneAvoidanceRule():默认规则,符合判断server所在区域的性能和server的可用性选择服务器

    3.feign的远程调用

    除了方法名不一样,其他的都要保持一样
    1.feign的实现是基于动态代理实现类,实现的远程调用
    2.参数和返回值都要经过序列化和编码
    3.FeignClient是基于Ribben负载均衡实现的
    超时设置:
    b55aeb79afd0f021a49fb41b222f1b8.png
    ribbon 的总超时时间(<)hystrix的超时时间
    Feign和Ribbon的区别
  • Ribbon 需要自己构建 Http 请求,模拟 Http 请求而后用 RestTemplate 发送给其余服务,步骤相当繁琐。
  • Feign 采使用接口的方式,将需要调使用的方法声明即可,不需要自己构建 Http 请求。不过要注意的是声明方法的注解、方法签名要和提供服务的方法完全一致

    4.SpringCloud Gateway 网关:

    由过滤器组成实现的
    作用:
    ● 流量聚合,对流量进行监控,日志输出
    ● 作为整个系统的,对流量进行控制,有限流的作用
    ● 作为系统的前端边界,外部流量只能通过网关才能访问系统
    ● 可以在网关层做权限的判断
    ● 可以在网关层做缓存==》全局过滤器

路由转发、流量监控、限流(令牌桶算法Redis)、日志、认证鉴权、跨域处理
Spring Cloud Gateway根据作用范围划分为==GatewayFilter和GlobalFilter==,二者区别如下:

  • GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过spring.cloud.default-filters配置在全局,作用在所有路由上
  • GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。(@Order(0))

网关中断言匹配是什么? 你们项目中用的是什么? 还有哪些?
image.png
image.png
网关使用需要基于 注册中心(nacos、eureka)
网关也具备负载均衡功能,功能实现基于Ribbon,默认负载均衡的算法是 轮询

5.服务的雪崩现象(级联效应):

在服务级联调用过程中(A-》B-》C-》D), 因某一个服务节点宕机导致整个调用链路级联失败的现象

解决方法:

线程池隔离: 仓壁模式(大船)
服务熔断是手段,降级是结果(保险丝)

断路器三种状态:

image.png
CLOSED 关闭状态(断路器关闭),所有请求都正常访问。
OPEN 打开状态(断路器打开),所有请求都会被降级。
HALF-OPEN(允许部分服务可用):中间状态
1、失败比例超过 50% ,触发断路器 Clsed - OPEN
2、保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 允许部分服务可以访问
3、判断部分服务请求的时失败率,如果超过50% HALF-OPEN -> CLOSED
否则HALF-OPEN -> OPEN