【Feign】 基于 Feign 远程调用、 自定义配置、性能优化、实现 Feign 最佳实践

news2024/11/18 7:34:59

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
SpringCloud
MybatisPlus
JVM

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


Feign

  • 一、 基于 Feign 远程调用
    • 1.1 RestTemplate方式存在的问题
    • 1.2 Feign 的介绍
    • 1.3 定义和使用Feign客户端
  • 二、 自定义配置
    • 2.1 配置Feign日志(配置文件方式)
    • 2.2 配置Feign日志(Java代码方式)
  • 三、 性能优化
    • 3.1 Feign 底层客户端实现
    • 3.2 Feign的性能优化(连接池配置)
  • 四、 实现 Feign 最佳实践
    • 4.1 新建module,命名feign-api,然后引入feign的starter依赖
    • 4.2 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
    • 4.3 在order-service中引l入feign-api的依赖
    • 4.4 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

一、 基于 Feign 远程调用

1.1 RestTemplate方式存在的问题

之前利用RestTemplate发起远程调用需要拼接字符串的形式传递url地址,通过这个url地址指明服务名称和请求路径以及请求参数信息,然后传递请求方式和返回值类型,由RestTemplate向这个指定地址发起请求,再把这个结果转成对应类型。

String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

通过RestTemplate发送http请求的方式代码可读性差,编程体验不统一,若是参数非常多就会导致URL参数复杂,难以维护。

1.2 Feign 的介绍

Feign 是一个声明式的http客户端,声明式就相当于MySQL中的事务一样,在Spring中要开启事务,不需要手动打开或关闭,只需要在配置文件中声明事务,Spring就会自动实现事务,同样声明式http客户端也是如此,Feign可以帮助我们优雅的实现http请求的发送。

1.3 定义和使用Feign客户端

  • 1.引入依赖
<!--feign客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 2.在启动类添加注解@EnableFeignClients开启Feign功能
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}
  • 3.编写Feign客户端
@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

  • 4.发送http请求
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.用feign远程调用
        User user = userClient.findById(order.getUserId());
        //封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

二、 自定义配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

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

一般配置的只是日志级别

2.1 配置Feign日志(配置文件方式)

打开服务的配置文件,添加Feign的配置

  • 全局生效:
feign:
  client:
    config:
      default:	# 默认全局配置
        loggerLevel: FULL	# 打开全部日志
  • 局部生效:
feign:
  client:
    config:
      userservice:	# 针对 userservice 服务
        loggerLevel: FULL	# 打开全部日志

2.2 配置Feign日志(Java代码方式)

  • 声明bean
public class FeignClientConfiguration {
    @Bean
    public Logger.Level logLevel() {
        return Logger.Level.BASIC;
    }
}
  • 若是全局配置,则把它放到@EnableFeignClients这个注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
  • 若是局部配置,则把它放到@FeignClient这个注解中
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)

三、 性能优化

3.1 Feign 底层客户端实现

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池
    优化Feign的性能主要包括:
    1. 使用连接池代替潜默认的URLConnection
    1. 日志级别,最好用 basic 或 none

3.2 Feign的性能优化(连接池配置)

  • Feign中添加HttpClient的支持,引入依赖:
<!--引入HttpClient依赖-->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>
  • 配置连接池:
feign:
  client:
    config:
      default:  # 默认全局配置
        loggerLevel: BASIC  # 日志级别,BASIC是最基本的请求和响应
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径最大连接数

四、 实现 Feign 最佳实践

4.1 新建module,命名feign-api,然后引入feign的starter依赖

  • 新建模块:

在这里插入图片描述


在这里插入图片描述


  • 引入feign的starter依赖:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <version>2.2.1.RELEASE</version>
</dependency>>

4.2 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中


在这里插入图片描述


在这里插入图片描述


4.3 在order-service中引l入feign-api的依赖

<!--引入统一feign-api-->
<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

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

import cn.itcast.feign.pojo.User;
import cn.itcast.feign.clients.*;
  • 当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
  • 方式一:指定FeignClient)所在包
@EnableFeignClients(basePackages = "cn.feign.clients")
  • 方式二:指定FeignClient字节码(推荐)
@EnableFeignClients(clients = UserClient.class)

在这里插入图片描述


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

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

相关文章

MySQL 教程 1.1

MySQL 教程1.1 MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 在本教程中&#xff0c;会让大家快速掌握 MySQL 的基本知识&#xff0c;并轻松…

数字IC前端学习笔记:异步复位,同步释放

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 异步复位 异步复位是一种常见的复位方式&#xff0c;可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误&#xff0c;复位释放便是…

分组表,分桶表

1&#xff0c;启动Hive服务 &#xff08;1&#xff09;启动HiveServer2服务 nohup hive --service metastore &&#xff08;2&#xff09;启动Metastore服务 nohup hive --service hiveserver2 &&#xff08;3&#xff09;查看进程信息 lsof -i:100002&#xff0c;…

hologres 索引与查询优化

