Spring Cloud 之 Open Feign

本篇主要介绍微服务远程调用的的另一种方式OpenFeign。

目录

一、Open Feign的使用

 二、OpenFeign的最佳实践

Feign继承

Feign抽取


一、Open Feign的使用

前面我们介绍过使用RestTemplate来远程调用的方式,但这种方式依然会显得有些麻烦,它需要自己去手动拼接url。因此通常情况下,并不会去使用RestTemplate来进行远程调用,而是使用另一种更简单的方式——OpenFeign。

OpenFeign 是Netflix Feign 的升级版,只需要引入OpenFeign的依赖,然后添加相关的注解和自定义一个接口,就能像调用本地方法一样来调用其它服务器上的服务。下面我们来具体看一下。

使用OpenFeign,我们需要引入它的相关依赖,具体依赖如下:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

引入依赖之后,我们需要在启动类上添加@EnableFeignCilent注解来开启Open Feign 

做完这些后我们需要创建一个接口来作为OpenFeign的客户端,例如我们创建一个productApi来远程调用一个product-service服务。 

 

在接口上需要加上一个@FeignCilent来进行标识。

在该注解里有两个属性需要我们来设置,其中value为要远程调用的服务名称,path为在远程调用时URL的统一公共前缀,如果没用可以不设置。

在接口里,我们需要去声明要调用的目标服务的接口方法,例如,我们这里需要去调用product-service服务,我们来看一下它里面的接口

可以发现product-service里定义了getProductById接口方法,因此,在我们定义的接口里就需要声明这个方法,并按照接口的路由路径来配置声明的方法的路径,具体如下:

 声明好之后,我们就可以在当前项目中通过调用我们定义的接口中声明的方法,来实现远程调用product-service服务中对应的方法了。在使用时,我们需要将我们自己定义的客户端接口进行注入,然后在使用,下面我们来看一下具体使用的代码:

在这个方法中会先去获得order信息,然后根据order中的productId结合OpenFeign远程调用product-service中的接口方法,并获取其返回结果。下面我们来测试一下,我们来调用一下上述代码中的方法,控制台打印的结果如下:

可以发现,成功获取到product-service对应接口返回的数据了,OpenFeign远程调用成功了。

前面我们调用的远程调用的方法的参数是int类型的,这个参数的类型也可以是其它类型,例如对象,Json这些也是可以的,只要在我们自己定义的客户端接口里声明对应的方法即可,需要注意的是,相关的注解都是不能省略的,当方法中的参数是一个对象时,我们需要在接口中声明的方法里的对象类型的参数上加上@SpringQueryMap注解,例如,product-service中有如下接口方法:

对应在接口中的声明如下:

  

 二、OpenFeign的最佳实践

在微服务中,一个服务通常会与很多服务都有通信,这也就意味着使用OpenFeign每个服务都得定义一个接口,这样会使得开发的工作量大大增加,不仅需要开发当前服务,还需要去了解其它服务的接口信息。因此,对于OpenFeign有两种更为合适的实践方案。

Feign继承

通过前面对OpenFeign的使用可以发现,Feign接口和服务提供者的controller的代码非常相似,可以说,服务controller提供者就是Feign接口的实现类,因此,我们可以把Feign的接口类放在一个独立的项目里,然后将这个独立的项目打包并注册到Maven仓库里(推荐注册到自己的私服仓库里,但这里由于是个人学习所用,所以先注册到本地仓库里),然后我们就可以在该feign接口相关的服务提供者和服务消费者的项目里引入这个包并使用。具体不足参考下面的内容:

(1).在服务父工程中创建一个模块.

  (2).引入OpenFeign依赖,创建好需要使用到的实体类,然后创建一个接口,里面声明需要远程调用的方法,这里不加@FeignCilen注解

  (3).将模块打包,并注册到本地仓库里,点击Maven中的install即可

然后我们在服务提供者的项目中引入这个包,引入的xml代码可以参考下面的内容

<dependency>
 <groupId>org.example</groupId>
 <artifactId>product-api</artifactId>  <!--注册的包名-->
 <version>1.0-SNAPSHOT</version>
</dependency>

引好包后,我们可以让我们对应的Controller类实现包中的接口,这样接口和Controller中的内容就完全对应了.

然后我们在服务消费者的项目中也引入这个包,在创建对应的OpenFeign客户端接口时我们直接继承包中的接口就行,不需要在自己在去包中声明。

Feign抽取

这种方式和Feign这种方式类似,同样是新建模块,不过这种方式需要在新建的接口上加上@FeignClient注解,并设置好相关属性,然后将模块打成包,这个包只需要在服务消费者的项目里引入,而不再需要在服务提供者中也引入。

服务消费者中引入包后,可以直接用包中的接口声明的方法进行远程调用,但由于包中的接口不在默认的扫描路径下,因此我们需要自己手动去将这个接口注册到spring容器中,我们可以直接通过@EnableFeignCilent的basePackages和clients两个参数来进行注册,其中basePackages为指定去哪个包下扫描这个接口,cilents则是直接指定接口的类型。注册好接口后,我们就可以使用包中的接口来实现远程调用了,而不再需要自己手动来定义了。这个包在开发中通常是由对应服务的开发者来提供的,因此我们完全可以不去了解其它服务的实现细节,直接拿过来用即可。

这两种实践方案中,官方推荐使用第一张Feign继承的方式,但在开发中,更倾向于使用第二种Feign抽取的方式,但这两种方案其实很相似,只是理念不同,通常两种方案都可以,但第二种方案可能更简便一点。

 

 

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值