微服务_fegin

news2025/2/1 11:40:09

Feign服务调用

是客户端组件

ruoyi系统中Log\Auth\User用了远程服务调用,用工厂模式给他的报错加了层工厂类,return错误的时候重写了以下方法。

在ruoyi-common-core模块中引入依赖

        <!-- SpringCloud Openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

会调用同一url中的其他服务中的接口方法(对应其他服务中的controller),在这里只是映射下路径换个名字。所以不需要实现接口。

  • http调用?
  • 因为是http调用,所有要调用别人负责处理网络请求的controller层。同时在自己这里属于是业务层。

为了方便统一管理,就都在api模块了。其实依赖了api模块,相当于自己有api模块。

被调用方不需要依赖api模块

被调用的几乎什么都不用做

调用匹配机制:url+

@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.FORUM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService

注解上的value是模块名字

请求传参

Get方式传参,使用@PathVariable@RequestParam注解接收请求参数

@GetMapping(value = "/user/info/{username}")
public R<LoginUser> getUserInfo(@PathVariable("username") String username);

@RequestParam(“参数名”)

Post方式传参,使用@RequestBody注解接收请求参数。

@PostMapping("/operlog")
public R<Boolean> saveLog(@RequestBody SysOperLog sysOperLog);

反客为主了属于是,原来是参数从url中匹配,现在是调用时传给url,url给远程服务,远程服务再从url取

在openfeign传递参数必须加入注解(在接口声明处),不然会报参数传入过多错误。

跨模块公用的类。多个模块都要用,所以最好声明在专门的模块中,如ruoyi中的api

数组:

/test?ids=21&ids=22

@GetMapping("/test3")
String tests(@RequestParam("ids") String[] ids) 

可以调用方传集合,被调用方用vo中的list接受,类似前端传数据,名字对应就行,会自动映射到vo中的list

ruoyi中接口访问分为两种,一种是由Gateway网关访问进来,一种是内网通过Feign进行内部服务调用。

OpenFeign

Feign本身并不支持Spring MVC的注解,它有一套自己的注解,为了更方便的使用Spring Cloud孵化了OpenFeign。并且支持了Spring MVC的注解,如@RequestMapping@PathVariable等等。
OpenFeign@FeignClient可以解析Spring MVC@RequestMapping注解下的接口,并通过动态代理方式产生实现类,实现类中做负载均衡调用服务。

Feign(NetFlix)---->维护---->SpringCloud OpenFeign

是一个声明式的伪http客户端

简单:写一个接口,加一个注解,调用服务代码。自动完成数据转换

具有可插拔的注解特性(支持SpringMVC注解),可使用Feign注解和JAX-RS注解.

支持可插拔的编码器和解码器,默认集成了Ribbon。

使用

调用方写对应的接口,被调用的干自己原来事情就好,啥也不用做(本来被调用方就是顺便帮忙的,代码复用的,被调用是兼职)

返回值和形参一样就行,方法名不需要一样(因为是靠uri一一对应的,不是靠方法名对应的)

入口类加入注解@EnableDiscoveryClient,consul的注解,此处注册中心用Consul

服务调用方引入OpenFeign的依赖

<!-- SpringCloud Openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在服务调用方入口类上加注解@EnableFeignClients

被调用方入口类不用加这个注解,除非它同时也是个调用方

一般远程调用的专门写个包,如feignClient

//例子1
@FeignClient("被调用的服务id")	//value
public interface ProductClient{
    
}

