Feign

个人真实项目-FEIGN常见问题分享 很多时候,我们在使用微服务框架的时候,就基本上少不了与feign打交道。毕竟服务之间的调用,基本上都不会用http调了,这样显得有点麻烦了,feign更方便了。而且feign,还自带了负载均衡的策略(ribbon提供),如果我们的服务是集群的,feign还能负载调用。这些估计大家都懂吧?不会还有人不懂吧?那这个要深入学习了。哈哈在用feign的日常中,难免会遇到些问题,那下面,我来总结下,我在项目开发中遇到的问题喽。哈哈,虽说不是大问题,但至少是点经验分享喽,希望可以帮助到大家。... 阅读详情

依赖管理

统一依赖版本号

<!--SpringBoot版本号-->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.4.2</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--版本号-->
<properties>
	<java.version>1.8</java.version>
	<mybatis.version>2.1.0</mybatis.version>
	<mysql.connector.version>6.0.6</mysql.connector.version>
	<spring-cloud.version>2020.0.1</spring-cloud.version>
	<spring-cloud-netflix.version>2.2.0.RELEASE</spring-cloud-netflix.version>
	<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>
<!--依赖管理-->
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-netflix-dependencies</artifactId>
			<version>${spring-cloud-netflix.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-dependencies</artifactId>
			<version>${spring-cloud-alibaba.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.connector.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>

前提

说Feign之前,得先说说RestTemplate,RestTemplate用于访问远程http接口,比如A服务需要调用B方服务的方法,就可以使用RestTemplate,使用方式:

微服务使用nacos注册发现,这里需要加入ribbon作为负载均衡,添加依赖

<!--依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-netflix-ribbon</artifactId>
</dependency>

Java代码

Application:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.feign.client")
@MapperScan("com.example.service.order.dao")
public class OrderApplication {

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

    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

}

Service:

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserClient userClient;

    @Override
    public Order getOrderById(int id) {
        Order order = orderDao.selectById(id);
        // RestTemplate调用
        User user = getUser(order.getUserId());
        order.setUser(user);
        return order;
    }

    private User getUser(int userId) {
		// service-user是用户服务的服务名称,已经注册到nacos,这里不用写IP地址和端口号直接,使用服务名称即可
        String url = "http://service-user/user/get/" + userId;
        return restTemplate.getForObject(url, User.class);
    }

}

注意:用服务名称代替服务地址和端口号这种方式一定要加@LoadBalanced服务均衡注解和ribbon依赖,本人尝试不用这个注解,不加依赖,出现service-user服务找不到错误,这里踩了个坑!!!

以上是RestTemplate使用方式,看起来已经很简单了,但还是有点缺点:需要在代码上拼接URL地址,用起来不够优雅,来,我们们看看Feign优雅的做法

Feign使用

Feign也是远程服务调用的框架,它可以让我们使用接口一样调用远程服务,具体使用方法:

依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Application代码:
@SpringBootApplication
@EnableDiscoveryClient
// 允许使用Feign远程调用
@EnableFeignClients
@MapperScan("com.example.service.order.dao")
public class OrderApplication {

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

//    @LoadBalanced
//    @Bean
//    public RestTemplate getRestTemplate() {
//        return new RestTemplate();
//    }

}
创建user服务FeignClient
// service-user是在nacos注册的服务名称
@FeignClient(value = "service-user")
public interface UserClient {

	// 只要把User服务的Controller对应的方法copy过来即可,不用实现
	// Feign会通过动态代理的方式帮我们调用Http请求
    @GetMapping("/user/get/{id}")
    User getUser(@PathVariable("id") int userId);

}
Service:
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;

//    @Autowired
//    private RestTemplate restTemplate;

    @Autowired
    private UserClient userClient;

    @Override
    public Order getOrderById(int id) {
        Order order = orderDao.selectById(id);
        // RestTemplate调用
        // User user = getUser(order.getUserId());
        // Feign调用
        User user = userClient.getUser(order.getUserId());
        order.setUser(user);
        return order;
    }

//    private User getUser(int userId) {
//        String url = "http://service-user/user/get/" + userId;
//        return restTemplate.getForObject(url, User.class);
//    }

}

