资讯专栏INFORMATION COLUMN

Spring Cloud中如何优雅的使用Feign调用接口

ChanceWong / 3205人阅读

摘要:对进行了封装,使其支持标准注解和。可以与和组合使用以支持负载均衡。中使用当我们搭建好注册中心之后,就是需要将自己的服务注册到中,然后别的服务可以直接调用。

JAVA 项目中接口调用怎么做 ?

Httpclient

Okhttp

Httpurlconnection

RestTemplate

上面是最常见的几种用法,我们今天要介绍的用法比上面的更简单,方便,它就是 Feign

Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。

Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。

SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。

Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

SpringCloud中使用Feign

当我们搭建好注册中心Eureka之后,就是需要将自己的服务注册到Eureka中,然后别的服务可以直接调用。

首先呢是服务提供方需要注册到Eureka中,这边我们新建一个房产服务fangjia-fsh-house-service

fangjia-fsh-house-service中提供跟房子相关的接口,比如最简单的获取房子的基本信息

/**
 * 获取房产信息
 * @param houseId 房产编号
 * @return 
 */
 @GetMapping("/{houseId}")
 public ResponseData hosueInfo(@PathVariable("houseId")Long houseId) {
     return ResponseData.ok(houseService.getHouseInfo(houseId));
 }

另外我们起一个项目来消费房产服务的这个接口,房产置换服务fangjia-fsh-substitution-service

/**
 * 获取置换信息
 * @param sid
 * @return
 */
 @GetMapping("/{sid}")
 public ResponseData substitutionInfo(@PathVariable("sid") Long sid) {
     return ResponseData.ok(substitutionService.getSubstitutionInfo(sid));
 }

在substitutionService中需要消费房产服务的获取房产信息接口,一般的做法我们都会通过Httpclient或者最底层的Httpurlconnection来直接调用接口,当然这些都需要自己集成或者封装,在spring里面已经有了一个很好的封装,那就是RestTemplate来调用接口。

关于RestTemplate的使用可以查看我的这篇文章:http://cxytiandi.com/blog/detail/6157

可以直接注入对象,然后调用接口,这种方式唯一的弊端就是你需要知道服务提供者的地址,根据指定的地址来进行调用

@Autowired
private RestTemplate restTemplate;

@Override
public SubstitutionDto getSubstitutionInfo(Long sid) {
    House house = this.restTemplate.getForObject("http://localhost:8000/hosue/" + id, House.class);
  // .......
}

另一种就是我们今天的主角,简单的调用方式就是使用一个声明式的REST客户端Feign来进行接口调用

用了Feign之后调用接口只需要定义相同的接口即可实现调用

使用Feign肯定要引入jar的依赖


    org.springframework.cloud
    spring-cloud-starter-feign

在启动类上加@EnableFeignClients注解,如果你的Feign接口定义跟你的启动类不在一个包名下,还需要制定扫描的包名@EnableFeignClients(basePackages = "com.fangjia.api.client")

这边建议大家将接口的消费定义,多带带抽一个项目出来,后面打成公共的jar,这样无论是哪个项目需要调用接口,引入公共的接口SDK jar即可,不用重新定义一遍了。

**
 * 房生活房产服务API调用客户端
 *
 * @author yinjihuan
 * @create 2017-10-27 13:55
 **/
@FeignClient(value = "fangjia-fsh-house-service", path = "/house", configuration = FeignConfiguration.class, fallback = HouseRemoteClientHystrix.class)
public interface HouseRemoteClient {
    
    /**
     * 获取企业下某用户的有效房产信息
     * @param eid    企业编号
     * @param uid    用户编号
     * @return
     */
    @GetMapping("/list/{eid}/{uid}")
    public HouseListDto hosueList(@PathVariable("eid")Long eid, @PathVariable("uid")String uid);    
    
    /**
     * 获取房产详细信息
     * @param houseId 房产编号
     * @return
     */
    @GetMapping("/{houseId}")
    public HouseInfoDto hosueInfo(@PathVariable("houseId")Long houseId);
    
}

@FeignClient里的value表示你要消费哪个服务的接口,path就是统一的前缀,也就是我们HouseController中类上面的@RequestMapping("/house")的地址

@FeignClient里的configuration可以让你自定义配置信息来覆盖Feign的默认配置,
比如配置日志输出

日志的输出还需要在配置文件中指定才能生效logging.level.com.fangjia.api.client.fsh.house.HouseRemoteClient=DEBUG

