Feign 使用篇

Feign是一个声明式的HTTP客户端工具,它简化了在分布式系统中进行服务间通信的过程。开发人员可以使用Feign来定义接口,然后通过该接口来调用远程服务,就像调用本地方法一样简单。

目录

    • Feign的一些关键特性和概念:
    • openfeign 对比 feign
      • Feign
      • OpenFeign
      • 安装
        • Maven安装引入
        • 配置
      • java config 配置RestTemplate
        • 超时配置
        • 日志配置
        • 开启GZIP
      • 使用
        • 在`auth` service中定义userClient
        • 在`order` service的`helloController`中调用UserClient
      • Feign 拦截器
    • 总结:
      • feign底层会调用restTemplate吗?
      • feign底层可以使用哪几种http框架?

Feign的一些关键特性和概念:

  1. 声明式API

    • 使用Feign,你只需要创建一个Java接口,并使用注解来描述HTTP请求的格式、路径、参数等信息。
    • Feign会根据这些注解自动生成一个HTTP客户端的实现,你可以直接调用这个接口来发送HTTP请求。
  2. 与Spring Cloud集成

    • Feign是Spring Cloud生态系统的一部分,与其他Spring Cloud组件(如Eureka、Ribbon、Hystrix等)无缝集成,可以充分发挥微服务架构的优势。
  3. 负载均衡

    • Feign集成了Ribbon,可以利用Ribbon的负载均衡功能,将请求分发到多个服务实例中。
  4. 服务熔断

    • Feign集成了Hystrix,可以通过在Feign接口上添加@HystrixCommand注解来实现服务的熔断和降级。
  5. 动态URL和参数处理

    • Feign允许在运行时动态改变请求的URL,也可以使用@RequestParam等注解来处理请求的参数。
  6. 多继承

    • OpenFeign扩展了Feign,支持多继承,可以继承多个Feign接口,实现接口的组合。
  7. 日志和日志级别

    • Feign提供了日志级别的控制,可以用于调试和监控请求。
  8. 请求和响应拦截

    • 可以使用RequestInterceptorResponseInterceptor来拦截请求和响应,可以用于添加认证信息、记录日志等操作。

总的来说,Feign是一个强大的工具,使得在微服务架构中进行服务间通信变得非常简单和便捷。通过声明式的API和集成的特性,开发人员可以更加专注于业务逻辑的实现,而不需要手动处理HTTP请求和响应的细节。同时,通过集成Ribbon和Hystrix,Feign也提供了负载均衡和服务熔断的支持,使得微服务架构变得更加健壮和可靠。

openfeign 对比 feign

Feign和OpenFeign都是用于简化在微服务架构中进行服务间通信的工具,它们都属于Spring Cloud生态系统的一部分。

Feign

Feign是Netflix开发的一个声明式的HTTP客户端,它使得编写HTTP客户端变得非常简单。在Feign中,你只需要创建一个接口,然后使用注解来描述HTTP请求的格式、路径、参数等信息,Feign会自动帮你生成实现这个接口的HTTP客户端。

Feign的特点:

  • 声明式的API:通过接口定义,使得调用远程服务的代码看起来像调用本地方法一样简单。
  • 集成了Ribbon:可以使用Ribbon的负载均衡功能。
  • 集成了Hystrix:可以使用Hystrix来实现服务的熔断和降级。

OpenFeign

OpenFeign是Spring Cloud对Feign进行了封装和扩展,提供了一些额外的功能和特性。

OpenFeign相比原始的Feign具有一些优势:

  • 支持Spring MVC注解:可以使用Spring MVC的注解,如@RequestMapping@RequestParam等,使得接口的定义更加灵活。
  • 支持多继承:可以继承多个Feign接口,实现接口的组合。
  • 支持动态URL:可以在运行时动态改变请求的URL。

总的来说,OpenFeign是对Feign的增强和扩展,提供了更多的灵活性和便利性,使得微服务之间的通信更加方便和高效。

