SpringCloud学习(六)——Feign的简单使用

文章目录

  • 1. Feign 的使用
    • 1.1 引入依赖
    • 1.2 添加注解
    • 1.3 编写Feign客户端
    • 1.4 测试
  • 2. Feign中的自定义配置
    • 2.1.配置文件方式
      • 2.2.Java代码方式
  • 3. Feign 性能优化
  • 4. Feign的抽取式使用
    • 4.1 抽取配置
    • 4.2 引入依赖
    • 4.3 指明Client

在此之前,我们服务之间需要进行调用的时候使用的restTemplate,代码示例如下:

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

这种方法需要先定义一个url,再使用restTemplate的api向这个路径去发送请求

这种方式不可避免的有一个巨大的缺陷:在实际开发中,一个url会有很复杂的情况出现,参数可能多达几十个,此时要维护一个url将是一件很恐怖的事情。其次,代码的可读性也比较差。

因此,有一种新的方式去发起远程调用,也就是Feign,feign是一种声明式的http客户端,其作用就是帮助开发者轻松的实现远程调用。

1. Feign 的使用

接下来我们以改写在 orderservice 中引用 userservice 中的信息为例,将其 RestTemplate 的方式改写为 Feign 的调用方式。

1.1 引入依赖

首先我们需要引入Feign的依赖,依赖引入如下:

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

1.2 添加注解

随后需要在启动类的前面添加Feign的注解 @EnableFeignClients ,添加如下第一行所示,

@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

可以看到,上述启动类中将原来注入的 RestTemplate 删掉了。

1.3 编写Feign客户端

新建一个 client 的文件夹,在文件夹里创建一个接口 UserClient ,接口下的内容如下:

// 声明服务,即在userservice中访问
@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

在如上代码中,只需要指定服务就能够对服务的功能进行访问,这代表了Fiegn中实现了负载均衡,可以根据服务名指定不同的服务来进行负载。

1.4 测试

使用定义的接口进行测试,测试的代码如下:

@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private UserClient userClient;

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 1. 根据id查询订单并返回
        Order order = orderService.queryOrderById(orderId);
        // 2. 利用Feign发起http请求
        User user = userClient.findById(order.getUserId());
        // 3. 封装User到order
        order.setUser(user);
        return order;
    }
}

2. Feign中的自定义配置

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即可。

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

2.1.配置文件方式

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

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

也可以针对所有服务:

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

而日志的级别分为四种:

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

2.2.Java代码方式

也可以基于Java代码来修改日志级别,先声明一个类,然后声明返回一个Logger.Level的对象来覆盖默认的配置:

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

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

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

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

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

3. Feign 性能优化

Feign的优化我们可以从以下两个方面进行考虑:

  • 改写客户端实现,Feign默认使用的是 URLConnection ,不支持连接池,可以将其改为支持连接池的 Apache HttpClient 或者 OKHttp
  • 改变日志级别。最好使用 basic 或者 none 级别的日志,使效率更大

为了实现上面两个方面的优化,我们需要先引入Feign的HttpClient依赖,

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

之后在 application.yml 中对其进行配置,配置如下:

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

4. Feign的抽取式使用

Fiegn的使用方式有很多,但是,在实际生产过程中,最实用的实现方式还是抽取与继承的使用方式,接下来我们介绍一下抽取的方式。

试想一下,如果我们有很多的服务,都需要调用userservice中的数据,那岂不是说我们在每个服务中都需要写一个用Feign访问userservice的结构,即创建一个client,再使用client的接口来访问。基于此,我们可以使用抽取的方式,将使用的东西抽取成一个模块,当要使用的时候,直接将其当做一个依赖进行使用即可,这样,能够大大的方便我们的访问。

4.1 抽取配置

新建一个空的Maven Module feign-api ,将需要用到的配置全部都从 orderservice 中抽取到 feign-api ,抽取后的目录结构为 :
在这里插入图片描述
至此,除了启动类中的一行注解 ,orderservice 中再没有与Feign相关的配置。

4.2 引入依赖

feign-api 的Module中引入 feign 相关的依赖,如下:

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

orderservice 中引入 feign-api 的依赖如下,

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

4.3 指明Client

按照上面的方式进行操作后,运行时会报错说找不到 UserClient ,这个错误就是在启动类中添加的注解 @EnableFeignClients 找不到 UserClient ,这种时候有两种方式可以解决。

第一种是添加扫描的包,即

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

第二种是指定 UserClient 的字节码,

@EnableFeignClients(client = {UserClient.class})

这里推荐使用第二种方式,缺少哪一个 FeignClient 就对其进行注册,之后就可以进行正常运行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读懂MAC地址

MAC地址是一种用于标识计算机网络设备的唯一地址。它是由48个二进制数字组成的&#xff0c;通常表示为12个十六进制数字&#xff0c;每两个数字之间用冒号或连字符分隔开。MAC地址由设备制造商在生产过程中分配&#xff0c;以确保网络上每个设备都有唯一的标识符。 MAC地址的规…

第11章_常用类和基础API

第11章_常用类和基础API 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串…

【大数据之Hadoop】十七、MapReduce之数据清洗ETL

ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程&#xff0c;目的是将分散、零乱、标准不统一的数据整合到一起&#xff0c;为决策提供分析依据。 ETL的设计分三部分&#xff1a;数据抽取、数据的清洗转换、数据的加载。 1 ETL体系结构 ETL主要是用来实现…

LLM总结(持续更新中)

引言 当前LLM模型火出天际&#xff0c;但是做事还是需要脚踏实地。此文只是日常学习LLM&#xff0c;顺手整理所得。本篇博文更多侧重对话、问答类LLM上&#xff0c;其他方向&#xff08;代码生成&#xff09;这里暂不涉及&#xff0c;可以去看综述来了解。 之前LLM模型梳理 …

