Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springcloud中feign的@FeignClient应该写在哪里?

springcloud中feign的@FeignClient应该写在哪里?

作者头像
lyb-geek
发布于 2022-01-06 08:44:10
发布于 2022-01-06 08:44:10
1.1K00
代码可运行
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路
运行总次数:0
代码可运行

01前言

最近项目组拿了友商的springcloud alibaba项目来进行改造,在翻阅他们的代码时候,发现他们把@FeignClient写在服务提供方的API上,他们这样的写法成功的引起我的注意,于是抱着好学的心态请教友商的开发人员,于是一篇水文就这么诞生了

02友商开发人员解惑

友商服务提供方的API形如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FeignClient(name = "feign-provider",path = UserService.INTER_NAME,contextId = "user")
public interface UserService {

    String INTER_NAME = "user";

    @GetMapping(value = "/{id}")
    UserDTO getUserById(@PathVariable("id") Long id);
}

我过往的经历是@FeignClient是写在消费端上,就是在消费端上会写一个接口继承服务端API接口,再打上@FeignClient,并指明fallback,形如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FeignClient(name = "feign-provider",path = UserService.INTER_NAME,contextId = "user",fallback = UserServiceClientFallBack.class)
public interface UserServiceClient extends UserService {
}

我将我过往的写法告诉友商开发人员,友商的开发人员对我说,你消费端还要自己写接口啊,那么麻烦。我们这种写法,消费端仅需pom文件引入API包,在调用方上打个 @Autowired标注,就可以调用服务提供方的接口。额,他们的说法真的很有道理,可惜没说服我,于是我抛出第二个问题,你们直接把@FeignClient写在服务提供方的API上,那如果消费端要进行熔断降级,要怎么做?

友商给我答案是用sentinel啊,直接在sentinel的控制面板上配置熔断降级策略,形如下

触发的结果形如下

看着已经实现了熔断的效果,但是我这种效果还不是我想要的,于是我又问,如果在面板上进行熔断后,我要记录熔断日志,该怎么做?友商给我的答案是这时候你就得采用分布式链路追踪组件啊比如skywalking,反正你记录日志,不也是为了排查问题方便,要懂得变通。额,好吧,最后我再抛出一个问题,既然你们直接把@FeignClient写在服务提供方的API上,那如果消费端想直连某台服务提供方进行本地联调,那要怎么做?友商的回答是他们开发的时候不会有这种场景,大家都是直连开发环境联调

03

如果是我来实现,我会把@FeignClient写在哪里?

毋庸置疑的,我会把@FeignClient写在消费端上,因为从职责上,只有消费端才能明确知道自己要调用哪个服务提供方,比如直连哪个服务提供方进行调试,如果直接把@FeignClient写在服务提供方的API上,消费端就很难按需定制。其次因为自己对sentinel也停留在听说过,也没实际用过,也是因为这次友商的项目了用springcloud alibaba的全家桶,才接触了下。后面在和友商讨论@FeignClient的放置问题后,回来在尝试了一把,发现友商说的在sentinel配置熔断降级不全面,因为我后边尝试让服务提供方超时或者报错,此时访问页面就会出现

后边我就按自己的想法,在消费端上会写一个接口继承服务端API接口,再打上@FeignClient,并指明fallback,形如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FeignClient(name = "feign-provider",path = UserService.INTER_NAME,contextId = "user",fallback = UserServiceClientFallBack.class)
public interface UserServiceClient extends UserService {
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
@Slf4j
public class UserServiceClientFallBack implements UserServiceClient{

