SpringCloud使用笔记

Eureka

在这里插入图片描述

在这里插入图片描述

Register服务注册

  • Eureka Client在第一次心跳时间向Eureka Server注册
  • 注册时会提供诸多自身元数据:主机名、端口、健康指标URL等

Renew服务续约

  • Eureka Client通过发送心跳进行续约
  • 默认每30秒发送一次心跳
  • 如90秒内Eureka Server未收到续约,则提出该服务

Cancel服务下线

  • Eureka Client优雅退出时发送cancel命令
  • Eureka Server收到cancel命令时会删除该节点

获取注册表信息

  • Eureka Client会缓存由Server获取的注册表信息

  • Eureka Client会定期更新注册表信息,默认30秒

  • Eureka Client会处理注册表合并等内容

Eureka与Zookeeper

  • 分布式基础:CAP理论

    • 一致性:Consistency
    • 可用性:Availability
    • 分区容错性:Partition tolerance
  • Eureka主要保证AP

  • Zookeeper是典型的CP

Eureka注册慢问题

  • 注册慢的根本原因在于Eureka的AP特性
  • Eureka Client延迟注册,默认30秒
  • Eureka Server的响应缓存,默认30秒
  • Eureka Server的缓存刷新,默认30秒

Eureka的自我保护

  • Eureka Server会自动更新续约更新阈值
  • Eureka Server续约更新频率低于阈值时进入保护模式
  • 自我保护模式下Eureka Serve不会剔除任何注册信息

Ribbon

在这里插入图片描述

  • Ribbon客户端负载均衡器
  • Ribbon核心功能
    • 服务发现
    • 服务选择规则
    • 服务监听

哪些内容能被负载均衡:ServerList

怎么负载均衡:负载均衡算法

IPing:探测服务存活状态

Ribbon与Eureka整合

  • Ribbon天然与Eureka无缝整合
  • 通过@LoadBalanced提供负载均衡支持
  • 通过ribbon.eureka.enabled=false禁用Eureka

Ribbon核心之IRule

  • IRule通过特性算法选取要访问的服务

  • IRule常用BestAvallableRule和WeightedResponseTimeRule

IRule算法 算法描述
RoundRobinRule 轮询规则
RandomRule 随机规则
AvailabilityFilteringRule 可用过滤规则
WeightedResponseTimeRule 根据平均响应时间计算所有服务的权重
RetryRule 遵循RoundRobin规则处理,但是会对失败的服务进行重试
BestAvailableRule 结合了可用过滤规则和响应时长规则
ZoneAvoidanceRule 复合判断server所在区域性能和可用性选择服务器

Ribbon自定义规则

Ribbon核心之IPing

  • IPing是Ribbon保证服务可用的基石
  • 常见实现:NIWSDiscoveryPing、PingUrl
IPing算法 算法描述
NIWSDiscoveryPing 不执行Ping操作,根据Eureka Client的反馈判断存活
PingUrl 使用HttpClient对服务进行Ping操作
DummyPing 默认返回true
NoOpPing 永远返回true
@Configuration
public class RestConfig {
    
    

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
    
    @Bean
    public IRule iRule(){
    
    
        return new RoundRobinRule();
//        return new MyRule();
    }
    
    @Bean
    public IPing iPing(){
    
    
//        return new PingUrl(false,"/abc");
        return new NIWSDiscoveryPing();
    }

}

Ribbon参数配置

  • 默认参数配置:DefaultClientConfigImpl

  • Ribbon Key定义:CommonClientConfigKey

  • Ribbon参数分为全局配置和指定客户端配置

  • 参数格式:.ribbon.=

    ribbon:
    	MaxAutoRetuies:3
    hello-service-provider:
    	ribbon:
    		MaxAutoRetries:3
    

Ribbon核心之ServerList

  • ServerList是Ribbon存储的可用服务列表
  • ServerList可以手动设置
  • ServerList常见应用是从Eureka中自动获取

Hystrix

执行流程:

  1. 调用“main”方法,command、abservable command
  2. 判断有没有缓存
  3. 熔断有没有开启
  4. 限流有没有触发
  5. 业务执行有没有失败
  6. 业务执行有没有超时
  7. 所有的失败都会触发fallback
  8. 业务直接返回

在这里插入图片描述

  • Hystrix是用于处理延迟和容错的开源库

  • Hystrix主要用户避免级联故障,提高系统弹性

  • Hystrix解决了由于扇出导致的"雪崩效应"

  • Hystrix核心是“隔离术“和熔断机制

