Feign : Declarative REST clients。
Feign 是Netfilx开源的一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign
Feign官方地址:https://github.com/OpenFeign/feign
spring cloud netfilx地址:https://github.com/spring-cloud/spring-cloud-netflix
单独使用Feign,参考官方实例如下:
interface GitHub { @RequestLine("GET /repos/{owner}/{repo}/contributors") Listcontributors(@Param("owner") String owner, @Param("repo") String repo); } static class Contributor { String login; int contributions; } public static void main(String... args) { GitHub github = Feign.builder() .decoder(new GsonDecoder()) .target(GitHub.class, "https://api.github.com"); // Fetch and print a list of the contributors to this library. Listcontributors = github.contributors("OpenFeign", "feign"); for (Contributor contributor : contributors) { System.out.println(contributor.login + " (" + contributor.contributions + ")"); } }
在spring boot 环境下使用如下
1.引入依赖
<!--Feign client支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.2.2.RELEASE</version> </dependency>2.启动类开启注解@EnableFeignClients(clients = {RemoteService.class})
这个地方有多种配置方式,可以指定basePackages,也可以指定具体的客户端映射接口
3.使用@FeignClient注解接口方法映射远程url,这里分情况,
1.如果是微服务系统,调用我们spring cloud Eureka 注册的service,可以指定如serviceId,name,等定位到注册服务的属性
参考地址(dd大神):http://blog.didispace.com/spring-cloud-starter-dalston-2-3/
2.调用远程第三方restful接口,指定第三方的url,楼主这里调用的是第三方,实例如下
/** * Created by kl on 2017/9/18. * Content :spring cloud Feign */ @FeignClient(url = "${postLoan.SystemBaseUrl}",value = "postLoanService") public interface RemoteService { @RequestMapping(value = "/sales/manager/task/statistics?salesId={salesId}",method = RequestMethod.GET) String getPostLoanStatistics(@PathVariable("salesId") String salesId); @RequestMapping(value = "/sales/manager/tasks/list",method = RequestMethod.POST) String getPostLoanList(@RequestBody JSONObject obj); }使用时直接注入,如下
/** * Created by kl on 2017/9/18. * Content :Feign测试 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ApplicationProducer.class) public class FeignClientTest { @Autowired RemoteService remoteService; @Test public void feignRequestGetTest(){ System.err.println(remoteService.getPostLoanStatistics("chenkailing")); } @Test public void feignRequestPostTest(){ JSONObject object=new JSONObject(); object.put("page",1); object.put("rows",10); object.put("managerId","chenkailing"); System.err.println(remoteService.getPostLoanList(object)); }
4.关于spring cloud fegin中的hystrix
hystrix提供请求超时,线程隔离,调用失败补偿,快速失败亦服务熔断等功能。
@FeginClient在注解接口的时候提供了两个参数,fallback,fallbackFactory来指定调用失败的补偿策略
fallback,和fallbackFactory的用法大同小异,只是fallbackFactory可以根据异常的不同来定制我们的补偿逻辑
fallback的方式定义很简单,直接实现我们的fegin客户端接口,下面示例一个fallbackFactory的列
@Component public class PostLoanOldServiceFallBack implements FallbackFactory<PostLoanOldService> { @Override public PostLoanOldService create(Throwable throwable) { return new PostLoanOldService(){ @Override public String getPostLoanList(@RequestBody JSONObject obj) { //TODO 调用失败后的补偿处理 return null; } @Override public String getPostLoanStatistics(@PathVariable("salesId") String salesId) { return null; } }; } }
网上有些人反馈fegin中fallback配置无效,原因如下
在老的spring cloud fegin中hystrix默认是开启的,不知从哪个版本开始hystrix默认是关闭的,不过不要紧,我们可以通过如下配置,显示开启or关闭hystrix服务 feign.hystrix.enabled=true
1.注意的点,开启hystrix后,默认超时设置的是1秒,请求线程核心数为10
修改参数可参考如下:
feign.hystrix.enabled=false #请求超时单位秒 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000 #线程核心数 默认 10 hystrix.threadpool.default.coreSize=30 #最大排队长度 默认-1 hystrix.threadpool.default.maxQueueSize=30 #排队线程数量阈值,默认5,达到时直接拒绝,hystrix.threadpool.default.maxQueueSize为-1时该项无效 hystrix.threadpool.default.queueSizeRejectionThreshold=5