微服务feign接口声明的3种方式使用与分析

news2024/11/20 4:31:21

前言

feign调用方式是微服务调用最为广泛的使用方式,feign接口声明位置也是比较关键的一环。目前来说,feign的3种接口声明方式各自存在利弊,并不存在最优解决方案,只能根据需求去选择。本文中不作详细项目搭建过程,但并非无码之谈,阅读前请认真阅读项目说明。

项目说明

案例项目中有两个项目,分别是用户(user-service-nacos)与订单(order-service-nacos)。用户是服务提供者,订单是消费者。
user-service-nacos中只有一个接口findById,返回一串随机数

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public String findById(@PathVariable("id") String id) {
        Random r = new Random();
        return "user/id: " + id + r.nextInt();
    }

}

order-service-nacos有一个接口会去调用user-service-nacos的findById

@RestController
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/order/{id}")
    public String findById(Long id) {
        String byId = userClient.findById("9");
        return "userClient return value : " + byId;
    }
}

代码很简单,我们要探讨的问题就是上面的UserClient的feign接口声明放置的位置的用法与利弊

方式一:消费者中单独声明

在order-service-nacos中单独声明一个UserClient接口

@FeignClient("user-service")
public interface UserClient {

    @GetMapping("/user/{id}")
    String findById(@PathVariable("id") String id);

}

调用结果:
在这里插入图片描述

优劣分析

使用在消费者单独声明的方式,写法简单,代码耦合度低,可用于不处于同一个工程下的应用。但存在问题也是很明显,需要维护两个地方一模一样的代码,订单服务中的UserClient的声明其实和UserController声明的接口是一模一样的,而且必须要一模一样的,这就造成了代码冗余和维护的不便。

方式二

基于方式一的探讨,我们很容易想到,一模一样的代码,而且冗余,那解决方案很简单呀,抽方法,定义一个公共接口,让服务者与消费者都继承接口。
定义一个公共的接口:UserAPI

public interface UserAPI {
	@GetMapping("/user/{id}")
	String findById(@PathVariable("id") String id);
}

订单服务中,UserClient直接继承了这个接口,方法不用手动编写

@FeignClient("user-service")
public interface UserClient extends UserAPI {

}

用户服务中,UserController去实现接口中的方法

@RestController
public class UserController implements UserAPI {

    @GetMapping("/user/{id}")
    @Override
    public String findById(@PathVariable("id") String id) {
        Random r = new Random();
        return "user/id: " + id + r.nextInt();
    }

}

优劣分析

这样的做法有效避免了方式一中的缺陷,但由于提供者与消费者共用同一个接口,造成了紧耦合关系,如果UserAPI接口发生变动,提供者与消费者两端都受到影响,也无法作用于隔离开的两个工程项目。而且spring mvc继承的方式无法继承参数映射的注解,如上面的@PathVariable。尽管这种方式有缺点,但是也是遵循了面向契约的编程思想,在企业中有广泛的使用。

提出问题

假设有很多个微服务都要调用用户服务,那岂不是要在各个服务中都定义一个UserClient?如果在同一个父级pom文件下,你会想到将UserClient抽出来作为一个单独的module,这就是方式三的基本思想。

方式三:抽取独立模块

将FeignClient抽取为独立模块,并且把接口相关的实体类(pojo)、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

创建一个单独module,引入feign依赖,将UserClient复制到此处。我这里的案例比较简单,没有pojo,如果说接口返回的是一个对象,那么这个对象应该声明在下面pojo包中(也可以是dto)。其它地方使用时,需要导入该模块,注意配置好springboot的包路径扫描。
在这里插入图片描述
通常来说,feign-api模块最好是放置在服务提供者工程中,方便管理。若提供者与消费者属于同一个工程,则可直接引入pom文件。否则,则需要执行maven的package命令将feign-api打成jar包才能被消费者使用。

优劣分析

这种方式有效降低耦合度,并减少重复开发的工作,但也存在一定问题,假设定义的feign-api module中有大量的接口类,消费者只需要其中一两个接口,但是导入了比较多的类,存在冗余。相对而言,这种方式是feign的最佳实践方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做3D建模的女生多吗?揭露行业比列

有,但是不多,这是常态✅ 其实就像是IT领域的男女比例一样,但是也不是没有。更何况现在女孩子顶半边天,遇到领导是女生的也不少,未来的情况如何也不能完全的预估。 • ❤️事业是热爱做的事,工作是不得不做…

索引【MySQL】

1.1 概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。 1.2 作用 数据库中的表、数据、索引之间的关系,类似于书架上的图书、…

简洁直观解释精确率、召回率、F1 值、ROC、AUC

混淆矩阵 当我们在做二分类预测时,把预测情况与实际情况的所有结果两两混合,结果就会出现以下4种情况,就组成了混淆矩阵。 P(Positive):代表正样本N(Negative):代表负样…

在vscode中开发sass教程:sass语法

sass官网:Sass世界上最成熟、稳定和强大的CSS扩展语言 | Sass中文网sass:世界上最成熟、最稳定、最强大的专业级css扩展语言!sass是一个css的预编译工具,也就是能够更优雅的书写css;1、sass使用说明: 基于…

【毕业设计】后端实现——账单通过关键词简单分析收支

🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ✨个…

C++ STL中的set详解

