springcloud使用openfegin进行服务调用

一、为什么需要使用Fegin 

 引言:在我们使用nacos的时候是不是也有一种服务调用的方法那个时候我们使用到RestTemplate去调用远程的服务,但是我们看下面的一个例子就可以知道RestTemplate这种方式对于维护和后期代码上来说是不合理的,以为会是代码可读性和维护性变得很差。

通过上面的图片我们可以看出来如果当你需要改变这个服务名的时候,你会发现你需要改的地方很多很多,而且每个请求都需要写一个url的话看起来也不是很顺眼也不符合编程写代码的习惯,所以这个时候就有个中间件出现了也就是我们的Fegin。

但是我们为什么使用Fegin呢?

Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求,它像 Dubbo一样,Consumer直接调用接口方法调用 provider,而不需要通过常规的 Hip Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

 二、Fegin的基本使用

 第一步:引入OpenFegin的maven依赖到pom.xml文件中

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

第二步:在spring boot的启动类上加上注解启动OpenFegin

package com.ltx.nacosconsumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableDiscoveryClient
//openFegin注解
@EnableFeignClients
public class NacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(NacosConsumerApplication.class, args);}}

 第三步:编写OpenFegin对应的要调用的远程服务的client,并且在client接口中定义好需要访问远端的接口。

package com.ltx.nacosconsumer.demos.clients;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient("provider")//括号里面的远端的服务名
public interface ConsumerClient {@GetMapping(value = "/t")//需要访问的远程的controller的访问地址String test();
}

 第四步:在当前服务的controller中直接使用OpenFegin远程接口调用,直接的使用Client调用远程的接口就可以不使用之前的RestTemplate的那种需要写url的方法了。

package com.ltx.nacosconsumer.demos.controller;import com.ltx.nacosconsumer.demos.clients.ConsumerClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConsumerController {@Autowiredprivate ConsumerClient consumerClient;@GetMapping(value = "/test")public String test() {return consumerClient.test();}
}

第五步:测试调用,我在provider中写的t方法其实就是返回一个字符串。

 

三、Fegin的自定义配置

 Fegin的配置大概有下面的几种,但是我们一般使用到的Fegin的配置基本上就是日志级别的配置。

配置项类型作用与说明
日志级别Logger.Level控制Feign客户端的日志输出级别。可选值:NONE、BASIC、HEADERS、FULL。
超时配置int设置Feign客户端的请求超时时间(毫秒)。
重试机制RetryPolicy配置重试策略,包括重试次数和重试间隔。
负载均衡LoadBalancer配置负载均衡策略,通常与Ribbon集成。
请求头配置Map<String, String>为Feign客户端配置自定义的请求头信息。
请求参数配置Map<String, Object>配置Feign客户端的请求参数,包括路径参数、查询参数、表单参数等。
解码器和编码器Decoder/Encoder配置Feign客户端使用的解码器和编码器,进行数据序列化和反序列化。
拦截器RequestInterceptor配置请求拦截器,在请求发送前后进行自定义处理。

日志级别分类

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

Java代码方式实现日志配置,自定义一个配置类DefaultFeignConfiguration。

package com.ltx.nacosconsumer.demos.logger;import feign.Logger;
import org.springframework.context.annotation.Bean;public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;// 请求和响应的日志}
}

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

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//开启Feign的功能

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

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

四、Fegin性能优化

OpenFeign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

URLConnection:默认实现,不支持连接池

Apache HttpClient :支持连接池

OKHttp:支持连接池

引入Apache HttpClient依赖

        <!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-httpclient --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

配置连接池

# 开启openfeign对HttpClient的支持
spring.cloud.httpclientfactories.apache.enabled=true
# 最大的连接数
feign.httpclient.max-connections=200
# 每个路径的最大连接数
feign.httpclient.max-connections-per-route=50

五、Fegin在实际使用

 因为其实在很多业务场景中可能都会重复使用到一个业务中的代码可能会导致,每个业务中都会包含了一个FeginApi的类会导致整个项目的冗余度变高,所以这个时候有一种做法就是把FeginApi的代码全部都抽离处理,如何在其他的需要用到的项目中引入Fegin的包就可以直接的使用FeginApi进行远程服务调用。

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

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

相关文章

【无标题】Git(仓库,分支,分支冲突)

Git 一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更 一&#xff0e;Git的主要功能&#xff1a; 二&#xff0e;准备git机器 修改静态ip&#xff0c;主机名 三&#xff0e;git仓库的建立&#xff1a; 1.安装git [rootgit ~]# yum -y install git 2.创建一个…

针对datax-web 中Swagger UI接口未授权访问

application.yml 添加以下配置 实现访问doc.html 以及/v2/api-docs 接口时需要进行简单的校验 swagger:basic:enable: trueusername: adminpassword: 12345 配置重启后再进行相关访问则需要输入用户名和密码

【SQL 新手教程 2/20】关系模型 -- 主键

&#x1f497; 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record)&#xff1a; 表的每一行称为记录&#xff08;Record&#xff09;&#xff0c;记录是一个逻辑意义上的数据 字段 (Column)&#xff1a;表的每一列称为字段&#xff08;Colu…

Footprint Analytics 助力 Core 区块链实现数据效率突破

Core 是一个基于比特币并兼容 EVM 的 Layer 1 区块链&#xff0c;正通过其创新解决方案引革新特币金融。作为首个引入非托管 BTC 质押协议及全球首个发行收益型 BTC ETP 产品的区块链&#xff0c;Core 站在了区块链技术的最前沿。通过利用超过 50% 的比特币挖矿哈希算力&#x…

