【Springcloud】Feign远程调用

news2024/11/18 12:36:02

文章目录

  • 1、RestTemplate远程调用
  • 2、基于Feign远程调用
  • 3、Feign的自定义配置
  • 4、Feign性能优化
  • 5、Feign的最佳实践思路
  • 6、案例

1、RestTemplate远程调用

在说基于Feign远程调用之前,先看一下RestTemplate发起远程调用的问题:

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

url路径在代码中拼接,对于复杂的URL,这样难以维护。

2、基于Feign远程调用

Feign是一个声明式的http客户端,即声明出调谁、什么方式、参数是啥、返回类型是啥就好。调用的事有Feign帮你做。

官方地址:https://github.com/OpenFeign/feign

在这里插入图片描述

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

Feign的使用步骤:
  • 引入依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在对应的服务启动类添加注解@EnableFeignClients开启Feign功能
//在order的启动类中开启Feign
@EnableFeignClients
@MapperScan("com.llg,order.mapper")
@SpringBootApplication
public class OrderApplication{
	
	public static void main(String[] args){
		SpringApplication.run(OrderApplication.class,args);
	}
}
  • 编写Feign客户端,即在调用方声明接口
("userservice")
public interface UserClient{
	("/user/{id}")
	User findById(("id") Long id);
}
# 方法名随便起
# 路径、服务名、参数、返回类型声明正确就行
主要是基于SpringMVC的注解来声明远程调用的信息,比如:

➢服务名称:userservice

➢请求方式:GET

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

➢请求参数:Long id

➢返回值类型:User
  • 声明完成后,注入FeignClient类,直接调用声明的那个方法
@Autowired
private UserClient userClient;

public Order queryOrderById(Long orderId){
	//查询订单
	Order order = orderMapper.findById(orderId);
	//利用feign发起http请求,查用户
	User user = userClient.findById(order.getUserId());
	//封装,对象的某个属性也是个对象,即引用类型
	order.setUser(user);
	return order;
} 
  • 最后,Feign已经集成了负载均衡,用户无需额外操作

在这里插入图片描述

3、Feign的自定义配置

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

在这里插入图片描述
自定义Feign有两种方式:

配置文件方式:

①全局生效:

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

②局部生效:

feign:
  client:
    config:
      userservice:   # 这里写服务名称,则是针对某个微服务的配置,只有远程调用userservice,日志级别才是FULL
        loggerLevel: FULL  # 日志级别

Java代码声明Bean

在config目录下加个配置类,类中声明个Bean

public class FeignClientConfiguration {
	@Bean
	public Logger.Level feignLogLevel(){
		return Logger.Level.BASIC;
	}
}

如果想全局生效,则将配置类加在@EnableFeignClients注解中

//启动类
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

想局部生效,则加在@FeignClient注解中

@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)
public interface UserClient{
	@GetMapping("/user/{id}")
	User findById(@PathVariable("id") Long id);
}

4、Feign性能优化

Feign性能调优的两个主要方向是:

  • ①使用连接池代替默认的URLConnection
  • ②日志级别,最好用basic或none
Feign底层的客户端实现默认用URLConnection实现,不支持连接池,可改为:

- Apache HttpClient:支持连接池

- OKHttp:支持连接池

以HttpClient为例:

  • 引入HttpClient的依赖
<!--httpClient的依赖-->
<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign-httpclient</artifactId>
</dependency>
  • 修改application.yaml,配置连接池
feign:
  client:
    config:
      default:   # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true #开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50#每个路径的最大连接数

5、Feign的最佳实践思路

思路一:继承

给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。这个父接口就像是一个契约。

在这里插入图片描述
但这种方式有缺陷,看官方说明:

在这里插入图片描述

即不推荐在服务端和客户端之间共享接口,因为它会造成紧耦合,而且SpringMVC中,父接口中方法参数继承不下来。

思路二:抽取为独立模块

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

在这里插入图片描述

如上图,之前的写法,有n个服务消费者,就得写n遍FeignClient,重复开发。引入独立模块后:

在这里插入图片描述
服务消费者只需引入FeignClient的模块坐标依赖。这个依赖里定义了所有的远程调用接口。

6、案例

以上思路二的实现:

➢ 首先创建一个module,命名为feign-api,然后引入feign的starter依赖

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

