六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求

摘要:
Feign是GitHub上的一个开源项目,旨在简化REST/Web服务客户端的开发。使用Feign,我们可以通过注释修改接口和参数,从而简单而优雅地访问REST/WebService服务。Feign不仅支持自己的注释,还支持使用第三方注释。它还支持插入式编码器和解码器。我们可以通过这些功能自定义编码和解码规则。SpringCloud将Feign集成到Netflix项目中。当它与Eureka和Ribbon一起使用时,Feign具有负载平衡功能。在SpringCloud中调用微服务非常方便。因为操作非常简单,所以可以大大减少开发工作量。
1. 什么是Feign?

Feign是GitHub上的一个开源项目,目的是简化REST/WebService客户端开发。使用Feign,我们可以通过注解来修饰接口和参数,从而达到简单优雅地访问REST/WebService服务的目的。Feign不光支持自带的注解,还支持使用第三方注解,并且还支持插件式的编码器和解码器,我们可以通过这些特性,自定义编码解码规则。

Spring Cloud将Feign集成到Netflix项目中,当与Eureka、Ribbon一起使用时,Feign就具有了负载均衡的功能,它很方便在Spring Cloud中进行微服务之间的调用,因为操作非常简单,可以大大降低开发工作量。

2. 在Spring Cloud中使用Feign

(NOTE: 需要源码的盆友可以去这个里面找哦, 找到feign-CSDN目录)

https://github.com/aharddreamer/chendong/tree/master/springcloud/

本次演示的项目结构还是老三样:

eureka-server 集群服务器,供provider和invoker注册和调用

first-service-provider 服务提供端

first-service-invoker 服务调用端

另外使用方式也和其他Spring Cloud项目很类似,添加依赖->添加配置->编写代码->测试。

 

first-service-provider的改动:

application.properties (注册eureka)

spring.application.name=first-service-provider

server.port=8080

eureka.instance.hostname=localhost

eureka.client.service-url.default-zone=http://localhost:8761/eureka/

 

添加message接口,给Invoker模块做测试用:

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第1张

 

first-service-invoker的改动:

1)添加依赖:

在POM.xml中加入以下依赖:

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

2)添加配置:

application.properties (注册eureka):

server.port=9000

spring.application.name=first-service-invoker

eureka.instance.hostname=localhost

eureka.client.service-url.default-zone=http://localhost:8761/eureka/

 

在启动类中添加Feign的启用开关

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第2张

新建一个MyFeignClient, 测试通过Feign来实现微服务之间的调用:

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第3张

@FeignClient里面的参数表示这个是要调用哪个微服务,下面的message方法的参数表示请求微服务first-service-provider的/message接口的messageID参数,上面的@RequestMapping大家应该非常熟悉了,就是Controller中定义接口的注解,在这里也一样好用。 是不是非常简洁?我们一会还要去provider里面建一个message接口供它调用测试。

新建一个InvokerController,我们在first-service-invoker里面写一个测试接口,一会我们通过浏览器访问这个接口,然后这个接口通过MyFeignClient去调用first-service-provider里面的message接口,从而实现微服务之间的调用。

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第4张

 

好了,依次启动eureka-server,first-service-provider, first-service-invoker。

如果运行起来有错误,说Jackson的方法或类未找到,就在pom里面加入这个依赖:

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-core</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-databind</artifactId>

   <version>2.9.8</version>

</dependency>

 

启动成功后,在浏览器输入 http://localhost:9000/test

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第5张

可以看到返回的messageID 999,这是刚才在test接口里面设置的测试参数。微服务之间的调用已经打通了,是不是so easy,你可以根据具体场景,加入更加复杂的请求和响应,比如在请求端使用@PathVariabe, @RequestHeader等,ContentType可以选择application/json等。在响应端可以定义复杂类型作为返回类型,同样的在请求端这里也要用同样的类型来接收,因为Feign会通过json转换工具(比如Jackson)来进行编码和解码,最终会将响应端返回的对象来填充请求端指定的对象。

