SpringCloud eureka 重试机制ribbon,熔断器Hystrix,简化远程调用Feign

1.重试机制 ribbon

1.1 解释:当一次服务调用失败后,不会立即抛出异常,而是再次重试另一个服务。

1.2 实现步骤:

  • 在服务调用端配置文件中开启重试机制
spring: 
  cloud:
    loadbalancer:
      retry:
        enabled: true # 开启Spring Cloud的重试功能
service:  #负载均衡规则的配置
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  #规则:随机________默认:轮循
    ConnectTimeout: 250 # Ribbon的连接超时时间
    ReadTimeout: 1000 # Ribbon的数据读取超时时间
    OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
    MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
    MaxAutoRetries: 1 # 对当前实例的重试次数
  • pom文件添加依赖
<dependency>
	<groupId>org.springframework.retry</groupId>
	<artifactId>spring-retry</artifactId>
</dependency>
  • 运行测试

当多个消息提供端关闭一个,不会有请求返回异常,经过连接超时时间就会返回所有响应数据

  • 跟踪源码,查看ip地址:
    双击Shift键,搜索LoadBalancerInterceptor–>
    双击Shift键,搜索LoadBalancerlnterceptor–>
    通过intercept方法,点击返回函数execute方法–>
    ctrl + alt +B查找实现类–>
    execute方法处加断点

2.熔断器 Hystrix

2.1 简介 :

Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

2.2 功能 :

当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。

2.3 实现步骤:

  • 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 开启熔断(启动类上)
@EnableHystrix
  • 修改消费者
    查找方法添加注解
    @HystrixCommand(fallbackMethod = “methodFallback”)____回滚函数
  • 运行测试

请求超过一秒得不到响应,就返回模拟错误提示信息

3.ribbon和Hystrix相结合

3.1 简述:

当我们配置完熔断器之后发现,似乎重试机制不生效了,原因是我们这两个技术都采用的是默认时间1s
这并不是我们想要的结果,结合项目的话,我们自然是希望两个功能都要在项目中得到应用
so我们采用的解决方案是:ribbon和Hystrix相结合,先重试再熔断,所以,Ribbon的超时时间一定要小于Hystix的超时时间。

3.2 实现步骤:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 6000 # 设置hystrix的超时时间为6000ms

完美优化!!!

附: 查看端口调用(可能会有用)

@Autowired
    RibbonLoadBalancerClient client;

    @Test
    public void test(){
        for (int i = 0; i < 100; i++) {
            ServiceInstance instance = this.client.choose("service");
            System.out.println(instance.getHost() + ":" + instance.getPort());
        }
    }

4.Feign

4.1 简介

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
简化远程调用代码,替代RestTemplate

4.2 入门

  • 导入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 编写Feign的客户端
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("service")
public interface UserFeignClient {

    @GetMapping("/user/{id}")
    String consume(@PathVariable("id") Long id);

}
  • 注意事项
    •1.首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像
    •2.@FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称
    •3.接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

  • 在服务调用方注入UserFeignClient

@Autowired
private UserFeignClient userFeighClient;
  • 通过远程调用方法获得返回值
this.userFeighClient.queryById(id);
  • 在启动类上,添加注解,开启Feign功能
@EnableFeignClients
  • 原来的RestTemplate已经可以完全删掉了,运行测试,入门完成

4.3 优化

  • 负载均衡
    Feign中本身已经集成了Ribbon依赖和自动配置
    在这里插入图片描述
    可以通过ribbon.xx来进行全局配置。也可以通过服务名.ribbon.xx来对指定服务配置,例举局部:
user-service:
  ribbon:
    ConnectTimeout: 250 # 连接超时时间(ms)
    ReadTimeout: 1000 # 通信超时时间(ms)
    OkToRetryOnAllOperations: true # 是否对所有操作重试
    MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
    MaxAutoRetries: 1 # 同一实例的重试次数
  • Hystix支持
    Feign默认也有对Hystix的集成
    在这里插入图片描述
    只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:
feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能
  • 编写UserFeignClient的实现,作为fallback的处理类
import org.springframework.stereotype.Component;

@Component
public class UserFeignClientFallback implements UserFeignClient {
    @Override
    public String consume(Long id) {
        return "信息查询出现异常!";
    }
}
  • 然后在服务调用端中,UserFeignClient类上指定刚才编写的实现类
@FeignClient(value = "service", fallback = UserFeignClientFallback.class)
  • 重启测试,成功完成优化

猜你喜欢

转载自blog.csdn.net/sinat_42338962/article/details/84864414