//例子2 ruoyi
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{
    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/user/info/{username}")
    public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @param source 请求来源
     * @return 结果
     */
    @PostMapping("/user/register")
    public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

调用方直接用这个接口声明成员变量,然后调用接口中的方法。

例, 当auth模块的SysLoginService调用remoteUserService.getUserInfo(username, SecurityConstants.INNER);方法时,调用的其实是system模块里同url的controller里的方法。

api模块相当于一个配置的地方,将可以被远程调用的接口根据url在api模块下映射一下,然后调用api模块中的方法会找到对应的接口

因为服务调用是跨端口的,调用方(auth)要知道被调用方(system)的url

默认轮询负载均衡

响应处理

超时处理

在调用方设置请求被调用方时的超时时间

要求服务一秒内响应,否则报错

修改默认超时设置

feign.client.config.服务id.connectTimeout=5000	#配置指定服务连接超时
feign.client.config.服务id.readTimeout=5000	#配置指定服务等待超时
feign.client.config.default.connectTimeout=5000	#配置所有服务连接超时
feign.client.config.default.readTimeout=5000	#配置所有服务等待超时

ribbon超时设置

Feign的负载均衡底层用的就是Ribbon,所以请求超时其实就只需要配置Ribbon参数。

全局配置

# 请求处理的超时时间
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000

局部配置

# ruoyi-xxxx 为需要调用的服务名称
ruoyi-xxxx:
  ribbon:
    ReadTimeout: 10000
    ConnectTimeout: 10000

日志

在调试时开启详细日志

logging.level.com.包名=debug 

feign为每个客户端提供了日志对象
请添加图片描述

feign.clientl.config.服务id.loggerLevel=full 

代码设置

全局配置

@Bean
public Logger.Level getLog()
{
	return Logger.Level.FULL;
}

局部配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Logger;

/**
 * Feign 客户端配置
 *
 * @author ruoyi
 */
@Configuration
public class FeignConfiguration
{
    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;
    }
}

// ====== 在客户端接口指定此配置 ======

/**
 * 用户服务
 * 
 * @author ruoyi
 */
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class, configuration = FeignConfiguration.class)
public interface RemoteUserService
{
} 

Http连接池

两台服务器建立HTTP连接的过程涉及到多个数据包的交换,很消耗时间。采用HTTP连接池可以节约大量的时间提示吞吐量。

FeignHTTP客户端支持3种框架:HttpURLConnectionHttpClientOkHttp

默认是采用java.net.HttpURLConnection,每次请求都会建立、关闭连接,为了性能考虑,可以引入httpclientokhttp作为底层的通信框架。

例如将FeignHTTP客户端工具修改为HttpClient

1、添加依赖

<!-- feign httpclient -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2、全局配置

feign:
  httpclient:
    # 开启httpclient
    enabled: true

请求拦截器

在可以通过实现feign.RequestInterceptor接口在feign执行后进行拦截,对请求头等信息进行修改。

例如项目中利用feign拦截器将本服务的userIduserNameauthentication传递给下游服务

import feign.RequestInterceptor;
import feign.RequestTemplate;

/**
 * feign 请求拦截器
 * 
 */
@Component
public class FeignRequestInterceptor implements RequestInterceptor
{
    @Override
    public void apply(RequestTemplate requestTemplate)
    {

    }
}

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

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

相关文章

springboot不香吗?为什么还要使用springcloud--各个组件基本介绍(Feign,Hystrix,ZUUL)

1.Feign负载均衡简介 1.1 Feign是什么 Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口&#xff0c;然后在上面添加注解&#xff0c;同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring…

07-根据Hutool工具的JWT实现单点登录功能

1、两种单点登录方案 1.1、使用token + Redis 实现单点登录(一般不用了) 1.2、使用JWT实现单点登录 2、 JWT单点登录的原理和JWT存在的问题及解决方案讲解 2.1、JWT结构 > Header 头部信息,主要声明了JWT的签名算法等信息。 > Payload 载荷信息,主要承载了各种声明并…

闲置APP小程序开发 你不喜欢的可能正是别人需要的

生活中我们常常会产生各种闲置物品&#xff0c;尤其是对于有宝宝的家庭来说&#xff0c;孩子小的时候可能会添置各种玩具、婴儿车或者是别的用品&#xff0c;随着孩子渐渐长大&#xff0c;这些东西都用不上了&#xff0c;但是扔了又觉得很可惜&#xff0c;留着又占地方&#xf…

给编程初学者写一篇简单的文章,快速查询本机ip,黑别人电脑的基基础

给编程小白写一篇简单的文章&#xff0c;快速查询本机ip 首先&#xff0c;按下win徽标键r键 &#xff08;先按win键再按r键&#xff09; 出现一个小窗口 在里面输入cmd 然后&#xff0c;你将得到一个cmd窗口 在里面输入ipconfig&#xff0c;然后按回车 就可以得到ip地址了 如…

【浅学 MyBatis 】