➢重启测试

报错:xxxService required a bean of type 'com.feign.client.UserClient'  that could not be found.

报错分析:

在这里插入图片描述
有UserClient这个类,但是无法注入成功,因为这个类没有创建对象,在Spring的容器里找不到这个Bean。

====>

之前没单独抽出Feign-api模块时,有UserClient对象,是因为UserClient在扫描范围内,Spring扫描到@FeignClient注解,就会创建对象。但现在扫描不到了。

在这里插入图片描述
orderservice扫描的包是启动类所在的包。

在这里插入图片描述

UserClient所在的包扫描不到,对象不会被创建,Spring容器里没有UserClient的Bean

当定义的FeignClient不在服务调用者的启动类SpringBootApplication的扫描包范围时,这些FeignClient无法使用。 有两种方式解决:

在启动类的@EnableFeignClients注解上加backPackages属性,指定FeignClient所在的包

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

字节码格式直接指定要哪个FeignClient类

@EnableFeignClients(clients = {UserClient.class})

两种解决方式,basePackages属性是把所有的FeignClient加载进来了,而clients属性是要哪个加载哪个,精准加载。

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

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

相关文章

船新SpringBoot 3.1正式发布,新特性真香

Spring Boot 3.1 正式发布 Spring Boot 3.0 发布半年左右&#xff0c;Spring Boot 3.1 正式发布了&#xff1a; 同时发布更新的还有 2.7.x 版本&#xff0c;同时&#xff0c;2.6.x 版本线已经停止维护了&#xff0c;最新支持版本如下图所示&#xff1a; 2.7.x 这也是目前唯一正…

Python条件判断

目录 1. 语法 2. 常见用法 2.1. 比较符判断 2.2. 逻辑符判断 2.3. 成员符判断 2.4. 三目运算 1. 语法 记住3个关键字&#xff1a;if&#xff08;表示如果&#xff09;、elif&#xff08;再如果&#xff09;、else&#xff08;否则&#xff09; if [条件1]&#xff1…

数据链路层概述

1.数据链路层概述 笔记来源&#xff1a; 湖科大教书匠&#xff1a;数据链路层概述 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 数据链路层在网络体系结构中的地位 主机具有体系结构的各个层次&#xff0c;路由器只需具有体系就够的最下面三…

chatgpt赋能python:Python“+”-了解Python中最常用的运算符

Python “” - 了解Python中最常用的运算符 Python是一种高级编程语言&#xff0c;用于开发各种应用程序&#xff0c;从Web应用和桌面应用到数据分析和科学计算。Python是一种简单易学&#xff0c;可读性强的语言&#xff0c;拥有丰富的库和工具。 在Python中&#xff0c;“”…

桥接模式解密:跨越鸿沟,桥接抽象与实现

一、概要 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们都可以独⽴的变化。其核心思想就是解耦&#xff0c;在面向对象编程中&#xff0c;抽象和实现是通过继承关系来实现的&#xff0c;但这…

《C和指针》读书笔记(第八章 数组)

目录 0 内容简介1. 一维数组1.1 数组名1.2 下标引用1.3 指针与下标1.4 指针的效率1.5 数组和指针1.6 作为函数参数的数组名1.7 声明数组参数1.8 初始化1.9 不完整的初始化1.10 自动计算数组长度1.11 字符数组的初始化 2. 多维数组2.1 存储顺序2.2 数组名2.3 下标2.4 指向数组的…

爆火出圈的chatGPT,到底是什么东东?

爆火出圈的chatGPT&#xff0c;到底是什么东东&#xff1f; 前言 2022年 11 月 30 日&#xff0c;OpenAI 实验室创始人兼 CEO Sam Altman 宣布发布聊天机器人模型&#xff1a;ChatGPT。ChatGPT 可以模仿人类的说话风格回答问题。很快&#xff0c;ChatGPT 火爆社交圈&#xff…

Linux音频和视频命令速查表

在Linux系统中&#xff0c;有许多命令可以帮助我们处理音频和视频文件&#xff0c;从基本的播放和转码&#xff0c;到编辑和处理音频、视频流。 本文将提供一个Linux音频和视频命令速查表&#xff0c;帮助您快速查找并了解各种常用的命令及其用法。 音频命令 播放音频文件 a…

堆和堆排序

