Feign 原理流程图练习-01

目录

作业: 老师给的参考流程图

要求

解答

知识扩展

Feign基础原理 

接口定义

代理对象生成

请求调用

请求发送

响应处理

容错与熔断

总结

作业: 老师给的参考流程图

pdf版本 【金山文档 | WPS云文档】 Feign
https://kdocs.cn/l/ctbagIyxN348

要求

结合上面的Feign调用流程总结,画图描述订单服务调用用户服务的完整流程

解答

Feign代理流程图-ProcessOn

知识扩展

Feign基础原理 

Feign是一个声明式的HTTP客户端,它允许开发者通过定义接口和使用注解来简化远程服务的调用。Feign的工作原理主要涉及以下几个关键步骤:

接口定义

开发者通过定义带有Feign注解的Java接口来描述HTTP请求规范,例如使用@RequestLine注解指定HTTP方法和URL模板。

代理对象生成

当Spring Cloud应用启动时,Feign会扫描带有@FeignClient注解的接口,并为其生成动态代理对象。

特别注意的是需要在Springboot启动项中允许开启FeignClinet代理

package cn.tedu.charging.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
//在启动类让spring-boot帮忙开启feignClients
// 多个client
@EnableFeignClients
public class ChargingOrderApplication {public static void main(String[] args) {SpringApplication.run(ChargingOrderApplication.class,args);}
}

根据我上面的作业要求 订单调用用户服务 这边直接在订单项目写了feign包,包下写了一个接口 UserClinet 

package cn.tedu.charging.order.feign;import cn.tedu.chaging.common.pojo.UserInfoVO;
import cn.tedu.chaging.common.web.JsonResult;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;//userService要和nacos服务列表里的服务名称一致
@FeignClient("userService")
public interface UserClient {//String url = "http://localhost:8083/user/info/"+userId;@GetMapping("/user/info/{userId}")JsonResult<UserInfoVO> getUserInfo(@PathVariable("userId") Long userId);}

JsonResult是响应的返回体,这边我限制了其返回数据为UserInfoVo

package cn.tedu.chaging.common.web;import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;/***  //状态码 自定义的码 2000 表示成功 2001 表示失败*         //提示消息 保存失败*         //具体的数据 比如查询订单 需要把查出的订单数据返回给前端*/
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class JsonResult<T> {/*** 状态码*/Integer code;/*** 提示消息*/String msg;/*** 具体的数据*/T data;/*** 正常返回 入参 有数据和消息* @param data* @param msg* @return*/public static JsonResult ok(Object data,String msg) {JsonResult jsonResult = new JsonResult();jsonResult.setCode(2000);jsonResult.setData(data);jsonResult.setMsg(msg);return jsonResult;}/*** 正常返回 入参只有数据* @param data* @return*/public static JsonResult ok(Object data) {JsonResult jsonResult = new JsonResult();jsonResult.setCode(2000);jsonResult.setData(data);return jsonResult;}
}

其请求参数 UserId

响应参数获取CarId 

package cn.tedu.chaging.common.pojo;import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;/*** 用户基本*/
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserInfoVO {/*** 车辆id*/Integer carId;}

SpringCloud

请求调用

调用代理对象的方法时,实际上是在触发Feign预先设定好的HTTP请求逻辑。传入的参数会被填入到URL模板中,形成完整的HTTP请求。

我是用nacos进行服务注册的,其中我在application.yml文件写了注册名和注册地址,

为了之后的订单服务能够选择调用用户服务,可以用户服务可以改接口再次启动

order-charging包下的application.yamlspring:application:name: orderServicecloud:nacos:server-addr: 127.0.0.1:8848
user-charging包下的application.yaml
server:port: 8086
spring:application:# 服务名称 这个会在nacos服务列表里显示name: userServicecloud:nacos:#服务注册地址server-addr: 127.0.0.1:8848

HTTP请求

请求发送

Feign利用Ribbon进行负载均衡选择目标服务器,然后通过HTTP客户端(如Apache HttpClient或OkHttp)发送实际的HTTP请求。

测试一下传入参数

package cn.tedu.charging.order;import cn.tedu.chaging.common.web.JsonResult;
import cn.tedu.charging.order.feign.UserClient;
import cn.tedu.charging.order.pojo.dto.CarInfoDto;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class FeignTests {@Autowiredprivate UserClient userClient;@Testpublic void testGetUserInfo(){JsonResult userInfo =userClient.getUserInfo(1L);System.out.println(userInfo);}
}

响应处理

收到HTTP响应后,Feign会根据配置的解码器将其解析成相应的Java对象,然后返回给调用者。

OrderService 中Service层调用Feign返回响应数据