在实际项目中,如果你使用了Spring Cloud,通常会优先选择使用OpenFeign来简化服务间的通信。

安装

Maven安装引入
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.jorian.framework</groupId><artifactId>j-cloud-consumer-feign</artifactId><version>1.0.0</version><name>j-cloud-consumer-feign</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.4.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><cloud.version>Dalston.SR1</cloud.version></properties><dependencies><!-- hystrix断路器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency><!--LOMBOK--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version><scope>provided</scope></dependency><!-- eureka 配置中心 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><!-- fegin --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- boot-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!-- dependency management --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
配置

启动类上上注解

package cn.jorian.framework;import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;/*** @author jorian*/
@SpringCloudApplication
@EnableEurekaClient // 表明这是一个eureka客户端
@EnableFeignClients(basePackages = "cn.jorian.*") //开启feign
public class JCloudConsumerFeignApplication {public static void main(String[] args) {// TODO Auto-generated method stubSpringApplication.run(JCloudConsumerFeignApplication.class, args);}}

feign 可以结合nacos、eureka等注册中心使用。当然也可以不适用注册中心,直接在feignClient上指定url来调用,非常的灵活。

java config 配置RestTemplate

RestTemplate配置

@Bean
@LoadBalanced
private RestTemplate restTemplate () {return new RestTemplate();
}
超时配置
import static java.util.concurrent.TimeUnit.MILLISECONDS;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@Beanpublic feign.Request.Options getFeignRequestOptions() {return new feign.Request.Options(5000, MILLISECONDS, 3000, MILLISECONDS, true);}
}

也可以通过yml进行配置

feign:client:config:default: # 可以指定具体某个SERVICE,可以替换成service nameconnectTimeout: 5000readTimeout: 3000
日志配置

application.yml文件中设置日志级别,这个是应用日志的级别要和feign的日志级别配合使用。

logging:level:com.csdnblogs.javalouvre.api: debug

application.yml配置feign日志级别,需要指定针对服务名称

feign:client:config:stock-service: # 具体的servicename,可以替换成default全局生效loggerLevel: FULL

也可以使用javaconfig,下面这个也是全局生效的配置

public class TestConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

在这里插入图片描述

开启GZIP
feign:compression:request:enabled: truemime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPEmin-request-size: 2048  # 配置压缩数据大小的下限response:enabled: true # 配置响应GZIP压缩

使用

假入有一个auth service 和一个 order server 现在order service要调用 auth service的UserClient

auth service中定义userClient
package cn.jorian.framework.service;import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/*** 这个接口相当于把原来的服务提供者项目当成一个Service类* @author jorian**/
@FeignClient("PROVIDER-USER") // ①
public interface UserClient {/*** Feign中没有原生的@GetMapping/@PostMapping/@DeleteMapping/@PutMapping,要指定需要用method进行*** 接口上方用requestmapping指定是服务提供者的哪个controller提供服务*/@RequestMapping(value="/user/sayHello",method=RequestMethod.GET)public String sayHello();@RequestMapping(value="/user/sayHi",method=RequestMethod.GET)public String sayHi();@RequestMapping(value="/user/sayHaha",method=RequestMethod.GET)public String sayHaha();
}

① @FeignClient value填写的是服务的名称,feign底层调用的时候会根据服务名称去找eureka、nacos注册列表根据服务名找到注册的实例,拼接成http url进行请求。

order service的helloController中调用UserClient
package cn.jorian.framework.controller;import cn.jorian.framework.service.UserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Hellocontroller {@Autowiredprivate UserClient feignClient;/*** 此处的mapping是一级controller,调用方法里边绑定了二级的conroller,相当于用http完成一次转发* @return*/@GetMapping("/hello")public String hello(){return feignClient.sayHello();}@GetMapping("/hi")public String hi(){return feignClient.sayHi();}@GetMapping("/haha")public String haha(){return feignClient.sayHaha();}}

以一个实例来验证说明效果,自定义三个 RequestInterceptor

class FeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header("user", "myuser1");requestTemplate.header("password", "mypassword");}
}

