本文章基于spring-boot-starter-parent 2.0.6RELEASE,spring-cloud-dependencies Finchley.SR2。
Feign是什么
在之前使用Ribbon时,利用RestTemplate对HTTP请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多出调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。Spring Cloud Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。
Spring Cloud Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon与Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式配置它,即可完成对服务提供方的接口绑定。Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解,同时也增加了对Spring MVC的注解支持。
Feign使用
我们借助前面使用的User工程,在此基础上集成Feign。另外为了演示功能还需要之前的Order、Eureka等工程。以下内容只针对User工程。
第一步:pom文件中引入feign依赖
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
...
第二步:启动类上增加Feign支持
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableFeignClients
public class AppUserApplication {
public static void main(String[] args) {
SpringApplication.run(AppUserApplication.class);
}
}
第三步:User工程中定义一个FeignOrderService接口,通过@FeignClient
注解指定服务名来绑定服务。
@FeignClient(name="order-micro")
public interface FeignOrderService {
@RequestMapping("/getOrder.do")
public Object getOrder();
}
第四步:UserController中新增一个getFeignOrder()方法来实现对Feign客户端的调用
@RestController
public class UserController {
private static final String ORDER_URL = "http://ORDER-MICRO";
@Autowired
private RestTemplate restTemplate;
@Autowired
private FeignOrderService feignOrderService;
// 使用restTemplate
@RequestMapping("/getOrder.do")
@HystrixCommand(fallbackMethod = "getOrderFullBack")
public R getOrder() {
Object object = ;
return R.success("操作成功", restTemplate.getForObject(ORDER_URL + "/getOrder.do", Object.class));
}
// 使用Feign
@RequestMapping("/getFeignOrder.do")
public R getFeignOrder() {
return R.success("操作成功", feignOrderService.getOrder());
}
// 降级方法
public R getOrderFullBack() {
return R.error("系统正在维护中,请稍后重试");
}
}
启动Eureka、Order(启动2个实例)、User等工程,访问http://localhost:5000/getOrder.do
和 http://localhost:5000/getFeignOrder.do
均可以得到之前Ribbon 中的结果,说明Feign生效了。可以看出Feign实现的消费者,同样利用了Ribbon中的轮询实现了客户端负载均衡,并且相比之前使用RestTemplate的例子更加优雅而简单的实现了服务调用。
Ribbon配置
Fegin集成了Ribbon,利用Ribbon维护了服务列表信息,并且融合了Ribbon的负载均衡配置。我们可以通过配置Ribbon客户端的方式来自定义各个服务客户端调用的参数。
全局配置
直接使用ribbon.<key>=<value>
的方式来设定ribbon的各项默认参数。比如,修改默认的客户端调用超时时间:
ribbon.ConnectTimeout=500
ribbon.ReadTimeout=2000
指定服务配置
针对各个服务客户端进行个性化设置的方式与使用Spring Cloud Ribbon时配置方式一样,采用<client>.ribbon.key=value
的格式进行设置。这里就有一个疑问了,所指代的Ribbon客户端在哪里呢?
在定义Feign客户端时,我们使用@FeignClient
注解,Spring Cloud Feign会在初始化时根据该注解的name属性或value属性指定的服务名,自动创建一个同名的Ribbon客户端。所以,我们就可以使用@FeignClient
注解中的name或value属性值来设置对应的Ribbon参数,比如:
ORDER-MICRO.ribbon.ConnectTimeout=500
ORDER-MICRO.ribbon.ReadTimeout=2000
Hystrix配置
默认情况下,Spring Cloud Feign会将所有Feign客户端的方法都封装到Hystrix命令中进行服务保护。
全局配置
对于Hystrix的全局配置同Spring Cloud Ribbon的全局配置一样,直接使用它的默认前缀hystrix.command.default
就可以设置,比如设置全局的超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
在对Hystrix进行配置之前,我们需要确认feign.hystrix.enable
参数没有被设置为false,否则该参数设置为关闭Feign客户端的Hystrix支持。
服务降级配置
Hystrix提供的服务降级是服务容错的重要功能,由于Spring Cloud Feign在定义服务客户端的时候,HystrixCommand定义被封装了起来,我们无法像之前那样使用@HysrtixCommand
注解来指定具体的服务降级处理方法。
通过改造上面的User工程,我们来看下Spring Cloud Feign中是怎么定义服务降级方法的?
第一步:为Feign客户端的定义接口编译实现类
@Component
public class FeignOrderServiceFallBack implements FeignOrderService {
@Override
public Object getOrder() {
return "getOrder服务暂时不可用";
}
}
第二步:在服务绑定接口FeignOrderService中,通过@FeignClient
注解的fallback属性来指定对应的服务降级实现类。
@FeignClient(name="order-micro", fallback = FeignOrderServiceFallBack.class)
public interface FeignOrderService {
@RequestMapping("/getOrder.do")
public Object getOrder();
}
第三步:applicaiton.yml增加开启Hystrix功能
feign:
hystrix:
enabled: true
启动User和Eureka工程,访问http://localhost:5000/getFeignOrder.do
,可以看到服务降级方法被调用了(因为Order服务不可用)。
前面的提示信息是因为封装返回结果导致的,关注红框内的内容即可。
参考资料:
1、Spring Cloud 官网–Hystrix
2、Spring Cloud微服务实战 翟永超著