是不是变得更加优雅?!

性能优化

Feign默认底层使用URLConnection方式进行Http请求,这种方式是没有连接池的,调用一次连接一次,性能上可以优化,我们一般是使用HttpClient或OkHttp。

这里我使用OkHttp作为访问Http的方式,如下:

添加依赖
<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign-okhttp</artifactId>
</dependency>
application.yml修改
feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: true

这样我们就允许使用OkHttp进行Http请求,如果需要设置最大连接数、单个服务最大连接数、连接超时时间等简单参数,只要添加配置

feign:
  httpclient:
    enabled: false
    max-connections: 200
    max-connections-per-route: 50
  okhttp:
    enabled: true

但是我们要一些复杂的配置,则需要添加配置类,这里注意了,我们不能简简单单弄一个@Bean出来,否则okhttp会失效。

我们需要copy一份OkHttpFeignConfiguration的代码,对其进行修改即可。

参考链接:https://blog.youkuaiyun.com/eric520zenobia/article/details/103547552

最佳实践

生产环境中,会出现A服务和B服务都调用C服务的方法,如果A服务和B服务都定义C服务的FeignClient,是不是很多余,我们可以把C服务的FeignClient抽取出来,作为公共模块使用。

所以一般会新建一个模块(feign-api),把C服务的FeignClient挪到这个模块,A服务和B服务依赖这个模块就行。

这里会出现一个情况,我们在Service使用Autowire注入的方式使用FeignClient:

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;

    @Autowired
    private UserClient userClient;

    @Override
    public Order getOrderById(int id) {
        Order order = orderDao.selectById(id);
        User user = userClient.getUser(order.getUserId());
        order.setUser(user);
        return order;
    }

}

因为UserClient被我挪到了feign-api模块,包名不一样,也不在OrderApplication所在的包,所以会扫描不到,userClient会是空的

所以我们还要在Application代码修改一下:


@SpringBootApplication
@EnableDiscoveryClient
// 添加包名,这样SpringBoot才能扫描
@EnableFeignClients(basePackages = "com.example.feign.client")
// 还可以使用这种方式,用哪一个加哪一个
// @EnableFeignClients(clients = {UserClient.class})
@MapperScan("com.example.service.order.dao")
public class OrderApplication {

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

}
springcloud篇2-feign、gateway 说明:(1)日志级别NONE-没有日志BASIC-记录请求的开始和结束时间HEADERS-记录请求的开始和结束时、请求头和响应头FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体但该方式不推荐,会导致紧耦合。之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。 阅读详情

相关推荐

Feign基本用法-Feign

概述

抽象的螺旋 1万+

feign启用httpclient、okhttp