有一个坑需要非常注意,响应端和请求端的接口名/参数名/返回类型最好完全一致,避免出错。返回类型里面要保证有无参的构造函数,有完整的get set方法,并且最好不要重写get set方法,否则可能会出现序列化错误的问题。

 

3. 自定义配置

如果需要使用自定义的Feign实现,可以配置一个Bean,这个Bean是注解翻译器,类型是Contract:

MyContractConfig.java

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第6张

MyContract.java 注意看注释部分,这个是集成了SpringMvc的Contract,所以可以具有Spring的RequestMapping的功能,我们在控制台打印一下我们自定义的注解参数信息。

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第7张

这是自定义的注解类:

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第8张

 

配置好了之后,在MyFeignClient里面去加一个方法,测试一下能不能通过自定义的注解去请求provider微服务里面的接口:

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第9张

 

当然,first-service-provider微服务里面肯定要有对应的接口给它调用,所以加一个testMyFeign:

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第10张

好了,在first-service-invoker的InvokerController里面再加一个测试接口, 这个是使用了我们自定义注解的FeignClient

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第11张

OK,还是依次启动eureka-server, first-service-provider, first-service-invoker项目,然后在浏览器访问:

http://localhost:9000/testMyFeign

六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求第12张

可以发现,自定义的注解已经起作用了。

 

 

 

免责声明:文章转载自《六、Spring Cloud 之旅 -- Feign 更优雅的REST客户端介绍 使用 及 自定义注解器和处理请求》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#微信公众平台开发者模式开启代码Swagger的应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot整合WebService

WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。具体的说,Web Service可以让你的网站使用其他...

VLAN实验(2)Trunk接口

1.选择1台S5700、2台S3700和4台pc机,并根据实验编址完成此拓扑图。       2.启动设备,检查设备的连通性: 由于现在我们还没有划分VLAN,这5台PC,还在同一个VLAN中,现在我们启动所有的设备,这是所有的主机应该是可以ping通的   mengyu-PC1可以与其他3台PCping通        3.对交换机mengyu-S1...

初次体验Ubuntu之二

1.需要知道几个快捷键: 锁屏快捷键:Win+L 终端模拟器:Ctrl+Alt+T 打开应用列表:Win+A 显示所有已打开的窗口:Win+W 打开命令运行窗口:Alt+F2 进入tty字符界面:Ctrl+Alt+F1到F6,Ctrl+Alt+F7:切换回图形桌面 2.查询显卡型号 lspci | grep -i vga lspci | grep -...

IOS 验证码

将十六进制的字符串转化为UIImage     最近写一个项目,有验证码,但是接口返回的并不是验证码图片的URL,而是返回的字节数组16进制字符串。这样就需要把16进制字符串首先字节数组,其次再把字节数组转化为NSData,最后再把NSData转化为UIImage。其中最重要的是如何把16进制的字符串转换为字节数组。首先要把字节数组和16进制关联起来。1...

解决微信公众平台接口配置信息配置失败问题

填写好URL及TOKEN后,点“提交”时,总是提示“配置失败”或其他错误 确认URL指向的后台页面代码没有问题 确认TOKEN配置没有问题 这时请察看一下你的INDEX页面的编码格式,改成GB2312试试吧,也许会令你的问题迎刃而解。 谨以此文献给浮躁的自己。...

JAVA-SPI机制-实现功能的热插拔

一、序:   开发中经常遇到的一个需求是,处理不同种类的数据,但是完成的功能是相似的,功能随着传入类型的不同而变化 二、方案:   1、定义接口:定义一个接口,编写不同的实现类     (1)使用场景:完成功能相同,参数也类似,只是内部的实现逻辑不同,可以编写接口实现的配置类,使用时动态获取实现类     (2)缺点:数据的类型必须确定     (3)举...