龙芯中科官方宣布,龙芯中科企业办公信息化平台全面完成国产化替代

4月4日&#xff0c;龙芯中科官方宣布&#xff0c;龙芯中科企业办公信息化平台全面完成国产化替代。龙芯 ERP 系统全系统使用国产化平台&#xff0c;私有化部署于基于龙芯 3C5000 服务器集群的虚拟化云平台上&#xff0c;使用自研 Loongnix 操作系统、自研 LoongDB 数据库及龙芯…

【SQL Server】无需公网IP,就可以远程连接SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

Redis-----什么是Redis?

什么是Redis&#xff1f; redis是一个基于内存的key-value结构数据库。 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09;企业应用广泛 Redis入门 redis简介 redis是一个开源的内存中的数据结构存储系统&#xff0c;数据库…

哪个洗脱一体机好用?好用的洗拖一体机推荐

洗地机是一款使用非常方便的清洁工具&#xff0c;通常可以实现吸、拖、洗三个功能&#xff0c;对于各类家庭污渍都有着不错的处理能力&#xff0c;无论是干燥垃圾还是潮湿垃圾一律可以有效清理。不过很多新手朋友在选购洗地机时会因为看不懂参数而频繁踩雷。本文为大家整理了洗…

详解语义分割deeplabv3+模型的工业应用流程

来源&#xff1a;投稿 作者&#xff1a;某一个名字 编辑&#xff1a;学姐 导语 在工业视觉应用中&#xff0c;目标检测算法常用于特征的粗定位&#xff0c;而语义分割则在特征的精定位方面有着突出的表现。使用较多的语义分割模型主要有FCN、deeplab系列、unet等&#xff0c;根…

keil5使用c++编写stm32控制程序

keil5使用c编写stm32控制程序 一、前言二、配置图解三、std::cout串口重定向四、串口中断服务函数五、结尾废话 一、前言 想着搞个新奇的玩意玩一玩来着&#xff0c;想用c编写代码来控制stm32&#xff0c;结果在keil5中&#xff0c;把踩给我踩闷了&#xff0c;这里简单记录一下…

【OCR】CTC loss原理

1 CTC loss出现的背景 在图像文本识别、语言识别的应用中&#xff0c;所面临的一个问题是神经网络输出与ground truth的长度不一致&#xff0c;这样一来&#xff0c;loss就会很难计算&#xff0c;举个例子来讲&#xff0c;如果网络的输出是”-sst-aa-tt-e’, 而其ground truth…

深入剖析:如何优化Android应用的性能和内存管理

深入剖析&#xff1a;如何优化Android应用的性能和内存管理 性能和内存管理的重要性 在今天的移动应用开发中&#xff0c;用户对于应用的性能和体验要求越来越高。一款性能卓越的Android应用能够提供流畅的操作体验、快速的响应速度以及较低的资源消耗&#xff0c;从而提高用户…

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

HTML5 Input 类型

文章目录 HTML5 Input 类型Input 类型: colorInput 类型: dateInput 类型: datetimeInput 类型: datetime-localInput 类型: emailInput 类型: monthInput 类型: numberInput 类型: rangeInput 类型: searchInput 类型: telInput 类型: timeInput 类型: urlInput 类型: weekHTM…

CLIMS:弱监督语义分割的跨语言图像匹配

文章目录 CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation摘要方法语言图像匹配框架 实验结果 CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation 摘要 存在的问题 CAM(类激活图)通常只激活有区别的对象…

辉煌优配|黄金价格创近两年半新高!2只黄金股一季度预增

黄金板块早盘走强。 4月14日早盘&#xff0c;黄金板块团体走高&#xff0c;次新股四川黄金开盘半小时内拉升至涨停&#xff0c;封单资金到达7279.78万元&#xff0c;中润资源、晓程科技涨幅居前&#xff0c;分别为8.96%、8.48% 消息面上来看&#xff0c;近期全球黄金期货价格节…

HTML中表格标签<table><tr><tb><th>中单元格的合并问题

前情知晓 层级关系如下&#xff1a; <table><tr><td> </td><th> </th></tr></table> <table>...</table> 用于定义一个表格开始和结束 <tr>...</tr> 定义一行标签&#xff0c;一组行标签内可以建立…

Spring Cloud微服务网关Zuul的注解@EnableZuulProxy或@EnableZuulServer做了什么事情

一、Zuul的工作原理 Zuul 1.x的版本是由Servlet以及一系列的Filter组成的&#xff0c;各个组件之间协同合作完成功能&#xff0c;且易于扩展。参看官方的架构图我画了张图&#xff1a; Zuul声明周期&#xff1a; HTTP Request -> DispatcherServlet -> ZuulHandlerMappi…

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....

前言 二月份的时候因为换工作的缘故&#xff0c;陆续参加了华为、阿里巴巴、字节跳动、拼多多、百度、Paypal 的社招面试&#xff0c;除了字节跳动流程较长&#xff0c;我主动结束面试以外&#xff0c;其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了&#xff0c;写个面经&…

2021遥感应用组二等奖:近20年黄河流域植被动态与生态环境效应

作品介绍 1 研究目的 基于MODIS NDVI植被指数、土地利用数据和气象数据集&#xff0c;辅以趋势分析、偏相关分析、马尔科夫转移矩阵变化分析、多元回归分析等方法&#xff0c;全面分析黄河流域2001-2020年植被时空变化特征&#xff0c;并通过构建统计模型方式&#xff0c;定量…