当前位置: 首页 > news >正文

SpringCloud --- Feign远程调用

一、RestTemplate问题

先来看我们以前利用RestTemplate发起远程调用的代码:

存在下面的问题:

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

 

 

二、Feign替代RestTemplate

Fegin的使用步骤如下

1)引入依赖


我们在order-service服务的pom文件中引入feign的依赖:

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

2)添加注解


在order-service的启动类添加注解开启Feign的功能:


3)编写Feign的客户端


在order-service中新建一个接口,内容如下:

package cn.itcast.order.client;import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice

  • 请求方式:GET

  • 请求路径:/user/{id}

  • 请求参数:Long id

  • 返回值类型:User

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了


4)测试


修改order-service中的OrderService类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

是不是看起来优雅多了。


5)总结


使用Feign的步骤:

  1. 引入依赖
  2. 添加@EnableFeignClients注解
  3. 编写FeignClient接口
  4. 使用FeignClient中定义的方法代替RestTemplate

 

 

三、自定义配置

Feign可以支持很多的自定义配置,如下表所示:

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。

下面以日志为例来演示如何自定义配置。

配置文件方式


基于配置文件修改feign的日志级别可以针对单个服务:

feign:  client:config: userservice: # 针对某个微服务的配置loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:  client:config: default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。

  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。


Java代码方式


也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration  {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志级别为BASIC}
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

 

 

四、Feign使用优化

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。

这里我们用Apache的HttpClient来演示。

1)引入依赖

在order-service的pom文件中引入Apache的HttpClient依赖:

<!--httpClient的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>

2)配置连接池

在order-service的application.yml中添加配置:

feign:client:config:default: # default全局的配置loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数

接下来,在FeignClientFactoryBean中的loadBalance方法中打断点:

Debug方式启动order-service服务,可以看到这里的client,底层就是Apache HttpClient:

总结,Feign的优化:

1. 日志级别尽量用basic

2. 使用HttpClient或OKHttp代替URLConnection

  • 引入feign-httpClient依赖
  • 配置文件开启httpClient功能,设置连接池参数

 

 

五、最佳实践

所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。

自习观察可以发现,Feign的客户端与服务提供者的controller代码非常相似:

feign客户端:

UserController:

有没有一种办法简化这种重复的代码编写呢?

 

5.1、继承方式

一样的代码可以通过继承来共享:

1)定义一个API接口,利用定义方法,并基于SpringMVC注解做声明。

2)Feign客户端和Controller都集成改接口

优点:

  • 简单

  • 实现了代码共享

缺点:

  • 服务提供方、服务消费方紧耦合

  • 参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解

  

5.2、抽取方式

将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

 

5.3、实现基于抽取的最佳实践

1)抽取


首先创建一个module,命名为feign-api:

项目结构:

 

在feign-api中然后引入feign的starter依赖

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

然后,order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

 


2)在order-service中使用feign-api


首先,删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。

   

在order-service的pom文件中中引入feign-api的依赖:

<dependency><groupId>cn.itcast.demo</groupId><artifactId>feign-api</artifactId><version>1.0</version>
</dependency>

修改order-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的包


3)重启测试


重启后,发现服务报错了:

这是因为UserClient现在在cn.itcast.feign.clients包下,

而order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient。


4)解决扫描包问题


方式一:

指定Feign应该扫描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:

指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})

相关文章:

SpringCloud --- Feign远程调用

一、RestTemplate问题 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复杂URL难以维护 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign:…...

基于单片机的数字频率计设计

数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号&#xff0c;方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试…...

我看看哪个靓仔还没把Github Copilot用起来?

本人经常分享有价值的生产力工具、技术、好物与书籍&#xff0c;可关注同名公众&#x1f42d;并设为&#x1f31f;星标&#xff0c;第一时间获得更新 Github Copilot 是一个AI编程助手&#xff0c;其使用 OpenAI CodeX 在你的编辑器中实时建议代码或给你实现整个功能。 视频版介…...

C++系列一: C++简介

C入门简介 1. C语言的特点2. C编译器3. 第一个 C 程序4. 总结&#xff08;手稿版&#xff09; C 是一种高级编程语言&#xff0c;是C语言的扩展和改进版本&#xff0c;由Bjarne Stroustrup于1983年在贝尔实验室为了支持C语言中的面向对象编程而创建。C 既能够进行底层的系统编程…...

信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟

笔者来自通信考研小马哥23上交819全程班学员 信通初试第一&#xff1a;无科研无竞赛一战上岸上海交大819学硕感悟 原创2023-04-27 11:04通信考研小马哥 笔者来自通信考研小马哥23上交819全程班学员 本人情况&#xff1a; 本人是19届交本&#xff0c;本科成绩很差&#xff0c;…...

Spring —— Spring Boot 配置文件

