SpringCloud整合OpenFeign实现微服务间的通信

 更新时间:2024年06月12日 11:54:43   作者:风止￴  
微服务之间的通信⽅式,通常有两种: RPC 和 HTTP,在SpringCloud中, 默认是使⽤HTTP来进⾏微服务的通信, 最常⽤的实现形式有两种:RestTemplate和OpenFeign,本文给大家介绍了SpringCloud整合OpenFeign实现微服务间的通信,需要的朋友可以参考下

1. 前言

1.1 为什么要使用OpenFeign?

虽说RestTemplate 对HTTP封装后, 已经⽐直接使⽤HTTPClient简单⽅便很多, 但是还存在⼀些问题.

  1. 需要拼接URL, 灵活性⾼, 但是封装臃肿, URL复杂时, 容易出错.
  2. 代码可读性差, ⻛格不统⼀。

1.2 介绍一下微服务之间的通信方式

微服务之间的通信⽅式, 通常有两种: RPC 和 HTTP.

在SpringCloud中, 默认是使⽤HTTP来进⾏微服务的通信, 最常⽤的实现形式有两种:

  • RestTemplate
  • OpenFeign

RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。

常⻅的RPC框架有:

  • Dubbo: Apache Dubbo 中⽂
  • Thrift : Apache Thrift - Home
  •  gRPC: gRPC

1.3 OpenFeign介绍

OpenFeign 是⼀个声明式的 Web Service 客户端. 它让微服务之间的调⽤变得更简单, 类似于controller,调⽤service, 只需要创建⼀个接⼝,然后添加注解即可使⽤OpenFeign。

OpenFeign是一个基于Java的HTTP客户端,它使得编写和维护RESTful服务之间的通信变得更加简单。通过使用注解和接口定义,开发者可以轻松地创建RESTful服务的客户端,并且无需编写大量的样板代码。

1.4 OpenFeign 的前⾝

Feign 是 Netflix 公司开源的⼀个组件.

  • 2013年6⽉, Netflix发布 Feign的第⼀个版本 1.0.0
  • 2016年7⽉, Netflix发布Feign的最后⼀个版本 8.18.0
  • 2016年,Netflix 将 Feign 捐献给社区
  • 2016年7⽉ OpenFeign 的⾸个版本 9.0.0 发布,之后⼀直持续发布到现在.

可以简单理解为 Netflix Feign 是OpenFeign的祖先, 或者说OpenFeign 是Netflix Feign的升级版.

OpenFeign 是Feign的⼀个更强⼤更灵活的实现.

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);
}

@FeignClient 注解作⽤在接⼝上, 参数说明:

  • 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);

传递JavaBean对象 -> @SpringQueryMap

传递Json 数据 -> @RequestBody

4.最佳实践

最佳实践:其实也就是经过历史的迭代, 在项⽬中的实践过程中, 总结出来的最好的使用方式。

最佳实践就是帮助我们继续优化代码,我们也能看出来, Feign的客户端与服务提供者的controller代码非常相似。所以我们可以对其抽取一个类,需要的继承即可。或者我们可以抽取成一个jar包需要的时候导入依赖即可。

4.1 Feign 的继承    

Feign ⽀持继承的方式, 我们可以把⼀些常⻅的操作封装到接口里。我们可以定义好⼀个接⼝, 服务提供⽅实现这个接⼝, 服务消费⽅编写Feign 接⼝的时候, 直接继承这个接⼝。 具体参考: Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 因为这种不是最优的解法,我就不过多介绍了。

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的深度集成使得微服

以上就是SpringCloud整合OpenFeign实现微服务间的通信的详细内容,更多关于SpringCloud OpenFeign通信的资料请关注脚本之家其它相关文章!

相关文章

  • 教你正确的Java扩展方法示例详解

    教你正确的Java扩展方法示例详解

    这篇文章主要为大家介绍了教你正确的Java扩展方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • java实现银行家算法(Swing界面)

    java实现银行家算法(Swing界面)

    这篇文章主要为大家详细介绍了银行家算法的java代码实现,Swing写的界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Struts2单选按钮详解及枚举类型的转换代码示例

    Struts2单选按钮详解及枚举类型的转换代码示例

    这篇文章主要介绍了Struts2单选按钮详解及枚举类型的转换代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 举例讲解Java设计模式编程中模板方法模式的运用实例

    举例讲解Java设计模式编程中模板方法模式的运用实例

    这篇文章主要介绍了Java设计模式编程中模板方法模式的运用实例,模板方法模式强调基于继承的代码复用,需要的朋友可以参考下
    2016-05-05
  • Spring Boot调用 Shell 脚本实现看门狗功能

    Spring Boot调用 Shell 脚本实现看门狗功能

    这篇文章主要介绍了Spring Boot调用 Shell 脚本实现看门狗功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除

    这篇文章主要为大家介绍了GC算法实现篇之并发-标记-清除, CMS垃圾收集器在减少停顿时间上做了很多给力的工作, 大量的并发线程执行的工作并不需要暂停应用线程
    2022-01-01
  • 详解如何解析pom文件方法示例

    详解如何解析pom文件方法示例

    这篇文章主要为大家介绍了详解如何解析pom文件方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 解决SpringAop内部调用时不经过代理类的问题

    解决SpringAop内部调用时不经过代理类的问题

    这篇文章主要介绍了解决SpringAop内部调用时不经过代理类的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JDK8中的HashMap初始化和扩容机制详解

    JDK8中的HashMap初始化和扩容机制详解

    这篇文章主要介绍了JDK8中的HashMap初始化和扩容机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 简单工厂模式_动力节点Java学院整理

    简单工厂模式_动力节点Java学院整理

    这篇文章主要介绍了简单工厂模式的相关资料,和大家一起学习静态工厂方法模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论