MyBatis 笔记记录 一、MyBatis基础1. MyBatis介绍及快速入门2. 相关API介绍2.1 Resources2.2 SqlSessionFactory&&SqlSessionFactoryBuilder2.3 SqlSession 3. 映射配置文件4. 核心配置文件4.1 规范写法4.2 参数和返回类型_起别名 5. 引入Log4j 二、MyBatis进阶1. 接口…

Mac环境Royal TSX 从入门使用代替X sheet

Royal TSX 是一款 macOS 下可用的远程连接软件&#xff0c;类似于 Windows 系统的 XShell 。免费版最多支持 10 个连接&#xff0c;对于个人开发而言&#xff0c;已经足够了 一、下载安装 Royal TS 官网&#xff1a;https://www.royalapps.com/ts/win/download 选择 Royal T…

Python Ploty学习: 最简单的Dash App

1 Ploty简介 示例来自官网A Minimal Dash App | Dash for Python Documentation | Plotly有改动 Ploty与matplotlib和seaborn相比&#xff0c;其核心优势在于可交互性&#xff0c;matplotlib和seaborn默认情况下不可交互&#xff0c;具备可交互性的图表在数据分析、展示方面更…

CLIP原理解读——大模型论文阅读笔记一

CLIP原理解读 一. 核心思想 通过自然语言处理来的一些监督信号&#xff0c;可以去训练一个迁移效果很好的视觉模型。 论文的作者团队收集了一个超级大的图像文本配对的数据集&#xff0c;有400 million个图片文本的配对&#xff0c; 模型最大用了ViT-large&#xff0c;提出了…

【JavaEE】使Cookie与Session失效-Servlet上传文件操作-优化表白墙

表白墙退出登录操作-表白墙注册上传头像登录显示头像功能 文章目录 【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像登录显示头像功能1. Cookie与Session的删除1.1 表白墙页面增加登录出口1.2 点击链接退出登录1.3 测试 2. 上传文…

【Java线程池详解】—— 每天一点小知识

&#x1f4a7; J a v a 线程池 \color{#FF1493}{Java线程池} Java线程池&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x1f…

2023-6-10-第一式工厂方法模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内&#xff0c;但是最近在项目中遇到了这个问题&#xff0c;正好借此机会写一篇文章&#xff0c;在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。 其实关于串口通信会可能会出现…

编译tolua——3、以pbc为例子,添加第三方库

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子&#xff0c;添加第三方库 4、更新luaJit 大家好&#xff0c;我是阿赵。 之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例&#xff0c;看看怎样往tolua里面添加其他的第三方库。知道了方法之后&#xf…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好&#xff0c;我是郭东白。上节课我们讲了为什么要做阶段性的价值交付&#xff0c;以及进入阶段性价值交付环节的准备工作。有了这些学习基础&#xff0c;这节课我们就可以进行阶段性价值交付了。 在交付的过程中&#xff0c;主要有三部分工作&#xff1a;目标分解、定义交…

SLAM十四讲——ch4实践(李群李代数)

视觉SLAM14讲----ch4的操作及避坑 一、ch4的实践的准备工作二、各个实践操作1. Sophus的基本使用方法2. 例子&#xff1a;评估轨迹误差 三、遇到的问题 一、ch4的实践的准备工作 确保已经有Sophus库&#xff0c;Sophus库是一个较好的李代数库。 注意&#xff1a; 开始时slamb…

MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

Linux之进程间通信——system V(共享内存、消息队列、信号量等)

文章目录 前言一、共享内存1.共享内存的基本原理2.共享内存的创建3.共享内存的控制参数返回值共享内存的内核数据结构 4.共享内存的关联参数 5.共享内存的去关联6.查看IPC资源7.查看共享内存8.删除共享内存 二、实现进程间通信&#xff08;代码&#xff09;三、共享内存的特点四…

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试…

【ThreadLocal为什么可能内存泄漏?】 —— 每天一点小知识

&#x1f4a7; T h r e a d L o c a l 为什么可能内存泄漏&#xff1f; \color{#FF1493}{ThreadLocal为什么可能内存泄漏&#xff1f;} ThreadLocal为什么可能内存泄漏&#xff1f;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个…