JavaEE传送门 JavaEE Spring —— Bean 作用域和生命周期 Spring —— Spring Boot 创建和使用 目录 Spring Boot 配置文件Spring Boot 配置文件格式properties配置文件properties 基本语法properties 缺点 yml 配置文件yml 基本语法yml 配置不同类型数据及 nullyml 配置对象…...

Python 网络爬虫与数据采集(一)

Python 网络爬虫与数据采集 第1章 序章 网络爬虫基础1 爬虫基本概述1.1 爬虫是什么1.2 爬虫可以做什么1.3 爬虫的分类1.4 爬虫的基本流程1.4.1 浏览网页的流程1.4.2 爬虫的基本流程 1.5 爬虫与反爬虫1.5.1 爬虫的攻与防1.5.2 常见的反爬与反反爬 1.6 爬虫的合法性与 robots 协议…...

2023年6月DAMA-CDGP数据治理专家认证请尽快报名啦!

目前6月DAMA-CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; 5月初&#xff0c;…...

STM32+esp8266,让你的STM32开发板连接网络-----esp8266

分享一下&#xff0c;STM32开发板连接网络的第一种方法&#xff1a;连接esp8266。 esp8266与STM32利用串口通信连接&#xff0c;esp8266连接网络&#xff0c;把收到的数据通过串口的方式传输给STM32&#xff0c;之后STM32接收到消息做出对应的反应。 使用到的开发板如图&…...

分布式缓存的基础知识

前言 现代互联网应用中&#xff0c;分布式缓存成为了必不可少的一环。它通过在多台服务器之间共享数据&#xff0c;避免了网络通信的高延迟和低带宽的性能问题。本文将介绍分布式缓存的基础知识&#xff0c;包括缓存机制、常见的缓存策略以及缓存的使用场景。 缓存机制 缓存是…...

Vue3通透教程【七】生命周期函数

文章目录 🌟 写在前面🌟 生命周期钩子函数🌟 组合式API生命周期🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选…...

《“裸奔”时代的网络防护:如何保护你的隐私和数据安全》

一、引言 在此时此刻&#xff0c;你可能正在使用电子设备阅读这篇文章。你可能在一天中的大部分时间都在与网络世界互动&#xff0c;无论是通过电子邮件、社交媒体、在线购物&#xff0c;还是通过流媒体服务消费内容。然而&#xff0c;你有没有考虑过&#xff0c;当你在享受这些…...

mapreduce优化方法

1&#xff09;数据输入&#xff1a; 1&#xff09;合并小文件&#xff1a;在执行mr任务前将小文件进行合并&#xff0c;大量的小文件会产生大量的map任务&#xff0c;增大map任务装载次数&#xff0c;而 任务的装载比较耗时&#xff0c;从而导致 mr 运行较慢。 2&#xff09;…...

06-nexus搭建Docker私仓

使用nexus创建docker私有仓库 Nexus的安装请参考该文档&#xff1a;https://www.yuque.com/tmfl/pom/uumrx2 Nexus配置Docker仓库步骤&#xff1b; nexus默认docker是失效的&#xff0c;需要 在security --> Realms&#xff0c;将docker配置成Active在 Repository 的 Blo…...

【RS专题】eval层混淆和逻辑完整分析 - 扣代码终结篇

如有侵权、联系本人下架 首先明确一下目标,我们要先获取网页200的源代码,RS5代第一次响应为412,第二次为200。如果是200就表示正常 以下为某 yjj RS5请求成功的结果,具体流程请看完文章,源-码–答-案也会在末 尾公 布 前面是定义了非常多和函数,一直往下拉,直到出现v…...

基于matlab使用主动声纳系统进行水下目标检测

一、前言 此示例演示如何模拟具有两个目标的主动单基地声纳方案。声纳系统由各向同性投影仪阵列和单个水听器元件组成。投影仪阵列呈球形。反向散射信号由水听器接收。接收到的信号包括直接和多路径贡献。 二、水下环境 在浅水环境中&#xff0c;声源和目标之间存在多个传播路径…...

[socket]hpsocket-pull模式

为什么要用pull模式呢&#xff0c;我不是所谓的别人说pull效率高&#xff0c;是因为包头的长度 int不是固定长度。服务器IO-HPSocket PUSH&#xff1a;收到数据立马触发OnReceive&#xff0c;由开发人员自己实现拆包和缓冲区的管理逻辑。 PULL&#xff1a;收到数据立马触发OnR…...

数据分析师 ---- SQL强化(3)

数据分析师 ---- SQL强化(3) 题目&#xff1a;每个月Top3的周杰伦歌曲 从听歌流水中找到18-25岁用户在2022年每个月播放次数top 3的周杰伦的歌曲 输入例子&#xff1a; drop table if exists play_log; create table play_log (fdate date,user_id int,song_id int ); inser…...

微信小程序商品分类页最佳实践

