【微服务】七. http客户端Feign

7.1 基于Feign远程调用

RestTimeplate方式调用存在的问题

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

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

存在下面的问题:

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

Feign的介绍

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面的问题。

定义和使用Feign客户端
使用Feign的步骤如下:

  • 引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在order-service的启动类添加注解开启Feign的功能:
@EnableFeignClients  -- 开启feign注解
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplicationpublic class OrderApplication{public static void main(String[] args){SpringApplication.run(OrderApplication.class,args);}}
  • 编写Feign客户端
@FeignClient("userservice")
public interface UserClient{@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

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

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User
  1. 用Feign客户端代替RestTemplate
@Autowired
private UserClient userClient;public Order queryOrderById(Long orderId){// 1. 查询订单Order order = orderMapper.findById(orderId);// 2. 利用Feign发起http请求,查询用户User user = userClient.findById(order.getUserId());// 3. 封装User到Orderorder.setUser(user);// 4. 返回return order; 
}

实际操作:
基于feign远程调用实际操作
feign集成了ribbon,已经实现了负载均衡
fegin集成了ribbon实现了负载均衡

总结

Feign的使用步骤:

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

7.2 自定义feign配置

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

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

一般我们需要配置的就是日志级别。
配置Feign日志有两种方式:
方式一:配置文件方式
全局生效:

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

局部生效:

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

方式二:java代码配置,需要先声明一个Bean

public class FeignClientConfiguration{@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC;  // 引入的包: feign.Logger}
}

而后,如果是全局配置,则把它放到@EnableFeignClients这个注解中:(加到启动类上)

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class);

如果是局部配置,则把它放到@FeignClient这个注解中:(加到具体的client接口上)

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

总结

Feign的日志配置:

  1. 方式一是配置文件,feign.client.config.xxx,loggerLevel
  • 如果xxx是default则代表全局
  • 如果xxx是服务名称,例如userservice则代表某服务
  1. 方式二是java代码配置Logger.Level这个Bean
  • 如果是在@EnableFeignClients注解声明则代表全局
  • 如果在@EnableClient注解中声明则代表某服务

7.3 Feign的性能优化

7.3.1 Feign底层的客户端实现:

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

7.3.2 Feign的性能优化–连接池配置

Feign添加HttpClient的支持
引入依赖:

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

配置连接池:

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

真实业务中要对程序进行压测,来具体确定max-connections、max-connections-per-route的值

总结:

Feign的优化:

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

7.4 Feign最佳实践分析

方式一(继承):

给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
feign最佳实践方式一
一般我们不推荐客户端和服务端之间共享一个interface,因为会造成紧耦合,而且对spring mvc不起作用

  • 服务紧耦合
  • 父接口参数列表中的映射不会被继承

方式二(抽取):

将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有的消费者使用
feign最佳实践方式二
降低了耦合度,但是如果order-service只用feign-api中的两三个接口,需要把feign-api的所有都加载出来。

总结

Feign的最佳实践

  1. 让controller和FeignClient继承同一接口
  2. 将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用

7.5 实践:抽取FeignClient

抽取FeignClient

实现最佳实践方式二的步骤如下:

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

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

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

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

5.重启测试

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

方式一:指定FeignClient所在包(将所有的都拿过来)

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

方式二:指定FeignClient字节码(只拿UserClient)

@EnableFeignClients(clients = {UserClient.clss})

总结

不同包的FeignClient的导入有两种方式:

1.在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包

2.在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码

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

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

相关文章

11-Webpack模块打包工具

01.什么是 Webpack 目标 了解 Webpack 的概念和作用&#xff0c;以及使用 讲解 Webpack 是一个静态模块打包工具&#xff0c;从入口构建依赖图&#xff0c;打包有关的模块&#xff0c;最后用于展示你的内容 静态模块&#xff1a;编写代码过程中的&#xff0c;html&#xf…

Python实现AES算法和国密SM4算法

本文主要介绍使用AES加密算法的Python实现和shell脚本实现、SM4国密算法的Python实现。Python使用pycryptodome实现AES加解密、使用GmSSL实现SM4加解密算法&#xff1b;Shell脚本使用openssl实现AES加解密&#xff0c;详细见下文。 1、Python实现加密和解密 1.1 Python实现AES…

Python 自动化测试框架unittest与pytest的区别

引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主…

广州华锐互动:VR动物解剖实验室带来哪些便利?

随着科技的不断发展&#xff0c;我们的教育方式也在逐步变化和进步。其中&#xff0c;虚拟现实(VR)技术的应用为我们提供了一种全新的学习方式。尤其是在动物解剖实验中&#xff0c;VR技术不仅能够增强学习的趣味性&#xff0c;还能够提高学习效率和准确性。 由广州华锐互动开发…

亘古难题——前端开发or后端开发

一、引言 前端开发 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。 前端开发从网页制作演变而来&#xff0c;名称上有很明显的时…

Linux安装 spark 教程详解

目录 一 准备安装包 二 安装 scala 三 修改配置文件 1&#xff09;修改 workers 文件 2&#xff09;修改 spark-env.sh文件 四 进入 spark 交互式平台 一 准备安装包 可以自行去 spark 官网下载想要的版本 这里准备了 spark3.1.2的网盘资源 链接: https://pan.baidu.com…

华为数通方向HCIP-DataCom H12-831题库(单选题:201-220)

第201题 DHCP Snooping是一种DHCP安全特性,这项技术可以防御以下哪些攻击? A、DHCP Server仿冒者攻击 B、针对DHCP客户端的畸形报文泛洪攻击 C、仿冒DHCP报文攻击 D、DHCP Server的拒绝服务攻击 答案:ABD 解析: 第202题 两台PE之间通过MP-BGP传播VPNv4路由,以下哪些场景…

高德地图开发实战案例:实现信息弹出框的富文本展示效果

marker.content "<p classcardsBg></p>";.cardsBg {width: 246px;height: 426px;background: url(../images/cards.png) no-repeat center center; }其中cards.png为整个弹出模态框的背景图片&#xff0c;做到这一步。仍旧会自带高德地图的样式&#xf…

【网络安全 --- kali2023安装】超详细的kali2023安装教程(提供镜像资源)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

微服务学习(十):安装Maven

微服务学习&#xff08;十&#xff09;&#xff1a;安装Maven 1、下载Maven 官网下载 2、将下载后的资源包上传到服务器 3、解压资源包并安装 tar -zxvf apache-maven-3.9.5-bin.tar.gz4、配置环境变量 vi /etc/profileexport MAVEN_HOME/home/maven/apache-maven-3.9.5 …

Linux系统之部署h5ai目录列表程序

Linux系统之部署h5ai目录列表程序 一、h5ai介绍1.1 h5ai简介1.2 h5ai特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、安装httpd软件4.1 检查yum仓库4.2 安装httpd软件4.3 启动httpd服务4.4 查看htt…

java Spring Boot整合jwt实现token生成

先在 pom.xml 文件中注入依赖 <!-- JWT --> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version> </dependency> <dependency><groupId>io.jsonw…