@Configuration
public class FeignConfiguration {
    @Bean  
    Logger.Level feignLoggerLevel() {  
        return Logger.Level.FULL;  
    }  
}

@FeignClient里的fallback可以让你的接口在熔断处理时,返回默认的值给调用方,这个一般有2种方式:

实现Feign的接口,实现所有的默认方法

/**
 * 房产服务调用熔断默认返回处理
 *
 * @author yinjihuan
 * @create 2017-10-29 14:30
 **/
@Component
public class HouseRemoteClientHystrix implements HouseRemoteClient {

    @Override
    public HouseListDto hosueList(Long eid, String uid) {
        return new HouseListDto();
    }

    @Override
    public HouseInfoDto hosueInfo(Long houseId) {
        return new HouseInfoDto();
    }
}

另一种就是@FeignClient里的fallbackFactory,效果是一样的

使用的话更简单了,和普通的Service的类一样使用,注入进来,然后直接调用方法就相当于调用远程接口了

@Autowired
private HouseRemoteClient houseRemoteClient;

HouseInfoDto houseInfoDto = houseRemoteClient.hosueInfo(1L);
普通Java项目中如何使用Feign

通过上面的讲解,在SpringCloud中使用Feign显得那么的自然,因为集成这件事SpringCloud已经帮我们做好了,这是广大开发人员的福音。

那如果你们没有使用SpringCloud来进行开发,我能用Feign来调用接口马,答案是:当然

首先你需要看一遍文档,如果还不会用你来找我:https://github.com/OpenFeign/feign

我们看官方的提个Demo:

定义了一个GitHub的接口调用类,上面配置了请求方式以及参数,是通过Feign自带的注解方式配置的

然后通过Feign.builder()构建一个客户端,同时可以设置编码,解码需要用到的类,以及访问的目标地址等等信息,当然也包括日志的设置,输出等等。。

interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List contributors(@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.
  List contributors = github.contributors("OpenFeign", "feign");
  for (Contributor contributor : contributors) {
    System.out.println(contributor.login + " (" + contributor.contributions + ")");
  }
}

具体代码可以参考我的github:

https://github.com/yinjihuan/spring-cloud

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70871.html

相关文章

  • springcloud框架简单搭建(消费服务基于feign

    摘要:不过,我们搭建好框架就是为了消费它使用它,那么这篇文章就来看看如何去消费使用我们之前搭建起来的服务吧首先本文是基于上一篇文章进行的。代码如下启动程序,多次访问,浏览器显示内容为至此我们这个服务消费的框架就搭建完毕了。。。 上一篇文章主要介绍了如何搭建一个简单的springcloud框架。不过,我们搭建好框架就是为了消费它使用它,那么这篇文章就来看看如何去消费使用我们之前搭建起来的服务吧...

    xiguadada 评论0 收藏0
  • 拜托!面试请不要再问我Spring Cloud底层原理!

    摘要:不过大多数讲解还停留在对功能使用的层面,其底层的很多原理,很多人可能并不知晓。每个线程池里的线程就仅仅用于请求那个服务。 欢迎关注微信公众号:石杉的架构笔记(id:shishan100) 每日更新!精品技术文章准时送上! 目录 一、业务场景介绍 二、Spring Cloud核心组件:Eureka 三、Spring Cloud核心组件:Feign 四、Spring Cloud核心组件:R...

    wums 评论0 收藏0
  • 拜托!面试请不要再问我Spring Cloud底层原理!

    摘要:不过大多数讲解还停留在对功能使用的层面,其底层的很多原理,很多人可能并不知晓。每个线程池里的线程就仅仅用于请求那个服务。 欢迎关注微信公众号:石杉的架构笔记(id:shishan100) 每日更新!精品技术文章准时送上! 目录 一、业务场景介绍 二、Spring Cloud核心组件:Eureka 三、Spring Cloud核心组件:Feign 四、Spring Cloud核心组件:R...

    wangjuntytl 评论0 收藏0
  • spring-cloud-feign源码深度解析

    摘要:内部使用了的动态代理为目标接口生成了一个动态代理类,这里会生成一个动态代理原理统一的方法拦截器,同时为接口的每个方法生成一个拦截器,并解析方法上的元数据,生成一个请求模板。的核心源码解析到此结束了,不知道是否对您有无帮助,可留言跟我交流。 Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插拔注释支持,包...

    vibiu 评论0 收藏0

发表评论

0条评论

ChanceWong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<