首先我们来分析下UI小妹发来的产品原型图&#xff1a; 微信小程序商品分类页需要实现 1.单击左边的商品类目&#xff0c;右侧实现联动跳转到对应商品类目标题&#xff1b; 2.触屏拖动右侧商品列表&#xff0c;右侧跳转到对应商品类目&#xff1b; 2.分析需求我们可以把屏幕分…...

正则化解决过拟合

本片举三个例子进行对比&#xff0c;分别是&#xff1a;不使用正则化、使用L2正则化、使用dropout正则化。 首先是前后向传播、加载数据、画图所需要的相关函数的reg_utils.py&#xff1a; # -*- coding: utf-8 -*-import numpy as np import matplotlib.pyplot as plt impor…...

Vue 3.4 defineModel实战:5分钟教你封装一个带.trim和.number的智能输入框

Vue 3.4 defineModel实战&#xff1a;5分钟封装智能输入框组件 在表单交互开发中&#xff0c;输入框处理用户数据时经常需要基础格式处理——比如自动去除首尾空格、将字符串转为数字。传统方案需要在每个使用处手动调用.trim()或parseFloat()&#xff0c;既重复又容易遗漏。Vu…...

Flux.1-Dev深海幻境在网络安全领域的应用:恶意流量日志可视化分析

Flux.1-Dev深海幻境在网络安全领域的应用&#xff1a;恶意流量日志可视化分析 每天&#xff0c;安全运维中心的告警大屏上&#xff0c;成千上万条日志像瀑布一样滚动。分析师小李紧盯着屏幕&#xff0c;试图从这些密密麻麻的IP地址、端口号和状态码中&#xff0c;分辨出一次真…...

亚马逊 API 签名认证机制详解

在调用亚马逊开放平台、亚马逊云服务&#xff08;AWS&#xff09;各类 API 时&#xff0c;签名认证是请求合法的核心门槛&#xff0c;目前主流采用 Signature Version 4&#xff08;SigV4&#xff09; 签名机制。它通过对请求内容与密钥做加密计算&#xff0c;实现身份校验、防…...

DW_apb_uart初始化全流程解析:从时钟门控到中断配置的15个关键步骤

DW_apb_uart深度初始化指南&#xff1a;从寄存器配置到中断优化的15个实战要点 在嵌入式系统开发中&#xff0c;UART通信作为最基础却又最关键的接口之一&#xff0c;其稳定性和性能直接影响整个系统的可靠性。DW_apb_uart作为业界广泛使用的高性能UART IP核&#xff0c;其初始…...

浏览器插件开发:OpenClaw+GLM-4.7-Flash增强网页交互

浏览器插件开发&#xff1a;OpenClawGLM-4.7-Flash增强网页交互 1. 为什么需要智能化的浏览器插件&#xff1f; 在日常网页浏览中&#xff0c;我们经常会遇到这样的场景&#xff1a;看到一篇长文想快速提取核心观点&#xff0c;或者需要将网页内容与本地文件进行联动处理。传…...

PX4串口通讯避坑指南:从波特率设置到数据收发全流程解析(以Serial4/5为例)

PX4串口通讯实战指南&#xff1a;从硬件配置到数据交互的深度解析 在无人机和机器人开发领域&#xff0c;PX4作为一款开源的飞控系统&#xff0c;其串口通讯功能是实现传感器数据采集、地面站通信以及外设控制的核心技术。然而&#xff0c;许多开发者在实际项目中常会遇到数据丢…...

从MobileNet到FasterNet:一个ARM安卓开发者的轻量级模型选型与部署实战笔记

从MobileNet到FasterNet&#xff1a;ARM安卓开发者的轻量级模型选型与部署实战 在移动端AI应用开发中&#xff0c;模型选型往往是一场精度与速度的博弈。作为一名长期奋战在ARM平台部署一线的工程师&#xff0c;我经历过太多次这样的场景&#xff1a;产品经理要求"既要实时…...

解锁B站资源:BilibiliDown高效视频下载全方案

解锁B站资源&#xff1a;BilibiliDown高效视频下载全方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibi…...

Z-Image-Turbo_Sugar脸部Lora模型轻量化:基于.NET框架的推理引擎封装

Z-Image-Turbo_Sugar脸部Lora模型轻量化&#xff1a;基于.NET框架的推理引擎封装 最近在做一个C#的桌面工具&#xff0c;需要集成一个AI换脸功能。网上找了一圈&#xff0c;发现Z-Image-Turbo_Sugar这个脸部Lora模型效果不错&#xff0c;但官方只提供了Python的推理脚本。对于…...

StructBERT情感分类实操手册:自定义示例文本添加方法

StructBERT情感分类实操手册&#xff1a;自定义示例文本添加方法 1. 引言&#xff1a;为什么需要自定义示例&#xff1f; 当你第一次打开StructBERT情感分类的Web界面&#xff0c;可能会觉得它已经内置了不少例子&#xff0c;用起来挺方便。但用着用着&#xff0c;你就会发现…...