当前位置:首页 > 技术分析 > 正文内容

springcloud实战:服务间通信——OpenFeign

ruisui883个月前 (02-03)技术分析18

Spring Cloud OpenFeign

Spring Cloud OpenFeign是一个声明式的 HTTP客户端,它简化了HTTP客户端的开发,使编写Web服务的客户端变得更容易。使用Spring Cloud OpenFeign,只需要创建一个接口并注解,就能很容易地调用各服务提供的HTTP接口。Spring Cloud OpenFeign基于OpenFeign实现,它除了提供声明式的 HTTP客户端外,还整合了Spring Cloud Hystrix,能够轻松实现熔断器模型。

Spring Cloud对OpenFeign进行了增强,使得Spring Cloud OpenFeign支持Spring MVC注解。同时,Spring Cloud整合了Ribbon和 Eureka,这让 Spring Cloud OpenFeign的使用更加方便。

Spring Cloud OpenFeign能够帮助我们定义和实现依赖服务接口。在Spring Cloud OpenFeign的帮助下,只需要创建一个接口并用注解方式配置它,就可以完成服务提供方的接口绑定,减少在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

下面介绍如何在应用中集成Spring Cloud OpenFeign。

(1)在common工程中添加如下依赖:


org.springframework.cloud
spring-cloud-starter-openfeign

(2)在public工程的启动类PublicApplication.java中加入@EnableFeignclients注解,启用OpenFeign功能:

@MapperScan(basePackages = "com. lynn.blog.pub.mapper")
@EnableFeignclients(basePackages = "com. lynn.blog")
public class PublicApplication extends Application{
}

由于每个工程的基础包名都不一致,如user 工程包名为com.lynn.blog.user,public工程包名为com.lynn.blog.pub,这里需要指定basePackages为 com. lynn.blog,以保证Spring容器可以扫描到OpenFeign注入的类(如果不指定basePackages,则默认扫描加入该注解的类所在包及其子包)。

(3)创建TestserviceFeign接口,并编写以下代码:

@FeignClient(value = "test")
public interface TestServiceFeign {
@RequestMapping("/test")
String test();
}

其中,@Feignclient("test")表示该接口是一个OpenFeign的HTTP客户端,注解内指定服务名,本示例指定test,即 test工程下spring.application.name配置的值。接口定义只需和 test工程的控制器提供的接口一致(参数名、返回值和接口地址)即可,需要注意的是,@RequestMapping指定的地址为接口地址全路径。

(4)创建控制器验证 OpenFeign的正确性。

@RequestMapping("feign")
@RestController
public class TestControllerFeign {
@Autowired
TestServiceFeign testServiceFeign;@RequestMapping( "test")
private String test(){
return testServiceFeign.test();
}
}

(5)重启 comment工程,浏览器多次访问地址
http://localhost:8203/feign/test,可以看到分别打印了9999和9998端口。

通过上述示例,我们发现 OpenFeign 使代码变得更加优雅,无须使用 RestTemplate 显式地调用HTTP服务,只需要指定想要调用的服务名即可。由于OpenFeign 内部集成了Ribbon,所以它也默认拥有了负载均衡能力。

自定义OpenFeign 配置

OpenFeign提供了默认的配置类FeignclientsConfiguration,该类使用了默认的编码器( encoder )、解码器( decoder )、合约( contract)等。因为OpenFeign 的核心是HTTP客户端,HTTP传输是通过数据包(流)进行的,所以在发送请求、接受响应的过程中,有必要对数据进行编码和解码。而OpenFeign默认使用的合约是SpringMvcContrace,它表示OpenFeign可以使用Spring MVC的注解,即上一节代码编写的@RequestMapping。

Spring Cloud OpenFeign 允许通过@Feignclient注解的configuration属性编写自定义配置,自定义配置会覆盖默认的配置。

接下来,我们以覆盖合约为例,讲解自定义配置的编写。

创建一个 OpenFeign的配置类MyFeignconfiguration,其代码如下:

@SpringBootConfiguration
public class MyFeignConfiguration {
@Bean
public Contract feigncontract()i
return new feign.contract.Default();
}
}

上述代码定义了一个Bean方法,返回Contract,即 OpenFeign合约,该合约返回的是OpenFeign的默认合约,这样我们就可以使用OpenFeign的注解而不用Spring MVC注解。

修改TestServiceFeign接口,将@RequestMapping 注解替换成@RequestLine 注解,并通过configuration属性指定自定义配置,如:

@Feignclient(value = "test",fallback = TestserviceErrorFeign.class,configuration =
MyFeignConfiguration.class)
public interface TestServiceFeign {
@RequestLine("GET /test")
String test();
}

需要注意的是,@RequestLine的属性值需要指明请求方法,比如上述代码指定请求方法为GET,如果不指定启动工程将报错。在@Feignclient注解的configuration属性中指定MyFeignConfiguration类,这样OpenFeign就会覆盖其默认配置而使用我们自定义的配置。

本文给大家讲解的内容是springcloud实战:服务间通信,SpringCloudOpenFeign

  1. 下篇文章给大家讲解的是springcloud实战:服务间通信,OpenFeign熔断;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1169.html

标签: feign 使用
分享给朋友:

“springcloud实战:服务间通信——OpenFeign” 的相关文章

Gitlab+Jenkins通过钩子实现自动部署web项目,图文详细教程

扩展参考:Jenkins+Gitlab通过脚本自动部署回滚web项目至集群 一:基础环境介绍及准备1):Gitlab服务器:ubuntu 192.168.152.131 ---参考搭建:Linux安装gitlab,docker安装gitlab教程2):Jenkins服务器:ubunu 192.168...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

el-table内容\n换行解决办法

问题请求到的数据带有换行符 '\n'但页面展示时不换行statusRemark: "\"1、按期完成计划且准确率100%,得100分;\n2、各项目每延误1天,扣1分;每失误1次或者员工投诉1次,扣3分,失误层面达到公司级影响较大的,该项绩效分数为0\"\n&...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

vue打开新窗口并且实现传参,有图有真相

我要实现的功能是打开一个新窗口用来展示新页面,而且需要传参数,并且参数不能显示在地址栏里面,而且当我刷新页面的时候,传过来的参数不能丢失,要一直存在,除非我手动关闭这个新窗口,即浏览器的标签页。通过面向百度编程,发现网上的根本达不到这个效果,而且还都是坑,明明实现不了,还若有其事的写出来,于是我在标...