目录 堆的概念 堆的实现 堆的存储结构 堆的插入操作 堆的删除操作 堆的创建 向上调整建堆和向下调整建堆 堆排序 堆的应用 - topK问题 堆的概念 “堆”是计算机科学中一种数据结构&#xff0c;可以看作是一棵完全二叉树。通常满足堆的性质&#xff1a;父节点的值总是…

【Linux】进程控制 — 进程程序替换 + 实现简易shell

文章目录 &#x1f4d6; 前言1. 进程程序替换1.1 程序替换的概念&#xff1a;1.2 为什么要程序替换&#xff1a;1.3 程序替换的原理&#xff1a; 2. 六个exec替换函数2.1 execl函数&#xff1a;2.2 execv函数&#xff1a;2.3 execlp函数&#xff1a;2.4 execvp函数&#xff1a;…

chatgpt赋能python:Python[:2]——简介和应用

Python [:2]——简介和应用 Python [:2]是一种流行的编程语言&#xff0c;其简单易用的语法使其成为许多人的首选编程语言之一。Python [:2]的迅速增长已经超越了其他编程语言&#xff0c;并且它正在成为各行各业中最有前途的编程语言之一。 Python 基础 Python [:2]的语法非…

MSQL系列(三) Mysql实战-索引最左侧匹配原则原理

Mysql实战-索引最左侧匹配原则原理 前面我们讲解了索引的存储结构&#xff0c;我们知道了BTree的索引结构&#xff0c;索引的叶子节点是严格排序的&#xff0c;就像你看到的 底层叶子节点 15->18->20->30->49->50等等 这样做有什么好处呢&#xff1f; 这就引出…

利用qsort排序

一、简单排序10个元素的一维数组 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<stdlib.h> void print_arr(int arr[], int sz) {int i 0;for (i 0; i < sz; i){printf("%d ", arr[i]);}printf("…

WMS服务启动

WMS服务启动 1、SystemServer.java#startOtherServices(t)中启动2、WindowManagerService.java#main创建初始化3、简易时序图4、相关线程 1、SystemServer.java#startOtherServices(t)中启动 WMS属于SystemServer启动众多的系统服务中的一个&#xff0c;WindowManagerService中…

社会工程学技术框架解读

社会工程学技术其实就是利用各种心理进行技术上的欺骗。 尽管许多社会工程学大师都是无师自通,依赖自己的天赋悟性、聪明才智和临场应变能力不断演绎着社会工程学艺术,然而,社会工程学仍然具有一些通用的技术流程与共性特征。Social-Engineer 网站创始人克里斯哈德纳吉对其加…

Spring Cloud Alibaba 快速上手搭建公司项目(二)Nacos

Nacos(全称为&#xff1a;阿里巴巴开源项目 - 命名服务 & 配置中心)是阿里巴巴集团开源的一个动态服务发现、配置管理和服务管理平台。它提供了一种简单易用的方式来管理和监控微服务应用程序中的服务实例、配置和元数据。 Nacos是一个高度可扩展的平台&#xff0c;支持多…

chatgpt赋能python:Python中的[::-1]操作:反转列表、元组和字符串

Python中的[::-1]操作&#xff1a;反转列表、元组和字符串 在Python编程中&#xff0c;[::-1]是一个相当常用的操作符&#xff0c;它可以对列表、元组、字符串等序列类型进行反转。本文将详细介绍这个操作符的语法和使用方法&#xff0c;并且为您提供一些在实际应用中的例子。…

css浮动特性

1. 传统网页的三种布局方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

类和对象【3】初始化列表

全文目录 引言初始化列表定义特性 总结 引言 上一篇文章中介绍了构造函数&#xff0c;它可以在实例化一个类对象的时候自动调用&#xff0c;以初始化类对象&#xff1a; 戳我看默认成员函数详解 但是&#xff0c;不难发现&#xff0c;在构造函数体中对成员变量的初始化其实是属…

武汉环保门禁电子台账视频监控系统

武汉环保门禁电子台账视频监控系统&#xff0c;是顺应国家政策需求&#xff0c;基于视频监控、环保门禁系统、物联技术&#xff0c;结合大数据和人工智能等技术手段&#xff0c;对汽车排放单位进行环境管理的一套综合系统。 系统介绍 该系统实现对机动车排放检测的监管&#…