1. 前言
1.1 为什么要使用OpenFeign?
- 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错.
- 代码可读性差, ⻛格不统⼀。
1.2 介绍一下微服务之间的通信方式
- RestTemplate
- OpenFeign
- Dubbo: Apache Dubbo 中⽂
- Thrift : Apache Thrift - Home
- gRPC: gRPC
1.3OpenFeign介绍
OpenFeign 是⼀个声明式的 Web Service 客户端. 它让微服务之间的调⽤变得更简单, 类似于controller,调⽤service, 只需要创建⼀个接⼝,然后添加注解即可使⽤OpenFeign。OpenFeign是一个基于Java的HTTP客户端,它使得编写和维护RESTful服务之间的通信变得更加简单。通过使用注解和接口定义,开发者可以轻松地创建RESTful服务的客户端,并且无需编写大量的样板代码。
1.4OpenFeign 的前⾝
- 2013年6⽉, Netflix发布 Feign的第⼀个版本 1.0.0
- 2016年7⽉, Netflix发布Feign的最后⼀个版本 8.18.0
- 2016年,Netflix 将 Feign 捐献给社区
- 2016年7⽉ OpenFeign 的⾸个版本 9.0.0 发布,之后⼀直持续发布到现在.
2. OpenFeign的使用步骤
2.1 添加maven依赖
<!--添加openFeign 的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 添加注解
在启动类上添加注解 @EnableFeignClients ,表示开启OpenFeign的功能,Spring Boot 将会扫描指定的包路径下的 Feign 客户端接口,并自动创建代理对象。这些代理对象可以直接调用远程服务的 API,而无需手动编写 HTTP 请求代码。
@EnableEurekaServer 注解会启动一个嵌入式的Eureka Server实例,该实例将会接受其他微服务的注册,并且提供给其他微服务进行服务发现和调用。这样可以方便地构建基于Eureka的服务注册与发现系统。
注意:@Enable开头的注解都表示:启用某种特定的功能或配置。因为它们的主要作用是开启一些特定的功能或配置选项。
2.3 编写OpenFeign的客户端
//声明一个Feign客户端,value属性指定了要调用的服务的名称 //value属性指定的服务名称去服务注册中心寻找对应的服务,无需手动编写HTTP请求代码 @FeignClient(value = "product-service",path = "/product") public interface ProductApi { @RequestMapping("/product/{productId}")//指定跟哪个方法进行绑定 Product getProduct(@PathVariable Integer productId); }
- name/value:指定FeignClient的名称, 也就是微服务的名称,⽤于服务发现, Feign底层会使⽤
Spring Cloud LoadBalance进⾏负载均衡. 也可以使⽤ url 属性指定⼀个具体的url.
- path: 定义当前FeignClient的统⼀前缀.
2.4 修改远程调用的方法
3. OpenFeign的参数传递
这里介绍参数传递就是因为:OpenFeign接收参数使用的注解和SpringMvc不同。
- 传递简单类型参数 -> @RequestParam("参数名")
- 这里的注解是必须书写的,不像mvc会根据名称自动映射,你不写就是null。
@RequestMapping("/p1") String p1(@RequestParam("id") Integer id); @RequestMapping("/p2") String o2(@RequestParam("id") Integer id, @RequestParam("name") String name);
- 这里的注解是必须书写的,不像mvc会根据名称自动映射,你不写就是null。
- 传递JavaBean对象 -> @SpringQueryMap
- 传递Json 数据 -> @RequestBody
4.最佳实践
最佳实践:其实也就是经过历史的迭代, 在项⽬中的实践过程中, 总结出来的最好的使用方式。
最佳实践就是帮助我们继续优化代码,我们也能看出来, Feign的客户端与服务提供者的controller代码非常相似。所以我们可以对其抽取一个类,需要的继承即可。或者我们可以抽取成一个jar包需要的时候导入依赖即可。
4.1 Feign 的继承
4.2 Feign 的抽取
官⽅推荐Feign的使⽤⽅式为继承的方式, 但是企业开发中, 更多是把Feign接⼝抽取为⼀个独⽴的模块 (做法和继承相似, 但理念不同).
操作⽅法: 将Feign的Client抽取为⼀个独⽴的模块, 并把涉及到的实体类等都放在这个模块中, 打成⼀个Jar. 服务 消费⽅只需要依赖该Jar包即可. 这种⽅式在企业中⽐较常⻅, Jar包通常由服务提供⽅来实现.
实现步骤
1.创建新的模块
2. 引入maven的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3. 编写api
@FeignClient(value = "product-service",path = "/product") public interface ProductApiInterface { @RequestMapping("/{productId}")//指定跟哪个方法进行绑定 Product getProduct(@PathVariable Integer productId); }
4.安装到本地仓库
5.服务消费方引入依赖并将其注入
<!--引入自定义的product的feign客户端-->
<dependency>
<groupId>com.csy</groupId>
<artifactId>product-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
@EnableFeignClients(clients = {ProductApiInterface.class}) 在配置类,修改就会扫描,否则SpringBoot只会扫描当前包及其子包的Bean,所以第三方Bean需要声明在配置类,但是Feign开发商也想到这一点了,就提供了对应的属性。
不设置就会报下述错误:
你@Autowired注入了productApi这个Bean,但是我没有找到。
结语
通过本文的介绍,我们了解了什么是OpenFeign以及如何在Spring Cloud应用中使用
OpenFeign来实现微服务之间的通信。OpenFeign的强大功能和Spring Cloud的深度集成使得微服
务架构的开发变得更加简单和高效。希望本文对你有所帮助,谢谢阅读!