Spring cloud - Feign

Feign的作用

Feign是Netflix公司开发的声明式web客户端组件,Spring对Feign做了无缝集成:

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Eureka, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign.

可以通过Feign注解或JAX-RS注解使用,Feign也支持拔插式的编解码。Spring Cloud增加了对Spring MVC注解的支持,并且在SpringMVC项目中默认使用HttpMessageConverters 转换器。同时,Spring Cloud集成了Eureka、Spring Cloud LoadBalancer等组件,以提供在使用Feign组件时的负载均衡。

为什么要使用Feign

由于Spring6.0之后有了自己的Web客户端组件,所以在Spring Cloud2022之后,Spring官方其实是在逐步的移除Feign、而使用自己的Web客户端组件作为替代。

但是不管是谁,我们项目中都需要一个比RestTemplate更加灵活的Web客户端组件。因为RestTemplate使用起来确实非常不方便:

    public User getUserByRestTemplate(){String url="http://userservice/user/getUser";System.out.println("url"+url);
//        int c = 1/0;return restTemplate.getForObject(url,User.class);}

应用中会有很多地方需要调用微服务userservice的接口,每一个调用的地方都需要写url,代码会显得非常凌乱、不优雅、不易维护。

Feign可以完美解决以上RestTemplate的问题,尤其是Spring Cloud整合Eureka和Spring LoadBalancer之后,还可以轻松实现负载均衡。

Feign的使用

pom文件引入openfeign

我们以前面几篇文章的案例为基础,在Eureka、Spring LoadBalancer、Hystrix框架基础上搭建Feign。

首先在orderservice模块下,pom文件引入openFeign:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springCloud</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>orderservice</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.example</groupId><artifactId>userService</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.10.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>

orderService启动类启用FeignClients

在orderService的启动类中通过@EnableFeignClients注解启用FeignClient:

package com;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

RestTemplate就可有可无了,无需理会。

编写FeignClient接口

创建一个接口文件UserService

@FeignClient(name="userservice",path="/user")
public interface IUserService {@GetMapping("/getUser")public User getUser();
}

通过@FeignClient注解,指定当前接口是一个FeignClient的接口文件,其中name属性指定其对应的微服务名称,path指定对该服务的访问路径。

接口方法支持SpringMVC的注解,比如@GetMapping、@PostMapping等等,相当于是在访问当前服务下的Controller方法一样。这为程序员在微服务环境下的服务调用提供了极大的方便,使得微服务调用变的轻而易举。

尤其,这个接口是不需要我们去实现的,由Feign在Spring Cloud服务启动过程中通过代理实现并自动注入到Spring Ioc容器中。所以我们在应用中可以直接通过自动装配引用。

回想一下MyBatis,和Mapper接口是否很类似?

对接口方法的调用

找到我们以前通过RestTemplate调用userservice服务的应用,通过@AutoWired注解自动装配IUserService ,直接调用接口方法getUser():

@Service
@Slf4j
public class OrderService {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IUserService userService;public String getOrder(){//通过userService获取user信息
//        User user = getUserByRestTemplate();User user = getUserByFeign();
//        System.out.println(user);return user.getName();}public User getUserByRestTemplate(){String url="http://userservice/user/getUser";System.out.println("url"+url);
//        int c = 1/0;return restTemplate.getForObject(url,User.class);}public User getUserByFeign(){return userService.getUser();}
}

测试

分别启动Eureka模块、orderservice模块、userservice模块:
在这里插入图片描述
浏览器访问测试:
在这里插入图片描述

说明Feign已经正常工作。

反复刷新访问:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明Spring LoadBalancer已经正常工作。

在使用RestTemplate作为WEB客户端的时候,我们需要通过@LoadBalanced注解来启用Spring LoadBalancer负载均衡,但是FeignClient并不需要做什么,自动集成了负载均衡。

集成Hystrix

orderService服务的Controller中增加@HystrixCommand配置:

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {@AutowiredOrderService orderService;@AutowiredFallbackHandle fallbackHandle;@GetMapping("/getOrder")@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")})public String getOrder(){log.info("Come here to get Order....123===");return orderService.getOrder();}public String fallback(){return "orderService服务异常";}}

然后userservice的getUser方法添加sleep使其超时:

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Value("${server.port}")private String serverPort;@GetMapping("/getUser")@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "8000")})public User getUser(){log.info("userController's getuser comming......");User user=new User();user.setName("zhangsan from:"+serverPort);try{log.info("I am sleepint for 10 second");Thread.sleep(10*1000);log.info("I weekup");}catch (Exception e){}return user;}public User fallback(){User user=new User();user.setName("userService服务异常");return user;}
}

前端访问验证:
在这里插入图片描述
如果修改userService的@HystrixCommand超时时长参数为2秒,则:
在这里插入图片描述
说明Hystrix组件已经可以正常工作,与Feign组件进行了无缝集成。

Spring cloud feign官网:https://cloud.spring.io/spring-cloud-openfeign/reference/html/#spring-cloud-feign

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

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

