跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)

目录

目录

一  问题起因     

二  openfeign远程调用

三  openfeign用法

四  openFeign中的@FeignClient

五  扩展---再松耦合!

六 扩展---其他探究!

 1.forest

2.@feignClient 的fallbackFactory参数

 3.自动装配

 4.@EnableFeignClient 待研究  彻底搞懂Feign——EnableFeignClient底层机制探究_enablefeignclients_怎能止步于此的博客-CSDN博客



一  问题起因     

 刚进入项目时被公司大神告知不能跨模块调用,然后心想,不跨模块调用方法,那就在本模块重新写一个方法呗,

       比如一个电商系统(打个比方,真实项目中不是电商),有俩模块,一个是system模块,有查询用户信息的方法queryUser(),一个是购买模块(purchase模块),购买逻辑中需要用到当前用户信息的时候需要调用queryUser(),一般情况下写,直接引入system模块的依赖,然后调用方法就行了,可是被告知不让这么调用(具体原因下面会写),那我想了想,那就在purchase模块中重新写一个queryUser()方法,然后自己去数据库里查就行了,看了看其他人也有这么写的,然后写完了。

       前两天代码审查告诉我这样也不行,不让跨模块查表,user表是属于system模块的表,不能让purchase模块去查。这时候我才想到要问为什么,为什么不能跨模块调用方法和跨模块查表呢?

       原来是这样:目前我本地运行了两个模块system模块和purchase模块,自己本地怎么调用都没问题,哪怕之后就这么正式部署上,也没问题。但是,如果有一天,业务扩展了,用户比较多 ,system模块脱离出来了,需要在另外一台服务器B上单独跑一个服务,用户表也需要存放在服务器B上,那这个时候写的代码咋办? purchase模块启动了之后发现本地调用找不到system服务了(system模块已经在服务器B部署了),purchase本地查表也查不到了(分库分表在服务器B上了),耦合度高的问题显现出来了。

     解决的方法也是有的,松耦合,模块间进行远程调用。

二  openfeign远程调用

   远程调用,从网络上来讲可以理解为:(摘自什么是远程调用?图文简要介绍_51CTO博客_feign是如何实现远程调用的)

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第1张图片

我所参考的项目中的远程调用,用的是openfeign

OpenFeign可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。(openfeign的提供方和消费方需要在注册中心进行注册)

三  openfeign用法

具体的用法:首先理解一下,远程调用时分为服务消费者和服务提供者,就是purchase模块(服务消费者)远程调用system模块(服务提供者)中的方法。

purchase模块就是consumer一方,system模块就是producer一方。要保证提供方已经在注册中心注册了能被发现

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第2张图片

  1.提供方正常写RESTful 接口:

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第3张图片

2.消费者一方添加依赖

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

用使用spring-cloud-openfeign-core也可以 目前不知道两者的不同,但是spring-cloud-starter-openfeign包含spring-cloud-openfeign-core,如下图所示

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第4张图片

3.消费者一方启动类添加注解@EnableFeignClients

 4.消费方有两个包里的类,一个包命名api,用来建立远程连接,而另一个包里的controller本地调用api来完成调用,完成调用时只需要注入api中的service,像平常用一样调用方法就好。

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第5张图片

 跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第6张图片

四  openFeign中的@FeignClient

 下面讲一下api中的东西 api中的注解@FeignClient  用于声明一个接口作为 Feign客户端,使用@FeignClient注解中需要指定需要调用的服务的名称,该服务必须在注册中心注册过,并且本地classpath中需要存在该服务的实现类。@FeignClient 用于客户端的 API 接口定义,它可以将一个 HTTP API 接口转化为一个 Java 接口,从而使得我们可以像调用本地方法一样调用远程服务。

@feignclient中的参数

name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。value,name 这两个就同一个意思:对应的是调用的微服务的服务名,对用服务发现、走网关调用,这个很关键

url: url一般用于调试,可以手动指定@FeignClient调用的地址

decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException

configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口

fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码

path: 定义当前FeignClient的统一前缀

contextId:  当name一样时,用centextId区分,具体可见https://www.uoften.com/article/213667.html

或者百度搜索contextId的用法

@FeignClient声明之后,完全照搬提供者所写的接口即可,(feign在此处有些不同)跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第7张图片

五  扩展---再松耦合!

上面的流程已经能完成远程调用了,然而我在看项目的时候 看到项目中将消费者中的api包封装成了一个模块,有多个消费者、多个提供者的时候,只用通过api这个中介去调用,再次降低了模块与模块之间的耦合度。

消费者模块中只用在启动类中引用@EnableFeignClients ,然后本地引入api模块(添加maven),调用api中的service即可。

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第8张图片

六 扩展---其他探究!

 1.forest

同门鞠大神说可以用forest实现远程调用,而且不用注册中心注册,待后续研究一下

2.@feignClient 的fallbackFactory参数

项目中在@feignClient注解后面的参数中看到了fallbackFactory,看样子是出错后的处理,

fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码

加上这个属性。属性是创建fallbackFactory的类,  具体就是出错后返回信息。待研究

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第9张图片

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第10张图片

 3.自动装配

       本地调用的时候,看到api模块中有些类标有注解@Component,然而api中并没有启动类,那这些组件类是怎么放到spring中管理的呢?

  

跨模块远程调用中openfeign使用以及调用的流程(spring自动装配)_第11张图片

      直接说结果吧:api 模块中有一个配置 ,里面写上了需要装配进spring的各个类路径和名字,当然了 这些类也要写上@component或者类似的扩展的注解来标记这是一个bean。(这个方法是22年springboot更新2.7后出现的 之前的方法可以看 CSDN,待研究)

      然后消费者本地引用api模块(maven引入),启动类启动的时候@SpringbootApplication起作用 自动扫描当前目录和子目录把组件放进spring管理(如果不手动scan配置的话就自动扫描),并且把引入的jar包中的组件就装配spring中,具体咋装配看这个springboot自动装配原理_org.springframework.boot.autoconfigure.autoconfigu_废柴程序猿的博客-CSDN博客springboot自动装配_org.springframework.boot.autoconfigure.autoconfiguration.importshttps://blog.csdn.net/weixin_43950558/article/details/125218651

和这个
springboot多模块扫描_springboot扫描其他模块的包_呆萌小新@渊洁的博客-CSDN博客​​​​​​如图。springboot默认扫描启动类同级包和同级的子包内容。_springboot扫描其他模块的包https://blog.csdn.net/m0_50913327/article/details/127620912?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-127620912-blog-124862925.235%5Ev38%5Epc_relevant_anti_t3&spm=1001.2101.3001.4242.3&utm_relevant_index=7补充一点,引入的jar包目录一样的话,会合并,视为同目录或子目录

 4.@EnableFeignClient 待研究  彻底搞懂Feign——EnableFeignClient底层机制探究_enablefeignclients_怎能止步于此的博客-CSDN博客

你可能感兴趣的:(spring,java,后端)