    @Override
    public UserDTO getUserById(Long id) {
        log.info("id:{} fallback",id);
        return UserDTO.builder().id(id).userName("fallback").build();
    }
}

在application.yml激活sentinel对feign的支持

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
feign:
  sentinel:
    enabled: true

此时让服务提供方超时或者报错,再访问页面

同时控制台打印出熔断日志

04总结

写这篇文章的目的,并不是要反驳说@FeignClient写在服务提供方API的就是错的,个人是觉得脱离业务场景,来谈技术就是在耍流氓,毕竟友商他们自己那么用,也没出大问题,就说明他们当前的写法是满足他们业务需求。最后我来回答一下,springcloud中feign的@FeignClient应该写在哪里,就我个人而言,我还是倾向写在消费端上,而非服务提供方的API上

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue3创建项目(二)router路由配置和使用
 router安装与使用 先创建一个router的目录 在创建一个index.js的文件 将路径跳转的内容写在里面 这里的组件是你自己写的,之后根据路径就可以跳转了 #index.js配置 import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue'   const ap
痴心阿文
2022/11/18
9930
vue3创建项目(二)router路由配置和使用
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
写这篇文章的初衷并不是要大家真的不用node和vscode,说实话前端发展成今天这样,在实际开发中确实离不开node和vscode这类工具了,但往往工具用多了我们自己也成了一个工具人!
人人都是码农
2025/01/20
1650
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
SpringBoot_Vue3 《Hello World 》项目入门教程
前后端分离模式,可以让后端和前端开发人员致力于自己擅长的领域,且可以让前端和后端业务逻辑高度解耦合。本文从一个简单的案例入手,讲解使用 spring boot和vue3如何实现前后端的分离。
一枚大果壳
2023/08/18
7260
SpringBoot_Vue3 《Hello World 》项目入门教程
尤大都说了,别用parcel了。但我还是整出了一款Vue3项目搭建工具parcel-vue-app
前几天,尤大开直播说了造轮子的好处,主要还是锻炼自己。所以自己还是义无反顾地把这个项目搭建工具慢慢地造起来。
Vam的金豆之路
2021/12/01
6380
尤大都说了,别用parcel了。但我还是整出了一款Vue3项目搭建工具parcel-vue-app
IM跨平台技术学习(十一):环信基于Electron打包Web IM桌面端的技术实践
早就听说利用Electron可以非常便捷的将网页端快速打包成桌面应用,并且利用 Electron 提供的 API 调用可以使用原生桌面 API 一些高级功能。于是这次借着论证 Web IM端 SDK 是否可以在 Electron 生成的桌面端正常稳定使用,我决定把官方新推出的 webim-vue3-demo,打包到桌面端,并记录了这次验证的过程以及所遇到的问题和解决方法。
JackJiang
2024/06/13
2400
IM跨平台技术学习(十一):环信基于Electron打包Web IM桌面端的技术实践
三年项目升级Vue3的踩坑经历
我们组三年前开发了一套NoCode平台命名为米鹿平台,旨在提升运营生产力,目前这个系统的用户数一直维持在一个相对较高的水准,并且有越来越多的新用户加入,所以对该平台开放的能力要求就变高了许多。经过多次会议后,我们要将这个平台改造一下,可以接受外部组件,任何业务方的开发人员都可以给我们平台提供自定义组件,这样可以进一步提升开发和运营效率,充分发挥这个平台的作用。由于即将接入我们平台的多个业务方已经拥抱Vue3,所以我们决定将米鹿平台升级到Vue3。
乐圣
2022/11/19
2.8K0
Vue3+ElementPlus+Axios实现前后端分离demo
项目创建完成后自动进入我们创建的demodemo项目中,我们点击依赖,点击右上角安装依赖,分别搜索axios、element-plus并安装。安装后让如图所示
Python研究所
2022/06/17
2.6K0
Vue3+ElementPlus+Axios实现前后端分离demo
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
最近博客上线,但是在首次加载的时候,需要消耗很多时间,大概在50秒左右,就是说第一页登录页面,就需要用户等待50秒(服务器是最低配置也是一个原因),看了一下network,发现有两个文件加载的时间特别长,一个是vendor.js,一个是app.js,打包的时候,这两个文件也提示文件过大
Autooooooo
2020/11/09
1.9K0
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
用 Vue 和 Django 快速搭建前后端分离项目
Web 开发中前后端分离已经是常规性做法,但是不少初学者不太熟悉如何前后端分离,搭建 Demo 的时候遇到的问题也比较多,今天就来分享一下如何用 Vue 和 Django 快速搭建前后端分离项目。
somenzz
2022/10/25
5.1K0
用 Vue 和 Django 快速搭建前后端分离项目
【Vue3】用Element Plus实现列表界面
哈喽大家好,本期我们用Element Plus实现列表界面,我们先用vue+vite创建一个vue项目,创建项目可以参考:利用vite创建vue3项目噢~
颜颜yan_
2023/03/28
3.2K0
【Vue3】用Element Plus实现列表界面
Vue 入门
最后便会在本目录生成一个dist文件夹 里面就会有js/bundle.js,一个压缩好的可以调用的js。
HcodeBlogger
2020/07/14
3290
Vue 入门
一个基于vite构建的vue3+pinia+ts+elementUI plus的初始化开箱即用的项目模版
Vite 需要 Node.js 版本 >= 12.0.0。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。
用户6297767
2023/11/21
9230
一个基于vite构建的vue3+pinia+ts+elementUI plus的初始化开箱即用的项目模版
Vue3 Element Plus WindiCSS 项目开发环境搭建
MVVM 是 Model-View-ViewModel 的简写,它本质上是 MVC 的改进版。MVVM 将其中的 View 的状态和行为抽象化,并且将视图 UI 和业务逻辑分开。 (1)M:即 Model(模型),包括数据和一些基本操作。 (2)V:即 View(视图),指页面渲染结果。 (3)VM:即 View-Model,指模型与视图间的双向操作(无须开发者干涉)。
耕耘实录
2023/12/18
4300
【实战技巧】Vue3+Vite工程常用工具的接入方法
Vue3 正式版已经发布一段时间了,和 Vue3 更配的工具 Vite 也已经投入使用了,本文整理了如何将一些常用的工具整合到项目中。
一尾流莺
2022/12/10
2.1K0
vite的项目,使用 rollup 打包的方法
构建生产版本——库模式 https://cn.vitejs.dev/guide/build.html#library-mode
用户1174620
2021/12/01
2.1K0
vite的项目,使用 rollup 打包的方法
Vite2.0搭建Vue3.0应用实践
最近Vite2.0很火热,说是要替代webpack作为下一代前端构建工具。上个周末搬完房子仔细研究了一下,照着我们目前的项目环境,尝试搭建了一套基础环境,简单了解了Vite2.0的配置,以及各种库的集成。这里对Vite2.0不做过多的介绍,主要优点就是快,快,快。
拿我格子衫来
2022/01/24
5210
Vite2.0搭建Vue3.0应用实践
Vue3 全家桶 + Element Plus + Vite + TypeScript + Eslint 项目配置最佳实践
而且 Element Plus + Vite 也出了一段时间了,是时候该上手体验分享一波了。
Sneaker-前端公虾米
2021/06/21
2.6K1
Vue3 全家桶 + Element Plus + Vite + TypeScript + Eslint 项目配置最佳实践
只需要3招将你的Vue项目访问时间从1分钟缩短到3秒以内
基于Vuecli搭建的vue项目简单快捷,易于开发。在node.js的加持下你可以更快的引入万千JavaScript开发库,仅仅依靠前端就可以实现以前使用后端才能实现的功能,如通过axios便可以快捷的与后端进行数据交互等。
IT大咖说
2020/10/19
1K0
只需要3招将你的Vue项目访问时间从1分钟缩短到3秒以内
从 jQuery 到 Vue3 的快捷通道
jQuery的使用非常方便,用 script 引入 js文件即可,然后找到DOM即可开始操作。 而 Vue3 也支持直接用 script 引入的方式,然后使用插值的方式绑定数据,我们来看一下使用方法:
用户1174620
2022/05/09
7570
从 jQuery 到 Vue3 的快捷通道
vue-cli3项目搭建配置以及性能优化
vue-cli3也可以采用UI面板进行配置,相对比较方便,目前先写命令行创建,后续再加上面板创建。
青梅煮码
2023/03/13
1.6K0
vue-cli3项目搭建配置以及性能优化
推荐阅读
相关推荐
vue3创建项目(二)router路由配置和使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验