前言 在学习csp题解的时候接触到这个数据结构&#xff0c;故在此记录一下其概念及应用。 基本概念 set的底层采用的是红黑树&#xff0c;所有元素都会根据元素的键值自动排序&#xff0c;方便管理元素&#xff0c;但不支持直接修改键值。 应用 头文件调用 #include <i…

python中is和==的区别,地址和重新复制后,地址变化

简单总结 现象描述&#xff1a;一、“编辑器“中和把赋值语句放在”同一行的cmd环境“中&#xff0c;相同值的不同变量会指向同一个地址 二、交互式/cmd环境中&#xff0c;若赋值相同值的变量在不同行输入&#xff0c;那么变量也会指向不同地址 三、程序编辑器的程序运行就相当…

B2B撮合管理系统优势有哪些?如何助力传统仪器仪表制造业企业数字化转型

仪器仪表制造业是我国制造业的重要组成部分&#xff0c;经过多年的快速发展&#xff0c;我国仪器仪表制造业生产和开发能力产业体系日趋庞大&#xff0c;产销增幅也是高歌猛进&#xff0c;对推动国民经济发展具有重要意义。 然而&#xff0c;随着我国仪器仪表制造业的发展&…

GAN模型1

本次是用GAN模型弄出时光机效果~ 穿越时空的人脸 得到你100年前的样子~~ 时光穿梭第一步&#xff1a;解决数据集难题 鉴于最近StyleGAN在高质量人脸合成和编辑方面的成功&#xff0c;许多工作都集中在使用预先训练好的StyleGAN模型进行人像编辑。 然而&#xff0c;现有的技术…

[附源码]计算机毕业设计JAVA儿童资源教育网站

[附源码]计算机毕业设计JAVA儿童资源教育网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

聚观365|抖音上线“防打扰保护工具”;亚马逊拟计划裁员1万人

今日要闻&#xff1a;抖音上线“防打扰保护工具”&#xff1b;亚马逊拟计划裁员1万人&#xff1b;苹果为iPhone14提供同机维修&#xff1b;美国硅谷裁员潮蔓延&#xff1b;乔布斯拖鞋拍卖融入NTF元素 抖音上线“防打扰保护工具” 11月15日&#xff0c;抖音上线“防打扰保护工具…

【数据结构与算法】第一章 绪论 2-数据结构的基本概念

第一章 绪论 2-数据结构的基本概念 思考&#xff1f; 程序 算法数据结构&#xff0c;算法 逻辑控制数据结构有两大用途&#xff1a; 一是用于存放要处理的数据&#xff0c;如迷宫地图二是用于实现算法策略&#xff0c;如迷宫例子中探索方向增量数组&#xff0c;回溯的栈&am…

如何深度自定义mybatis

回顾mybatis的操作的核心步骤 编写核心类SqlSessionFacotryBuild进行解析配置文件 深度分析解析SqlSessionFacotryBuild干的核心工作 编写核心类SqlSessionFacotry 深度分析解析SqlSessionFacotry干的核心工作 编写核心类SqlSession 深度分析解析SqlSession干的核心工作 …

物联网电池产品硬件电路设计思维

最近在整改之前工程师设计的电路板&#xff0c;是采用18650电池供电的一个物联网小板。 像这种电池供电的产品&#xff0c;很重要的一点就是要保证其低功耗&#xff0c;才得以提高续航&#xff0c;因此&#xff0c;对于这类电路板的对外接口的设计&#xff0c;对供电的控制尤其…

Arch Linux 的安装

Arch Linux 的安装 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Arch Linux 的安装 CSDN&#xff1a;Arch Linux 的安装 版本 Arch Linux&#xff1a;2022.07.01 VMware workstation&#xff1a; 16.2 安装步骤 下载 Arch Linux 并记录其 kernel 版…

【考研英语语法】口语语法

区别一&#xff1a;句子结构 口语中结构更为简单&#xff0c;较少使用从句 只有少量高频连词&#xff08;and / but / or / so / because / if / when&#xff09;正式&#xff1a; While the region was remarkable for its natural beauty, the family experienced seriousl…

法国博士后招聘|国家健康与医学研究院(INSERM)-计算化学

【国外博士后招聘-知识人网】法国国家健康与医学研究院&#xff08;INSERM&#xff09;计算化学博士后 法国国家健康与医学研究院&#xff08;法文为&#xff1a;Institut national de la sant et de la recherche mdicale&#xff09;&#xff0c;简称“Inserm”&#xff0c;成…

软件测试有哪些原则?

软件产品从开发到发布的过程中有一道至关重要的程序—软件测试&#xff0c;也就是验证软件系统的正确性、完整性、安全性和质量的过程。在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。…

股票如何量化选股?

量化选股是通过数量分析的方法去评价某一上市公司的发展前景&#xff0c;以及它的股票是否值得买入&#xff0c;一般采用多因子选股策略&#xff1a;假设有多种因子共同对股票资产收益产生了作用&#xff0c;且这些作用满足线性关系&#xff0c;那么我们就可以通过计算因子的值…

【pymysql的基本使用】

0. 介绍 本文主要介绍如何使用pymysql库来操作mysql数据库&#xff0c;包含docker安装MySQL和对Mysql的各种操作。 参考链接&#xff1a; Welcome to PyMySQL’s documentation! — PyMySQL 0.7.2 documentation Python3 MySQL 数据库连接 – PyMySQL 驱动 | 菜鸟教程 Pyt…