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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT进修之路

原 荐 Spring Boot 多库分布式事

2397
来自专栏CodingBlock

Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身

本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android...

2876
来自专栏battcn

一起来学Spring Cloud(F版) | 第三篇:注解式HTTP请求Feign

注解式的 Feign 使得 Java HTTP 客户端编写更方便。Feign 灵感来源于安卓网络编程框架 Retrofit、JAXRS-2.0 和 WebSoc...

1502
来自专栏FreeBuf

技术分享:MSSQL注入xp_cmdshell

存储过程为数据库提供了强大的功能,其类似UDF,在MSSQL中xp_cmdshell可谓臭名昭著了。MSSQL强大的存储过程也为黑客提供了遍历,在相应的权限下,...

3995
来自专栏李蔚蓬的专栏

基于VM14+ Ubuntu 16.04安装VMware Tools(VM同主机file交互的工具)以及使用的骚操作

在安装VMware Tools时,需要修改指向VMware Tools所在(VMware Workstation\linux.iso),在这个路径下有个l...

1465
来自专栏CodingBlock

Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身

本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html

1173
来自专栏个人分享

RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的...

1992
来自专栏A周立SpringCloud

Spring Cloud各组件重试总结

最近挺多童鞋问我如何配置Spring Cloud xxx组件的重试。本篇进行一个总结。 Spring Cloud中的重试机制应该说是比较混乱的,不同的版本有一定...

4256
来自专栏Java成神之路

Spring_总结_04_高级配置(三)之处理歧义

本文承接上一节:Spring_总结_04_高级配置(二)之条件注解@Conditional

894
来自专栏清晨我上码

第五节 微服务OTRS 补充客户端负载均衡

spring could在客户端负载均衡有两种选择一种是ribbon+restTemplate,另一种是feign。本主要讲解下基于ribbon+rest。当然...

1071

扫码关注云+社区

领取腾讯云代金券