扇出&雪崩

在这里插入图片描述

在这里插入图片描述

Hystrix主要作用

  • 服务隔离和服务熔断
  • 服务降级、限流和快速失败
  • 请求合并和请求缓存
  • 自带单体和集群监控

Feign

  • Feign是一个非常好用的HTTP客户端
  • Feign很大程度上简化了HTTP调用方式
  • Feign很好的弥补了SpringCloud的HTTP调用缺陷

Feign的特性

  • Feign实现了可插拔注解支持,包括Feign和JAX-RS注解
  • Feign支持可插拔的HTTP编码器和解码器
  • Feign支持HTTP请求和响应的压缩
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(name = "hello-service-provider",
        primary = true,
        path = "/provider",
        fallbackFactory = FallbackFactory.class
//        fallback = ProviderFallbackAPIImpl.class
//        configuration = FeignHelloConf.class,
//        url = "http://localhost:7101"
 )
public interface ProviderApi {
    
    

    @RequestMapping(value = "/sayhello",method = RequestMethod.GET)
    String invokerProviderController(@RequestParam("message") String message);

//    @RequestLine("GET /sayhello?message={message}")
//    String invokerProviderController(@Param("message") String message);

//    @RequestMapping(value = "/{providerId}/sayhello",method = RequestMethod.POST)
//    String providerPost(
//            @RequestHeader("author") String author,
//            @PathVariable("providerId")String providerId,
//            @RequestBody UserModel userModel);

}

Feign基础参数

  • name和value
  • url:手动指定Http调用地址
  • Path:接口统一前缀
  • primary:多实现制定优先级
  • configuration:自定义Feign配置
  • FallbackheFallbackfactory:降级统一处理

Feign的配置

配置类型 默认配置
feignDecoder ResponseEntityDecoder
feignEncoder SpringEncoder
feignLogger Slf4jLogger
feignContract SpringMvcContract
feignBuilder HystrixFeign.Builder
feignClient LoadBalancerFeignClient/feignClient

Feign多组件集成

  • Feign可以集成Ribbon实现负载均衡

    在这里插入图片描述

  • Feign可以集成Hystrix实现命令封装

  • Feign可以集成Hystrix实现业务降级

Gateway

在这里插入图片描述

  • SpringCloud Gateway是Spring官方提供的API网关

  • Gateway是基于Spring5和SpringBoot2开发的

  • Gateway是基于Netty开发的异步调用网关

Gateway特性

  • 提供路由和限流等措施
  • 易于编写的Predicate和Filter,提供了良好的扩展性
  • 提供了Discovery和Hystrix集成

Predicate使用

  • Predicate是路由匹配规则,满足条件即可触发路由
  • Predicate可以进行自定义,满足个性化要求
  • SpringCloud Gateway预置了许多Predicate
类型 作用 入参
After 在该日期之后发生的请求都讲被匹配 日期时间
Before 在该日期之前发生的请求都讲被匹配 日期时间
Between DateTime1和DateTime2 日期时间,日期时间
Cookie 请求包含次cookie名称且正则表达式为真的将会被匹配 cookie名称和正则表达式
Header 请求包含次header名称且正则表达式为真的将会被匹配 header名称和正则表达式
Host 使用Ant路径匹配规则,“.“作为分隔符 host name列表
Method 需要匹配的HTTP请求方式 HTTP Method字符串
Path 判断请求路径是否满足要求 Path表达式和可选标识

Filter使用

  • Filter可以对Request进行请求过滤处理
  • Gateway的Filter分为全局和局部两种
  • Filter除了过滤还可以对请求内容进行增强处理

全局Filter

类型 作用
LoadBalancerClientFilter 负载均衡过滤器
Netty Routing Filter 默认使用netty的底层
RouteToRequestUrlFilter 新的请求路由
Websocket Routing Filter websocket路由
Gateway Metrics Filter 路由监控,配合spring-boot-ostarter-actuator

局部Filter

类型 作用
AddRequestHeader 添加请求header
AddRequestParameter 添加请求参数
AddResponseHeader 添加响应header
DedupeResponseHeader 响应头去重
Hystrix GatewayFilters 断路器的开关
PrefixPath 路径匹配
PreserveHostHeader 发送原始host
RequestRateLimiter 限流
RedirectTo 重定向

猜你喜欢

转载自blog.csdn.net/tolmanlau/article/details/105924659