@FeignClient 中可以指定一个拦截器和feign配置

@FeignClient(name = "test-service",url = "http://localhost:8080/feign/server/",configuration = {FeignInterceptor.class,TestConfiguration.class},fallback = TestService.DefaultFallback.class
)

Feign 拦截器

RequestInterceptor是拦截器,可以在发送前做一些处理,比如统一添加header信息。每一类中的requestInterceptors可以存储多个拦截器,拦截器并非覆盖的效果,而是链式追加的效果;从执行顺序来看优先级是:1 > 2 > 3,即先执行配置类中指定的拦截器,然后是配置文件中指定的全局拦截器,最后是配置文件中指定的专属拦截器。

需特别注意:RequestInterceptor的实现类(例如 RI-A,RI-B)上如果添加了@Component注解,就都会被扫描识别到,并被追加到第一类的requestInterceptors列表中;倘若不小心 RI-A 还在第 2 类中又被指定了,则还会将拦截器 RI-A 追加在第二类的requestInterceptors列表中,结果是会 RI-A 总计会执行 2 次;若也在第三类中指定 RI-A,则 RI-A 也在其列表中追加,结果是 RI-A 总计会执行 3 次。

总结:

feign底层会调用restTemplate吗?

是的,Feign在底层使用了RestTemplate来发送HTTP请求。RestTemplate是Spring框架提供的一个用于发送HTTP请求的工具类,它提供了许多便捷的方法来处理HTTP请求和响应。

Feign通过将接口的方法映射到HTTP请求,使得你可以以一种声明式的方式调用远程服务。Feign会将这些方法调用转换为相应的HTTP请求,并使用RestTemplate来实际发送请求。

然而,需要注意的是,随着Spring Cloud的发展,RestTemplate正在逐渐被WebClient取代。WebClient是一个非阻塞、响应式的HTTP客户端,适用于构建响应式的、高性能的分布式系统。因此,如果你使用了Spring Cloud的最新版本,可能会更倾向于使用WebClient而不是RestTemplate。

如果你使用的是旧版本的Spring Cloud或者有特定的需求需要使用RestTemplate,那么Feign将会继续使用它作为发送HTTP请求的底层工具。

feign底层可以使用哪几种http框架?

okHttp/apache httpClient/HttpUrlConnection

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

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

相关文章

【高云FPGA系列教程(11):MultiButton按键驱动模块移植】

文章目录 1. MultiButton简介2. MultiButton代码获取3. MultiButton移植4. 测试与运行本文是高云FPGA系列教程的第11篇文章。 1. MultiButton简介 MultiButton, 一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构…

https跳过SSL认证时是不是就是不加密的,相当于http?

https跳过SSL认证时是不是就是不加密的,相当于http?&#xff0c;其实不是&#xff0c;HTTPS跳过SSL认证并不相当于HTTP&#xff0c;也不意味着没有加密。请注意以下几点&#xff1a; HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;本质上是在HTTP的基础上…

zabbix

利用一个优秀的监控软件可以: 通过一个友好的界面进行浏览整个网站所有的服务器状态 可以在 Web 前端方便的查看监控数据 可以回溯寻找事故发生时系统的问题和报警情况 zabbix 是什么&#xff1f; zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级…

数字人惯性动作捕捉技术服务,激发吉祥物IP创新活力

近日&#xff0c;2023年成都市全国科普日主场活动启动仪式中&#xff0c;全球首发全国首个科普数字人形象大使“科普熊猫”&#xff0c;在大会活动现场&#xff0c;数字人“科普熊猫”结合惯性动作捕捉技术&#xff0c;与现场主持人、观众进行实时互动交流&#xff0c;以虚实结…

maven入门

作用 项目管理工具&#xff1a;依赖管理&#xff0c;项目构建 具体解决的问题 便于添加依赖自动化构建项目多模块开发 相关概念 本地仓库-》私服-》镜像/远程仓库&#xff08;中央仓库&#xff09; 依赖 依赖的范围 compiletestprovidedruntimesystem主程序是否是否否测…

