SpringCloud(七) Feign远程调用

目录

一, RestTemplate远程调用存在的问题

二, Feign的远程调用

2.1 什么是Fegin

2.2 Feign的使用(代替RestTemplate)

1. 引入依赖

2. 添加注解 

3. 编写Feign的客户端

4. 测试

5. 总结 

2.3 自定义配置

1. 配置文件方式 

2. Java代码方式 

三, Feign使用优化

3.1 使用连接池

1. 引入依赖

2. 配置连接池

3. 总结

3.2 抽取Feign的Client模块进一步优化

1. 抽取 

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

3. 重启测试

4. 解决扫描包问题 


一, RestTemplate远程调用存在的问题

SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用-CSDN博客

在这篇博客中我们学会了如何使用RestTemplate实现微服务之间的远程调用,我们来看一下利用RestTemplate发起远程调用的代码:

这种方式存在以下的问题:

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

所以引入了Feign帮我们解决上述问题,使得远程调用的代码更加优雅.

二, Feign的远程调用

2.1 什么是Fegin

Fegin是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

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

2.2 Feign的使用(代替RestTemplate)

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的OrderController类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

5. 总结 

使用Feign的步骤:

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

2.3 自定义配置

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

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

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可,下面以日志为例来演示如何自定义配置.

1. 配置文件方式 

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

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

也可以针对所有服务:

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

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值
  • Basic:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASCI的基础上,额外记录了请求和响应头信息
  • FULL:记录所有请求和响应的明细,包括头信息,请求体,元数据

以BASIC为例:

先修改配置文件

重新访问查看日志信息 

2. 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使用优化

3.1 使用连接池

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 # 每个路径的最大连接数

此时,启动order-service服务,其底层就是使用的Apache的HttpClient了.

3. 总结

Feign的优化:

  1. 日志级别尽量使用basic
  2. 使用HttpClient或OKHttp代替URLConnection
    1. 引入feign-httpClient依赖
    2. 配置文件开启httpClient功能,设置连接池参数

3.2 抽取Feign的Client模块进一步优化

通过代码我们可以发现,Feign的客户端与服务提供者的controller代码非常相似:

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

答案是肯定的;可以将Feign的Client抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用;例如:将UserClient,User,Feign的默认配置都抽取到一个feign-api包中,所有微服务引入该依赖包,即可直接使用.

 

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. 重启测试

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

这是因为UserController现在在cn.itcast.feign.clients包下,而order-service的@EnableFeignClient注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient.

4. 解决扫描包问题 

方式一:

指定Feign应该扫描的包:

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

方式二:

指定需要加载的Client接口(使用的更多):

@EnableFeignClients(clients = {UserClient.class})

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

我们开发软件系统的时候&#xff0c;需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一&#xff0c;就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能&#xff0c;但是其中存在很多冗余的方法 mgr/medicine.py mgr/k8s.py mgr/medicine.py 打开…

【网络安全 --- 任意文件上传漏洞靶场闯关 6-15关】任意文件上传漏洞靶场闯关,让你更深入了解文件上传漏洞以及绕过方式方法,思路技巧

一&#xff0c;工具资源下载 百度网盘资源下载链接地址&#xff1a; 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan…

NoSQL数据库使用场景以及架构介绍

文章目录 一. 什么是NoSQL&#xff1f;二. NoSQL分类三. NoSQL与关系数据库有什么区别四. NoSQL主要优势和缺点五. NoSQL体系框架 其它相关推荐&#xff1a; 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 架构设计之大数据架构&#xff08;Lambda架构、Kap…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…

你一般会什么时候使用CHATGPT?

在当今数字时代&#xff0c;人们对于人工智能&#xff08;AI&#xff09;的依赖程度日益增加&#xff0c;而ChatGPT作为一种强大的自然语言处理工具&#xff0c;吸引了人们的广泛关注和应用。那么&#xff0c;人一般在什么时候会想要使用ChatGPT呢&#xff1f;这个问题涵盖了多…

GPT与人类共生:解析AI助手的兴起

随着GPT模型的崭新应用&#xff0c;如百度的​1​和CSDN的​2​&#xff0c;以及AI助手的普及&#xff0c;人们开始讨论AI对就业市场和互联网公司的潜在影响。本文将探讨GPT和AI助手的共生关系&#xff0c;以及我们如何使用它们&#xff0c;以及使用的平台和动机。 GPT和AI助手…

【驱动开发】注册字符设备使用gpio设备树节点控制led三盏灯的亮灭

注册字符设备使用gpio设备树节点控制led三盏灯的亮灭 设备树&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int OD…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

5.1 创建和销毁线程

方法 pthread_create(thread, attr, start_routine, arg)pthread_exit(status)pthread_cancel(thread)pthread_attr_init(attr)pthread_attr_destroy(attr) 创建线程 最开始main()程序只有一个默认的线程&#xff0c;其他的线程需要由编程人员显式创建。pthread_create()可以…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

Win10强制卸载更新补丁的三种方法

在Win10电脑中用户发现更新补丁出现问题了&#xff0c;想通过卸载补丁来解决问题。但是&#xff0c;许多新手用户对于强制卸载Win10系统的更新补丁的方法不是很了解&#xff0c;那么下面小编就给大家介绍关于Win10电脑内强制卸载更新补丁的简单方法吧。 方法一&#xff1a;通过…

nodejs express vue 点餐外卖系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;vscode&#xff08;webstorm&#xff09;&#xff0c;大于mysql5.5 技术说明&#xff1a; nodejs express vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索菜品&#xff0c;轮播图&#xf…