openfeign 默认启用 httpclient。 openfeign 默认启用 ribbon。 所以从 openfeign的 ribbon 下的HttpClientFeignLoadBalancedConfiguration源码中可以看出。 加了注解@ConditionalOnProperty,在没有配置feign.httpclient.enabled 时,默认为true。 @ConditionalOnProperty( value = {"feign.httpclient.ena..

wangooo的博客 2508

配置化Feign接口动态切换URL

动态切换Feign接口URL

qq_38783304的博客 4807

怎样配置Feign使用HttpClient

背景: 默认情况下,feign通过jdk中的HttpURLConnection向下游服务发起http请求(详见下图,源码详见feign.Client.Default),这种情况下,由于缺乏连接池的支持,在达到一定流量的后服务肯定会出问题  方案: 默认配置显然不足以支撑生产环境的服务,因此我们需要使用更加完备的方案。下面我们以HttpClient作为事例,来看一下怎样改变feign的底层ht...

8774

springcloud中的Feign调用

SpringCloud中Feign默认配置类是FeignClientsConfiguration,我们可以通过@FeignClient的属性自定义配置,自定义配置的优先级会比FeignClientsConfiguration高。

DN金猿的博客 1080

[享学Feign] 一、原生Feign初体验,Netflix Feign or Open Feign?

说到HTTP客户端,大家都不会感到陌生。Java自己源生的就有`java.net`包下的`HttpURLConnection`(虽然不太好用),同时优秀的开源产品更是百花齐放: - Apache HttpClient - OkHttp - Spring的RestTemplate - 说明:它基于以上三种Client做的包装 - Feign(本专栏详述) JDK源生的偏于底层且不好用,在Java9之前你几乎可以忽略它;作为老牌的`Apache HttpClient`凭借着各种优秀特征,似乎已成为了事实的标

架构师:通透,才能写出好代码! 7045

(二十三) 跟我学习SpringCloud-Feign的自定义配置及使用

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用,这节我们来学习 Feign 的一些自定义配置。推荐分布式架构源码 日志配置 有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。 首先定义一个配置类,代码如下所示。 @Configuration public class FeignConfiguration { /** * 日志级别 * * @return

iteye_3750的博客 903

[享学Feign] 八、Feign是如何生成接口代理对象的?Feign实例的构建器Feign.Builder详解

一步步稳扎稳打,终于到了该研究平时接触的API:`feign.Feign`本身。 `feign.Feign`它是最上层的API,是使用者直接使用的对象,它能完成对接口生成动态代理对象,从而很方面的让你面向接口编程,而不用太过例会Feign内部的实现细节。 如果说前面7篇都是在打基础,那么它们均是在帮你理解这篇的内容服务。那么作为最重要的一步:**生成接口代理对象**有何内幕?以及平时我们用于构建Feign的构建器`Feign.Builder`有何文章可循,本篇文章将彻底为你揭秘,帮你完整掌握Feign的核

架构师:通透,才能写出好代码! 3370

feign学习笔记

一、feign使用 (一)入门 原始RestTemplate访问远程http服务见链接https://blog.youkuaiyun.com/weixin_45390688/article/details/124303731 但是这样的实现并不优雅,可以使用下列方案代替。 4.调用 (二)性能优化 feign本身性能已经非常优越,但是默认使用的是URLConnection,但是URLConnection并不支持连接池,所以为了进一步提升性能,可以使用支持连接池的Apache HttpClient 1.引入Http

weixin_45390688的博客 959

[享学Feign] 十一、Feign通过feign-slf4j模块整合logback记录日志

作为一个程序员,说到日志的重要性,怎么强调都不过分。然而每个流行框架都有它内置使用的日志库,比如:Spring使用`commons-logging`(这是Spring的唯一**强外部依赖**,其它的依赖均非强制)记录日志。 Feign它自己提供了一个日志抽象`feign.Logger`用于记录日志,它并不限于具体底层实现。它内部提供了基于`java.util.logging.Logger`以及`System.err`的**基础实现**,那么很显然生产上不可能使用它们来实现日志打印。 本文将介绍Feign

架构师:通透,才能写出好代码! 3566

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

feign原理

feign的底层,原理

weixin_43924419的博客 1082

自动化测试工具playwright中文文档-------1.编写测试

Playwright 测试非常简单,它们执行操作,并断言状态是否符合预期。在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。此外,在执行检查时也不需要处理竞态条件——Playwright 的断言设计方式能够描述最终需要满足的期望。就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。您将学习如何编写第一个测试如何执行操作如何使用断言测试如何在隔离环境中运行如何使用测试钩子。

2301_76646967的博客 2508

什么是Feign?

服务间调用介绍 现有的服务调用方式 利用拼接的方式。 虽然上面有的用不错就很好了 Feign解决了什么问题 Feign的调用方式 Feign体系架构解析-武装到牙齿 上一节我们了解了feign的主要功能,它就像一个自拍杆一样,方便了Eureka的远程调用。可是怎么看都觉得Feign的功能很简单嘛,职责也比较单一,那它和Ribbon一样,都是大闲人了? 正所谓麻雀虽小五脏俱全,HTTP调用看着简单,实则下面隐藏的是一套非常复杂的流程。从上古时代jsp+servlet,到后面的SpringMVC,在HT

罗彬桦的博客 2万+

【24届计算机校招】面经汇总

这是笔者为了能够记录一下接下来一段时间会看的一些博客视频等汇总。一是为了汇总后常回来看看,而是为了后面的人在这个阶段准备的时候有个参考。现在已经6月底了,大部分高校的夏令营都出来了,而我至今还是夏0营,前几天还为川大会收双非而感到高兴,但遗憾的是川大并没要我。而我另一位双非的朋友已经拿到offer,在决定去南开还是华师了。没有对比就没伤害,我开始怀疑自己的决策是否正确——这段时间的夏令营我都有关注,但我仅报了少部分的几个酒吧舞,而没有选择海投,我觉得只要我认准了一个东西,我拼尽全力就一定能够获取到。

JehanRio's Private Blog 804

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 754

Feign远程调用

2.Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aETQpudi-1648948200523)(assets/image-20210714174814204.png)] 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现

helpluozhao123的博客 8703

ROS2 Control实战:多机器人仿真与控制器管理

本文详细介绍了ROS2 Control在多机器人仿真中的应用,涵盖命名空间配置、控制器管理及性能优化。通过Gazebo仿真环境和ROS2 Control框架,开发者可以高效管理多个机器人的硬件抽象和控制器,实现资源隔离与平滑切换。文章还提供了常见问题排查和调试工具推荐,助力机器人开发实践。

u9v0w的博客 203

Feign详解

一、什么是Feign Feign是一个http客户端,可以帮助我们更便捷的调用HTTP API。 Spring Cloud openfeign对Feign进行了 增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便。 Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方 法,更感知不到这是个 HTTP 请求。 二、Feign的使用 2.1 单独使用 Feign作为一个http客户端,可以像okht

敲代码的小小酥的博客 6004

【Telephony】APN配置及加载流程&项目实践(AOSP)

学习APN关键是学会明白apns-conf.xml文件各个参数的意思,然后熟悉TelephonyProvider是如何读取文件创建数据库的,譬如数据库表的约束、文件的读写顺序等,还有读取后的ApnSetting的二次定制以及显示(例如屏蔽xcap等)。虽然一般在项目中APN的需求很简单,就是按照客户提供的APN参数添加上配置,或者在显示屏蔽一些参数,但是项目维护的过程中APN的问题也是比较多的。

weixin_44513784的博客 5509

【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南

在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。

奶爸的编程之路,也就一周冷个三天 7747

Feign调用

一.导入依赖 <!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 二.编写Feign的调用接口 /** * * feign声明式接口。发起远程调用的。 * String u

weixin_51544010的博客 4431

制作一个完整的Shopify主题

Liquid是Shopify的模板语言,用于动态渲染页面内容。Liquid是Shopify的模板语言,用于动态渲染页面内容。Shopify主题包含多个文件和文件夹,包括布局、模板、部分、配置和资产文件夹。Shopify主题包含多个文件和文件夹,包括布局、模板、部分、配置和资产文件夹。准备好你的主题后,可以将其提交到Shopify主题商店。确保你的主题符合Shopify的质量标准和指南。准备好你的主题后,可以将其提交到Shopify主题商店。确保你的主题符合Shopify的质量标准和指南。

luckucu的博客 175

SpringCloud 之 Feign 以及 Feign 异常处理

在微服务中经常会出现这样一个场景,比如我有一个服务 admin,里面有着获取用户信息的接口,我有一个服务 service-a,需要用户信息,这时我需要通过 service-a 去调用 admin 服务的接口来获得用户信息 通过 Feign,我们不需要自己来写个 http 请求发送获取数据,也不需要引用其他服务来获取数据,做到服务间的解耦 Feign 会自动通过轮询的方式去进行负载均衡,且开启...

乐之终曲 5251

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: Nacos
下一篇: Spring AMQP 笔记
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值