kl个人博客 首页>>Spring>>Feign-声明式java Http客户端

Feign-声明式java Http客户端

什么是Feign?

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

kl个人博客