 /*** 通过feign的方式调用用户服务* @param userId* @return*/private CarInfoDto getCarInfoByFeign(Long userId){JsonResult<UserInfoVO> userInfo = userClient.getUserInfo(userId);if (userInfo != null) {UserInfoVO data = userInfo.getData();if (data != null) {CarInfoDto carInfoDto = new CarInfoDto();BeanUtils.copyProperties(data, carInfoDto);return carInfoDto;}}return null;}

容错与熔断

Feign可以与Hystrix配合,通过设置开启熔断功能,当服务出现故障时,可以快速失败,避免连锁反应影响整个系统的稳定性。

总结

Feign的负载均衡实现主要依赖于Ribbon组件,Ribbon是一个客户端负载均衡器,而Feign则集成了Ribbon,因此当我们在Spring Cloud应用中使用Feign进行服务间调用时,自然具备了负载均衡的能力. 

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

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

相关文章

Linux 安装 Redis 教程

优质博文&#xff1a;IT-BLOG-CN 一、准备工作 配置gcc&#xff1a;安装Redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出现依赖包问题&#xff0c;在安装时提示需要的依赖包版本和本地版本不一致&#xff0c;本地版本过高&#xff0c;出现如下问题&#xff1a…

Unity 数据持久化【PlayerPrefs】

1、数据持久化 文章目录 1、数据持久化PlayerPrefs基本方法1、PlayerPrefs概念2、存储相关3、读取相关4、删除数据思考 信息的存储和读取 PlayerPrefs存储位置1、PlayerPrefs存储的数据在哪个位置2、PlayerPrefs 数据唯一性思考 排行榜功能 2、Playerprefs实践1、必备知识点-反…

springcloud第4季 分布式事务seata实现AT模式案例2【经典案例】

一 seata案例 1.1 背景说明 本案例使用seata的at模式&#xff0c;模拟分布式事务场景&#xff1a;【下订单&#xff0c;减库存&#xff0c;扣余额&#xff0c;改状态】 AT模式原理&#xff1a;是2pc方案的演变&#xff0c; 一阶段&#xff1a;业务数据和回滚日志记录在同一…

九浅一深Jemalloc5.3.0 -- ②浅*size class

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

DB2数据库日常维护

一、DB2系统结构 创建实例 db2icrt 实例名 删除实例 db2idrop 实例名 查询实例 db2ilist 实例名 启动实例 db2start 停止实例 db2stop 创建数据库 create database 库名 [on 存储路径] [using codeset 字符集] [TERRITORY 区域码] [pagesize 页大小] 删除数据库 drop database…

网安小贴士(2)OSI七层模型

一、前言 OSI七层模型是一种网络协议参考模型&#xff0c;用于描述计算机网络体系结构中的不同层次和功能。它由国际标准化组织 (ISO) 在1984年开发并发布。 二、定义 OSI七层模型&#xff0c;全称为开放式系统互联通信参考模型&#xff08;Open Systems Interconnection Refe…

VTK学习日志:基于VTK9.3.0+Visual Studio c++实现DICOM影像MPR多平面重建+V R体绘制4个视图展示功能的实现(二)

前段时间对VTK9.3.0进行了编译&#xff0c;开发了MPRVR实现的demo,显示效果不是很理想&#xff0c;正好趁着周末有时间&#xff0c;再度对之前的程序进行优化和完善&#xff0c;先展示下效果&#xff1a; VTK实现MPRVR四视图 再次讲解下基于VTK的MPRVR实现的简单项目创建过程&a…

Cherno 游戏引擎笔记 (45~60)

有几个部分的笔记以图片形式呈现&#xff08;如果没找到文本可以查看是否遗漏了图片笔记&#xff09; My Github REPO(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno) 源码笔记&#xff0c;希望帮到你 :-} ---Shader Library&#xff08;着色器库&…

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥&#xff0c;然后喝了它。 ——2024年7月1日 书接上回&#xff1a;区间动态规划——最长回文子串&#xff08;C&#xff09;-CSDN博客&#xff0c;大家有想到解决办法吗&#xff1f; 题目描述 给定一个字符串s&#xff08;s仅由数字和英文大小写字母组成&#xff0…

9*AGV,669万,海康,中!

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下是近期&#xff0c;几个智能物流相关的中标项目。 红云红河集团物流中心新建烟叶仓储设施项目智能叉车购置项目 本次项目主要包括以下三个方面的采购和实施&#xff1a; (1) 智能…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们&#xff0c;欢迎来到我们的设计模式专题&#xff0c;今天的讲解的设计模式&#xff0c;还是单例模式哦&#xff01;上次讲解的单例模式是基于Python实现&#xff08;独一无二的设计模式——单例模式&#xff08;python实现&#xff09;&#xff09;的&am…

[leetcode]squares-of-a-sorted-array. 有序数组的平方

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int n nums.size();vector<int> ans(n);for (int i 0, j n - 1, pos n - 1; i < j;) {if (nums[i] * nums[i] > nums[j] *…

春秋云境:CVE-2022-25411[漏洞复现]

根据题目提示和CNNVD优先寻找后台管理地址 靶机启动后&#xff0c;使用AWVS进行扫描查看网站结构 在这里可以看到后台管理的登录地址&#xff1a;/admin/&#xff0c;根据题目提示可知是弱口令 尝试admin、123456、admin666、admin123、admin888...等等常见弱口令 正确的账户…

java笔记(30)——反射的 API 及其 使用

文章目录 反射1. 什么是反射2. 获取class字段&#xff08;字节码文件对象&#xff09;方式1方式2方式3应用 3. 获取构造方法和权限修饰符前期准备获取所有的公共构造方法获取所有的构造方法获取无参构造方法获取一个参数的构造方法获取一个参数的构造方法获取两个参数的构造方法…

【日常记录】【JS】SSE 流式传输 ChatGPT 的网络传输模式

文章目录 1、SSE 流式传输2、后端代码3、前端代码5、SSE和WS 对比6、chatgpt SSE的服务端返回的数据参考链接 单工通信是一种单向的通信方式&#xff0c;其中信息只能从发送端传输到接收端&#xff0c;而接收端不能向发送端发送任何信息。在Web开发中&#xff0c;Server-Sent E…

FL Studio 21 中文版分享(内含破解补丁)不是标题党

不知道为什么现在钓鱼的这么多&#xff08;有答案的请在评论区上告诉我&#xff09;&#xff0c;就一个学习版的编曲软件有必要这样子搞吗&#xff1f;我也是在各类博客上找了一大堆教程&#xff0c;根本没几个能用的&#xff0c;索性直接到兔八哥爱分享上找了一个&#xff0c;…

C程序设计谭浩强第五版

程序习题 第一章1、第5题2、第6题 第三章1、第2题2、第2题3、第3题4、第4题Tips 第一章 1、第5题 编写一个C程序,运行时输出以下图形: #include <stdio.h> int main() {for (int i 0; i < 4; i) // 输出4行循环控制{for (int j 0; j < i; j) //第几行就输出几…

【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真

题目 7 &#xff1a;玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴&#xff0c;能够实现弹奏和音符显示功 能。 具有 8 个音阶按键&#xff0c;每按下一个按键时&#xff0c;所对应的 LED 点亮&#xff0c;音符进行显示。 具体要求如下&#xff1a; &…

PV操作经典例题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️1.水果问题2.和尚打水问题3.餐厅职员问题4.汽车站点问题5.观察者-报告者问题6..阅览室问题 …

DEBOPIE框架:打造最好的ChatGPT交易机器人

本文介绍了如何利用 DEBOPIE 框架并基于 ChatGPT 创建高效交易机器人&#xff0c;并强调了在使用 AI 辅助交易时需要注意的限制以及操作步骤。原文: Build the Best ChatGPT Trading Bots with my “DEBOPIE” Framework 如今有大量文章介绍如何通过 ChatGPT 帮助决定如何以及在…