Java高频面试题分享

文章目录 1. 策略模式怎么控制策略的选取1.1 追问&#xff1a;如果有100种策略呢&#xff1f;1.2 追问&#xff1a;什么情况下初始化Map 2. 什么是索引&#xff1f;什么时候用索引&#xff1f;2.1 追问&#xff1a;怎么判断系统什么时候用量比较少2.2 追问&#xff1a;如何实时…

R下载包显示unable to access index for repository:.......无法打开URL

1、报错“Warning: unable to access index for repository https://mirrors.bfsu.edu.cn/CRAN/src/contrib: cannot open URL https://mirrors.bfsu.edu.cn/CRAN/src/contrib/PACKAGES” 解决方法&#xff1a; > options(reposhttp://cran.rstudio.com/) #把https换成htt…

在树莓派上安装 ROS Melodic

树莓派的支持的系统比较多&#xff0c;以 Raspbian Buster 为例&#xff0c;记录在树莓派上下载并构建 ROS Melodic 的步骤&#xff0c;其他的派类似。 一、安装 ROS Melodic 打开树莓派终端并执行以下步骤。 1. 安装 repository key $ sudo sh -c echo "deb http://pack…

github-page静态网页将字符串写入github库中文本文档

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【MySQL进阶之路 | 高级篇】MVCC三剑客:隐藏字段,Undo Log,ReadView

1. 再谈隔离级别 我们知道事务有四个隔离级别&#xff0c;可能存在三种并发问题&#xff1a; 在MySQL中&#xff0c;默认的隔离级别是可重复读&#xff0c;可以解决脏读和不可重复读的问题&#xff0c;如果仅从定义的角度来看&#xff0c;它并不能解决幻读问题。如果我们想要解…

python利用lxml模块爬取百度贴吧标题列表—新手练习的项目

一、爬取需求 就是用python&#xff0c;获取某百度贴吧的标题 二、代码 import lxml.html import requests ydm requests.get(https://tieba.baidu.com/f?ieutf-8&kw%E5%BC%A0%E5%A7%93%E4%B9%8B%E5%AE%B6).content.decode() selector lxml.html.fromstring(ydm) inf…

【Golang 面试基础题】每日 5 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

跨境电商独立站:Shopify/Wordpress/店匠选哪个?

在面对不断增加的平台运营压力时&#xff0c;不少跨境电商的商家逐渐将注意力转向建立自己的独立站。据《中国跨境出口电商发展报告&#xff08;2022&#xff09;》所示&#xff0c;中国拥有的独立站数量在2022年已接近20万个&#xff0c;这表明独立站已成为卖家拓展海外市场的…

Vue3分段控制器(Segmented)

效果如下图&#xff1a;在线预览 APIs Segmented 参数说明类型默认值必传block是否将宽度调整为父元素宽度&#xff0c;同时所有选项占据相同的宽度booleanfalsefalsedisabled是否禁用booleanfalsefalseoptions选项数据string[] | number[] | SegmentedOption[][]falsesize控…

LoRA:低秩自适应

LoRA:低秩自适应 本章节是对轻松上手微调大语言模型——QLORA篇中提到的LoRA的原理解释。 背后动机 现今模型的参数量变得越来越大&#xff0c;对预训练模型进行全微调变得越来越不可行。为了解决这个问题有了LoRA&#xff08;Low-Rank Adaption&#xff09;的诞生。将可训练…

ATF-541M4全解析(一)

目录 一、描述二、规格三、各参数最大值四、25℃下的典型值 一、描述 安华高科技 (Avago Technologies) 的 ATF-541M4 是一款高线性度、低噪声、单电源供电的E-PHEMT&#xff0c;封装在一个微型无引脚封装中。 ATF-541M4 的小尺寸和低外形使其非常适合用于混合模块和其他空间…

C++多态的底层原理

目录 1.虚函数表 &#xff08;1&#xff09;虚函数表指针 &#xff08;2&#xff09;虚函数表 2.虚函数表的继承--重写&#xff08;覆盖&#xff09;的原理 3.观察虚表的方法 &#xff08;1&#xff09;内存观察 &#xff08;2&#xff09;打印虚表 虚表的地址 函数 传参…

SpringBoot添加密码安全配置以及Jwt配置

Maven仓库&#xff08;依赖查找&#xff09; 1、SpringBoot安全访问配置 首先添加依赖 spring-boot-starter-security 然后之后每次启动项目之后&#xff0c;访问任何的请求都会要求输入密码才能请求。&#xff08;如下&#xff09; 在没有配置的情况下&#xff0c;默认用户…

【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

ctfshow-web入门-php特性(web137-web141)

目录 1、web137 2、web138 3、web139 4、web140 5、web141 1、web137 直接调用 ctfshow 这个类下的 getFlag 函数&#xff0c;payload&#xff1a; ctfshowctfshow::getFlag 查看源码&#xff1a; 拿到 flag&#xff1a;ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5} 在…

【Linux】远程连接Linux虚拟机(MobaXterm)

【Linux】远程连接Linux虚拟机&#xff08;MobaXterm&#xff09; 零、原因 有时候我们在虚拟机中操作Linux不太方便&#xff0c;比如不能复制粘贴&#xff0c;不能传文件等等&#xff0c;我们在主机上使用远程连接软件远程连接Linux虚拟机后可以解决上面的问题。 壹、软件下…