hologres 优化部分 1 hologres 建表优化1.1 建表中的配置优化1.1 字典索引 dictionary_encoding_columns1.2 位图索引 bitmap_columns1.2.2 Bitmap和Clustering Key的区别 1.3 聚簇索引Clustering Key 1 hologres 建表优化 1.1 建表中的配置优化 根据 holo的 存储引擎部分的知…

公共字段自动填充-@TableField的fill实现(2)

TheadLocal 客户端发送的每次http请求&#xff0c;在服务端都会分配新的线程。因此登录检查过滤器、controller、元数据对象处理器属于一个线程。 TheadLocal是线程的局部变量&#xff1a; TheadLocal常用方法&#xff1a; 如何在元数据对象处理器中获取当前登录用户的id&…

力扣hot100 两数之和 哈希表

&#x1f468;‍&#x1f3eb; 力扣 两数之和 &#x1f60b; 思路 在一个数组中如何快速找到某一个数的互补数&#xff1a;哈希表 O(1)实现⭐ AC code class Solution {public int[] twoSum(int[] nums, int target){HashMap<Integer, Integer> map new HashMap<&g…

shell脚本学习笔记07

如何让shell实现 可选择性执行 的功能 用了while进行循环&#xff0c;是死循环&#xff0c;在循环时&#xff0c;使用case进行使用哪个脚本进行执行。使用clear进行每一次操作前的清屏&#xff0c;eof代表输入这个会显示目录。read用来读取输入的值&#xff0c;如果不输入值不会…

初始ProtoBuf

目录​​​​​​​ ⼀、初识ProtoBuf 1. 序列化概念 2. ProtoBuf是什么 3. ProtoBuf的使用特点 ⼆、安装ProtoBuf 1、ProtoBuf在window下的安装 2、ProtoBuf在Linux下的安装 ⼀、初识ProtoBuf 1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列…

【开源】基于Vue.js的高校实验室管理系统的设计和实现

项目编号&#xff1a; S 015 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S015&#xff0c;文末获取源码。} 项目编号&#xff1a;S015&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

LeetCode【12】整数转罗马数字

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/m0_71120708/article/details/128769894 代码&#xff1a; public String intToRoman(int num) {String[] thousands new String[] {"", "M", "MM", "MMM"};String[] hun…

【C++历练之路】list的重要接口||底层逻辑的三个封装以及模拟实现

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 在C的世界中&#xff0c;有一种数据结构&#xff0c;它不仅像一个神奇的瑰宝匣&#xff0c;还像一位能够在数据的海洋中航行的智慧舵手。这就是C中的list&#xff0c;一个引人入胜的工具…

千梦网创:外貌与内貌

一、怎样提高身价&#xff1f; 同样的商品或服务怎样卖得更贵&#xff1f; 要么通过更贵的渠道、要么通过更好的包装。 水还是那个水&#xff0c;放在星巴克可以卖很贵&#xff0c;印上不同的logo可以卖不同的价格。 拿线下的教育培训行业来说&#xff0c;真正让你去测评哪…

保险保险保险保险保险QAQ

该买保险啦&#xff01; 一、百万医疗险&#xff1a;事后报销医疗费用1、蓝医保 太平洋保险2、长相安 平安健康3、金医保 人寿保险4、好医保 人保健康 二、重疾险&#xff1a;确诊后一次性给付1、达尔文7号 国联人寿保险公司2、超级玛丽9号 君龙人寿3、守卫者6号 国联人寿保险公…

Sql Server 2017主从配置之:发布订阅

使用发布订阅模式搭建Sql Server 2017主从同步&#xff0c;类似事件通知机制&#xff0c;基本可以做到准实时同步&#xff0c;可以同时做到一对多的数据同步。 不过发布订阅模式&#xff0c;只能同时数据&#xff0c;不能同步表结构。在创建发布的时候&#xff0c;需要选择需要…

SpringBoot 整合 JdbcTemplate

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

ARM CoreLink CCN 互连总线介绍

NIC NOC CCI CMN CNN NI cmn-700 nic-700 ni-700 MLGB这都是啥玩意? 后期博文或视频将会更新这一系列。今天先温习一下CNN的概念,这是来自2014年的文章,然后稍微整理总结一番。 以下是正文… 现代主流和优质 ARM 片上系统 (SoC) 产品使用 CoreLink 缓存一致性网络 (CCN) 504…

论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models

Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型&#xff0c;擅长将文本输入转换为数字表示&#xff0c;捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发&#xff0c;从创建高质量的成对&#xff08;pairwi…

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8&#xff0c;在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz)&#xff0c;系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下&#xff0c;进入…

PCL 计算一条射线与一个三角形的交点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里我们使用点向式分别表示一个射线与一个三角形,如下图所示: 其中,平面的法向量 N N N可以由三角形两条边的叉乘来计算,点R0到平面的法向距离

PPT基础:合并形状

目录 合并形状功能详解合并形状使用文字转形状图表转形状 合并形状功能详解 形状&#xff1a;并不局限于ppt内给定的图形&#xff0c;也并不全是图形 &#xff08;1&#xff09;所在位置&#xff1a;选中图形后>>>形状格式>>>最左边 &#xff08;2&#x…