Unity丨自动巡航丨自动寻路丨NPC丨

文章目录 概要功能展示技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 本文功能是制作一个简单的自动巡逻的NPC&#xff0c;随机自动寻路。 功能展示 技术细节 using UnityEngine;public class NPCController : MonoBehaviour {public float moveSpeed 5.0f; // …

LeetCode算法二叉树—116. 填充每个节点的下一个右侧节点指针

目录 116. 填充每个节点的下一个右侧节点指针 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;N…

1.(vue3.x+vite)封装组件

前端技术社区总目录(订阅之前请先查看该博客) 关联博客 2.(vue3.x+vite)组件注册并调用 1:创建组件目录package,并创建相关工程结构 2:编写组件内容(index.vue) 3:添加注册组件方法(index.js) 4:添加路由

车载通信架构 —— SOME/IP-SD 协议介绍

车载通信架构 —— SOME/IP-SD 协议介绍 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

数据结构 | 树

树 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 有且仅有一个特定的称为根的结点。当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09;个互不相交的有限集T1,T2,…,Tm&#…

zabbix自定义监控、钉钉、邮箱报警 (五十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验准备 二、安装 三、添加监控对象 四、添加自定义监控项 五、监控mariadb 1、添加模版查看要求 2、安装mariadb、创建用户 3、创建用户文件 4、修改监控模版 5、…

第57篇-某手did滑块流程分析【2023-09-25】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、滑块流程分析三、参数分析1.verifyParam参数分析2.c参数分析四、captchaToken激活五、流程整理一、前言 我…

PyTorch实战:常用卷积神经网络搭建结构速览

目录 前言 常用卷积神经网络 1.AlexNet 2.VGGNet 3.GoogLeNet 4.ResNet 总览 前言 PyTorch可以说是三大主流框架中最适合初学者学习的了&#xff0c;相较于其他主流框架&#xff0c;PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是&#xff0c;框架…

RDLC动态设置整个表格是否显示

最近有个新的需求&#xff1a;使用RDLC打印&#xff0c;当数据库中能查出数据时&#xff0c;显示表格。没有数据时&#xff0c;不显示整个表格。 1.首先在RDLC中选中表格的任意一列&#xff0c;右键Tablix属性 2.Tablix属性中选中可见性》选中基于表达式显示或隐藏(E)并点开右…

数据大爆炸:大数据分析如何改变我们的世界

文章目录 大数据分析的基本概念数据的三个V大数据分析的技术 大数据分析在商业中的应用1. 个性化营销2. 风险管理3. 供应链优化4. 客户服务 大数据分析在医疗保健中的应用1. 疾病预测2. 患者治疗3. 医疗设备监控 大数据分析在科学研究中的应用1. 天文学2. 生物学3. 气象学 大数…

消费盲返模式:让消费变为一种乐趣,让业绩飞速增长

消费盲返模式是一种新型的消费返利模式&#xff0c;它可以让消费者在购买商品或服务后&#xff0c;获得后续一定数量的订单的部分利润作为奖励。这样&#xff0c;消费者不仅可以享受商品或服务的优惠&#xff0c;还有可能赚取更多的钱。这种模式对于平台和消费者都有各自的优势…

HDMI之HDCP 2.3

Authentication and Key Exchange Without Stored Km With Stored Km HDCP2Version DDC时序 协议截图 Bit2为1,可知DUT设备支持HDCP 2.2及以上版本 RxStatus DDC时序 协议截图 <

TensorFlow入门(一)

一、下载安装Anaconda 下载地址:http://www.anaconda.comhttp://www.anaconda.com 下载完成后运行exe进行安装 二、下载cuda 下载地址:http://developer.nvidia.com/cuda-downloadshttp://developer.nvidia.com/cuda-downloads 下载完成后运行exe进行安装 安装后winR cmd进…