相关文章

初出茅庐的小李之C语言必备知识预处理

编译预处理 编译预处理就是在编译源代码之前进行的一系列处理&#xff0c;将源程序中的一些特殊命令进行展开或处理&#xff0c;生成扩展的源代码。这些特殊命令通常以“#”开头&#xff0c;占单独的行&#xff0c;语句尾部不需要加分号。 宏定义 (#define)是一种常见的编译…

国产航顺HK32F030M: 简易篮球计分器(便携计分器)

【自制】《基于航顺HKF030MF4P6手持比赛计分牌》&#xff08;便携计分器&#xff09; 1. 简介 便携篮球计分器是一种小型化设计的设备&#xff0c;主要用于记录和显示篮球比赛的得分和计时。以下是由Type-C充电电路TP5400/ASM1117电路、HK32F030MF4单片机最小系统、数码管显示…

AlDente Pro v1.22.2(mac电池最大充电限制工具)

AlDente Pro是一款适用于Mac操作系统的小工具&#xff0c;可以帮助您限制电池充电量以延长电池寿命。通常情况下&#xff0c;电池在充满的状态下会继续接受电源充电&#xff0c;这可能会导致电池寿命缩短。使用AlDente Pro&#xff0c;您可以设置电池只充到特定的充电水平&…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

超实用:通过文字就可以操纵这款AI表格,不需要你懂Excel函数

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 工具介绍 今天给大家分享超实用的AI表格ChatExcel&#xff0c;这个工具是由北大团队在2022年3月开始开发的AI表格处理神器&#xff0c;上传你的表格后&#xff0c;只需要用文字描述你…

Javascript每天一道算法题(十八)——矩阵置零-中等

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——标记数组 1、问题 给定一个 y x x 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1&#xff1a; 输入&#xff1a;matrix [[…

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能&#xff0c;就像大数据领域里有离线计算和实时计算&#xff0c; ETLCloud 还提供了基于 CDC &#xff08;Change Data Capture&#xff09;的实时数据集成功能&#xff1a;实时数据集成是指通过变化数据捕获技术&#…

【MySQL】数据库基础操作

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…

1.Linux基础命令

1.打开命令窗口 crtlaltt 2.显示当前目录中的文件 ls 3.创建目录/文件夹 mkdir 文件名 4.进入文件夹 cd 目录 cd . .回到上一级目录 cd . ./. ./回到上上级目录 5.创建文本 gedit 文本名 6.删除文件 删除文件夹 rm -r 文件名&#xff08;强制删除&#xff09; 删除文本 rm…

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

【从浅识到熟知Linux】基本指定之find、grep、head和tail

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;一篇又一篇&#xff0c;学写越上头。 文章前言&#xff1a;本文介绍find、grep、head和tail指令用法并给出示例和截图。 文章目录 find基本…

大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节

为普及科学知识&#xff0c;张扬科学精神&#xff0c;创设浓郁的科学氛围&#xff0c;11月24日&#xff0c;华中科技大学附属花城中学举办了以“走近科学&#xff0c;触碰未来”为主题的首届科技节暨科创文化展示周活动。学生们在学习中感受科技的魅力&#xff0c;在“玩”中感…

实现简单的操作服务器和客户端(上)

一、说明 描述:本教程介绍如何使用 simple_action_server 库创建斐波那契动作服务器。此示例操作服务器生成斐波那契序列,目标是序列的顺序,反馈是计算的序列,结果是最终序列。 内容 创建操作消息编写一个简单的服务器 代码

【LM、LLM】浅尝二叉树在前馈神经网络上的应用

前言 随着大模型的发展&#xff0c;模型参数量暴涨&#xff0c;以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此&#xff0c;降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验&#xff0c;现在这个工作推进到BERT上…

[极客大挑战 2019]Secret File1

[极客大挑战 2019]Secret File1 在bp里面发现secr3t.php 将secr3t.php 直接加在网站后面&#xff0c;发现了有关flag的信息&#xff0c;一个flag.php文件 在遇到flag.php时候&#xff0c;联想到php伪协议&#xff0c;构造伪协议方式 secr3t.php?filephp://filter/readconver…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码四、调用库的介绍End、遇到的问题2、Qt 在线安装容易报错&#xff0c;断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架&#xff0c;它包含了一组用于处理…

【图解系列】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作&#xff08;Collaborate&#xff09;&#xff1a;JIRA、Confluence 大家肯定不陌生了&#xff0c;我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建&#xff08;Build&#xff09;&#xff1a;常用的 SCM&#xff08;Software Con…

掌握未来技术趋势,成为领先者——深度解析2023年技术热点

掌握未来技术趋势&#xff0c;成为领先者——深度解析2023年技术热点 摘要&#xff1a;本文探讨当前最热门的技术趋势。我们将介绍人工智能、大数据、区块链、5G等前沿技术&#xff0c;并阐述它们如何改变我们的生活。最后&#xff0c;我们将总结如何利用这些技术趋势&#xf…