天天看点

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)

在上篇博客的代码里,用@HystrixCommand fallbackMethod进行服务熔断、服务降级是很不好的,因为是在服务提供者里进行处理的,和业务代码耦合度太高,不利于维护,所以需要解耦,将服务熔断、服务降级放在服务消费者里进行处理,本篇博客介绍下Feign与Hystrix整合

实现解耦具体步骤

1、修改microservice-student-provider-hystrix-1004项目,不用原先那套,按照正常的逻辑来写

在StudentService里加新的接口方法:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
/**
 * 获取信息
 * @return
 */
public Map<String,Object> getInfo();
           

StudentServiceImpl写具体实现:

@Override
public Map<String, Object> getInfo() {
	Map<String,Object> map=new HashMap<String,Object>();
	map.put("code", 200);
	map.put("info", "业务数据");
	return map;
}
           

StudentProviderController正常调用service方法:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
/**
 * 获取信息
 * @return
 * @throws InterruptedException
 */
@ResponseBody
@GetMapping(value="/getInfo")
public Map<String,Object> getInfo() throws InterruptedException{
	Thread.sleep(900);
	return studentService.getInfo();
}
           

2、在microservice-common项目新建FallbackFactory类,解耦服务熔断、服务降级

在StudentClientService里新增getInfo方法:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
/**
 * 获取信息
 * @return
 */
@GetMapping(value="/student/getInfo")
public Map<String,Object> getInfo();
           

新建一个StudentClientFallbackFactory类,实现FallbackFactory<StudentClientService>接口:

package com.ue.service;

import com.ue.entity.Student;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class StudentClientFallbackFactory implements FallbackFactory<StudentClientService> {
 
    @Override
    public StudentClientService create(Throwable cause) {
        // TODO Auto-generated method stub
        return new StudentClientService() {
             
            @Override
            public boolean save(Student student) {
                // TODO Auto-generated method stub
                return false;
            }
             
            @Override
            public List<Student> list() {
                // TODO Auto-generated method stub
                return null;
            }
             
            @Override
            public Map<String, Object> getInfo() {
                Map<String,Object> map=new HashMap<String,Object>();
                map.put("code", 500);
                map.put("info", "系统出错,稍后重试");
                return map;
            }
             
            @Override
            public Student get(Integer id) {
                // TODO Auto-generated method stub
                return null;
            }
             
            @Override
            public boolean delete(Integer id) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public String ribbon() {
                return null;
            }
        };
    }
}
           

在StudentClientService接口的@FeignClient注解里加上fallbackFactory属性 ,并指定上面新建的StudentClientFallbackFactory类:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
@FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=StudentClientFallbackFactory.class)
           

3、修改microservice-student-consumer-feign-80项目支持Hystrix

在StudentConsumerFeignController新增方法调用服务提供者的接口:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
@GetMapping(value="/getInfo")
public Map<String,Object> getInfo(){
	return studentClientService.getInfo();
}
           

在application.yml里加上hystrix的配置:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
feign:
  hystrix:
    enabled: true
           

4、开始测试,先启动三个eureka,在启动带hystrix的provider,最后启动带feign、hystrix的consummer:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)

然后在浏览器地址栏输入http://localhost/student/getInfo,结果如下:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)

Feign与Hystrix整合之默认超时时间配置

Feign与Hystrix整合后,Hystrix的超时时间要配置在消费端,也就是配置在microservice-student-consumer-feign-80的yml里:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000
           

但是配置进去后测试依然无效,这是因为feign也有一个超时时间的设置,feign底层是ribbon的封装,所以直接配置ribbon即可(ribbon默认超时也是1秒),所以这里是强制要求,ribbon的超时时间要大于hystrix的超时时间,否则hystrix自定义的超时时间毫无意义,所以还得加个ribbon超时时间设置:

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 9000
           

图解如下:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)

然后就可以进行测试了,结果如下:

Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)
Feign与Hystrix整合(将服务熔断、服务降级彻底解耦)

以上就是本篇博客的全部内容,将服务熔断、服务降级进行解耦,即将服务熔断、服务降级放到服务消费端进行处理

继续阅读