【笔记】SpringCloud(2)之Spring Cloud Ribbon/Hystrix

客户端负载均衡Spring Cloud Ribbon

前言

在这里插入图片描述

基于Http和Tcp的客户端负载均衡工具

  1. 微服务中使用客户端负载均衡
    1. 服务提供者:只需要启动多个服务实例并注册到一个注册中心或多个注册中心
    2. 服务消费者:调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用

    @Bean
    @LoadBalanced
        //开启客户端负载均衡
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;

RestTemplate

  1. get请求:getForObject、getForEntity
  2. post请求:postForEntity、postForObject、postForLocation
  3. put请求:put
  4. delete请求:delete
//例如参数 url:http://<服务名>/路径参数
restTemplate.getForObject("http://HELLO-SERVICE/hello",String.class)
restTemplate.postForEntity("http://HELLO-SERVICE/insertOne",user,User.class)
restTemplate.put("http://HELLO-SERVICE/updateOne/{id}",user,id);
restTemplate.delete("http://HELLO-SERVICE/delete/{id}",90);

Ribbon参数配置

  1. 全局配置 ribbon.ConnectTimeout
  2. 指定客户端配置 <服务名>.ribbon.listOfServices=

与Eureka结合

  1. Spring Cloud 同时引入Ribbon和Eureka会触发Eureka实现对Ribbon的自动化配置,可用ribbon.eureka.enable 禁用
  2. 区域亲和策略 eureka.instance.metadata-map.zone

ribbon重试

在这里插入图片描述

服务容错保护Spring Cloud Hystrix

使用Hystrix

  1. 引入spring-cloud-starter-hystrix依赖
  2. 开启断路器@EnableCircuitBreaker
  3. 改造服务消费模式
    1. 新增service类,注入ResTemplate
    2. 在相应的函数上添加@ HystrixCommand注解,指定回调方法

断路器模式

当某个服务单元发生故障之后,通过断路器的故障监控,自调用方法返回一个错误响应,而不是长时间的等待,这样就不会使得线程因调用故障服务而被长时间占有不释放,避免了故障在分布式系统中的蔓延;

Hystrix的默认超时时间为2S,底层使用RxJava

Hystrix接口和注解的使用方法

使用方式

  1. 通过继承 继承HystrixCommand 重写run方法,可同步/异步
  2. 通过@HystrixCommand注解 异步需要
	//注解-异步方式
    @HystrixCommand
    public Future<User> getUserByAsyc(Long id) {
        return new AsyncResult<User>() {
            @Override
            public User invoke() {
                return restTemplate.getForObject("http://HELLO-SERVICE/user/{id}",User.class,id);
            }
        };

    }

服务降级(fallback是Hystrix执行失败后的备用方法)

  1. 通过重载getFallback()
  2. 注解 @HystrixCommand(fallbackMethod = “helloFallback”),
    1. 注解使用的方法和指定降级的方法在同一个主类上;
    2. 异常获取,在fallback实现的方法中添加Throwable e参数,可获取异常
    3. 异常传播 ignoreExceptions
      注解-同步调用 (ignoreExceptions 异常传播 不会触发后续的fallback逻辑)@HystrixCommand(ignoreExceptions = {HystrixBadRequestException.class})

线程池划分、命令令名称、分组

  1. 继承方式忽略
  2. Hystrix命令默认的线程划分是根据命令分组来实现的,默认相同组名的的名称使用的同一个线程池;
//commandKey :命令名称(命令名)
//groupKey:分组(组名)
//threadPoolKey:线程池划分
@HystrixCommand(commandKey = "zhuJieUser",groupKey = "userGroup",threadPoolKey = "zhuJieUserThread")

请求缓存

  1. 继承方式重载getCacheKey()方法
  2. 注解方式
    1. cacheKeyMethod:用于指名请求命名同一个类中,指定一个方法作为缓存key (用于定义缓存key)
    2. 缓存清理时,commanKey必须指定
      在这里插入图片描述

请求合并(减少通信消耗和线程数占用)

在这里插入图片描述

  1. 继承方式(省略)
  2. @HystrixCollapser注解
  3. 是否使用请求合并主要考虑请求本身的延迟延迟时间窗内的并发量

     /**
     * batchMethod指定批量请求方法
     * collapserProperties 请求合并器设置相关属性
     * timerDelayInMilliseconds 设置合并时间窗
     * @param id
     * @return
     */
    @HystrixCollapser(batchMethod = "findAll",collapserProperties = {@HystrixProperty(name="timerDelayInMilliseconds",value = "100")})
    @Override
    public User fing(Long id) {
        return null;
    }

    @HystrixCommand
    @Override
    public List<User> findAll(List<Long> ids) {
        return restTemplate.getForObject("http://HELLO-SERVICE/users?ids={1}",List.class, StringUtils.join(ids,","));
    }

属性详解

  1. 全局默认值:没有下边三个,此为默认项
  2. 全局配置属性:配置文件中定义全局属性,可用Spring Cloud Config和Spring Cloud Bus 动态刷新配置
  3. 实例默认值:通过代码为实例设置属性
  4. 实例配置属性:配置文件中定义实例属性,可用Spring Cloud Config和Spring Cloud Bus 动态刷新配置

具体的属性配置

(转)属性配置

Hystrix 仪表盘

(转)Hystrix 仪表盘

引入Turbine来聚合监控

(转)聚合监控

参考《Spring Cloud 微服务实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值