SpringCloud-7_OpenFeign服务调用
OpenFeign介绍
OpenFeign是什么
1.OpenFeign是个声明式WebService客户端,使用OpenFeign让编写Web Service客户端更简单
2.它的使用方法是定义一个服务接口然后在上面添加注解
3.OpenFeign也支持可拔插式的编码器和解码器
4.Spring Cloud对OpenFeign进行了封装使其支持了Spring MVC标准注解和HttpMessageConverters
5.OpenFeign可以与Eureka和Ribbon组合使用以支持负载均衡
官网:
github.com/spring-cloud/spring-cloud-openfeign
Feign和OpenFeign区别
Feign,目前已弃用:
·Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
·Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
·Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务
·Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign
·Feign本身不支持Spring MVC的注解,它有一套自己的注解
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>
</dependency>OpenFeign
·OpenFeign是Spring Cloud在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
·OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口
·OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
精简一句话:OpenFeign就是在Feign基础上做了加强,有些程序员为了方便,说Feign就是指的OpenFeign
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>OpenFeign-应用实例
对于 获取服务+负载均衡+远程调用 这样的架构,之前用的方案1,现在来使用方案2:
方案1:Ribbon+RestTemplate
方案2:OpenFeign
创建新module: e-commerce-consumer-openfeign-80
配置pom.xml文件,参考原e-commerce-consumer-80
在consumer的pom.xml基础上,添加openfeign的依赖
<!--引入openfeign场景启动器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>配置application.yml文件
server:port: 80 #配置端口
spring:application:name: e-commerce-consumer-openfeign-80 #配置在服务器显示的名字
eureka:client:register-with-eureka: true #将自己注册到服务端fetch-registry: true #从服务端抓取注册列表service-url: #注册到的服务器地址# 使用逗号分隔多个服务器地址defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka4. 创建主启动类
@EnableEurekaClient 启用Eureka客户端
@EnableFeignClients 启用OpenFeign客户端
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MemberConsumeOpenfeignApplication {public static void main(String[] args) {SpringApplication.run(MemberConsumeOpenfeignApplication.class,args);}
}5. 创建Service层接口
感觉还是有点绕的,理清一下思路。
浏览器地址-->Consumer(Controller.selectByIdTest->.Service.selectByIdTest->url)
-->openfeign-->Provider(url->Controller.selectById->Service->DAO)
这儿作为消费者consumer模块需要去-->调用provider的模块,需要对面的地址,所以有@GetMapping("/member/query/{id}")要使用
而注解下面的方法,是给Controller层调用的,这儿起到接口的作用来解耦。所以最好就是复制调用对象的方法,当然方法名自己可以更改(不建议),下面加了Test进行测试确认可以更名。
所以联系起来就是。Controller调用->Service接口方法,通过该方法反射到注解的路径,此时Feign来决定调用MEMBER-SERVICE-PROVIDER里面具体哪台服务器,起到负载均衡的作用。
(个人理解)这儿的Mapper是被方法所使用的,provider的Mapper是用来定位方法的。
/*** 1.远程调用的方式是get。跟随引用的provider一致,而它又是根据方法名来选择的,比如“get”ForObject()* 2.远程调用url http://MEMBER-SERVICE-PROVIDER/member/get/{id}。* 经测试,大小写都能用。无论从Eureka网页复制(大写),还是pom.xml复制的(小写)都行* 3.MEMBER-SERVICE-PROVIDER就是服务提供方在Eureka Server注册的服务* 4.openfeign会根据负载均衡来决定调用10000/10002,默认是轮询*/
@Component
@FeignClient("member-service-provider")
public interface MemberConsumerOpenfeignService {@GetMapping("/member/query/{id}")public Result selectByIdTest(@PathVariable("id")Long id);
}6. 创建Controller/Mapper映射,调用Service层
@RestController。因为返回类型的缘故,需要使用Json格式,所以使用@ResponseBody的组合形式。
@RestController
public class MemberConsumerOpenfeignController {@Resourceprivate MemberConsumerOpenfeignService feignService;@GetMapping("/member/feign/query/{id}")public Result getResultById(@PathVariable Long id){return feignService.selectByIdTest(id);}测试
启动各服务,浏览器输入:http://localhost/member/feign/query/1 。通过刷新查看返回的不同provider确定成功使用。
注意事项
·配Openfeign的使用特点是微服务调用接口+@FeignClient,使用接口进行解耦
@FeignClient(value="MEMBER-SERVICE-PROVIDER"),这里MEMBER-SERVICE-PROVIDER就是Eureka提供注册的名称,不要写错了
·接口方法上:value是不能乱写,远程调用的url为
http://MEMBER-SERVICE-PROVIDER/member/get/{id}
@GetMapping(value ="/member/get/(id)")
public Result<Member>getMembertByld(@PathVariable("id")Long id);OpenFeign日志配置
基本介绍
说明:Feign提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign接口的调用情况进行监控和输出。也便于调试。
2.日志级别
NONE:默认的,不显示任何日志
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置日志-应用实例
配置类
设置日志级别
@Configuration
public class OpenfeignConfiguration {@Beanpublic Logger.Level setLevel(){return Logger.Level.FULL;}
}配置yml
常见的日志级别有5种,分别是error、warn、info、debug、trace
error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的:
warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
debug:用于开发DEBUG的,关键逻辑里面的运行时数据;
trace:最详细的信息,一般这些信息只记录到日志文件中。
注意level下面类的全路径,指向Service,差点写错了
logging:level:com.stein.springcloud.service.MemberConsumerOpenfeignService: debug测试
不使用,可撤销测试日志配置
OpenFeigni超时
手动超时
默认超过1s,返回超时。在两个provider的controller.selectById()添加代码:
手动设置超时。不能使用线程休眠,导致该provider无法使用
try {
// Thread.sleep(2000);TimeUnit.MILLISECONDS.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}设置多久超时
在consumer-openfeign的yml设置超时时长
ribbon:#1,设置Feign客户端超时时间(openfeign,默认支铆ibbon)#2.ReadTimeout:8000:建立连接从服务提供方获取可用资源的所用的全部时间#3.时间单位是毫秒ReadTimeout: 4000#连接超时时间ConnectionTimeout: 4000测试
地址栏输入:http://localhost/member/feign/query/1 查看设置前后,是否超时。
相关文章:
SpringCloud-7_OpenFeign服务调用
OpenFeign介绍OpenFeign是什么1.OpenFeign是个声明式WebService客户端,使用OpenFeign让编写Web Service客户端更简单2.它的使用方法是定义一个服务接口然后在上面添加注解3.OpenFeign也支持可拔插式的编码器和解码器4.Spring Cloud对OpenFeign进行了封装使其支持了S…...
解决docker容器之间网络互通
docker容器之间相互访问 1.查看当前的网络 Copy [roothost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 3dd4643bb158 bridge bridge local 748b765aca52 host host …...
测试微服务:快速入门指南
在过去几年中,应用程序已经发展到拥有数百万用户并产生大量数据。使用这些应用程序的人期望快速响应和 24/7 可用性。为了使应用程序快速可用,它们必须快速响应增加的负载。 一种方法是使用微服务架构,因为在单体应用程序中,主要…...
MySQL Show Profile分析
6 Show Profile分析(重点) Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量 官网文档 默认情况下,参数处于关闭状态,并保存最近15次的运行结果 分析步骤: 1、是否…...
基于Docker快速搭建蜜罐Dionaea(30)
实验目的 1. 快速搭建Dionaea蜜罐 2. 使用Nmap扫描测试Dionaea蜜罐预备知识1. 初步认识Dionaea dionaea,中文的意思即捕蝇草,是否形容蜜罐很形象?dionaea是nepenthes(猪笼草)的发展和后续,更加容易被部署和…...
WP_Query 的所有参数及其讲解和实用案例
WP_Query 是 WordPress 提供的一个强大的查询工具,用于获取与当前页面或文章相关的内容。下面是 WP_Query 的所有参数及其讲解:author: 查询特定作者的文章。可以是作者 ID、作者登录名或作者昵称。实用案例:查询作者为 "John Smith&quo…...
100个网络运维工作者必须知道的小知识!(上)
1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI参考模型的层次是什么? 有7个OSI层:物理层,数据链路层,网络层,传输…...
Python如何获取大量电影影评,做可视化演示
前言 《保你平安》今天上映诶,有朋友看过吗,咋样啊 这是我最近比较想看的电影了,不过不知道这影评怎么样,上周末的点映应该是有蛮多人看的吧,可以采集采集评论看过的朋友发出来的评论,分析分析 这周刚好…...
【C语言】详讲qsort库函数
qsort函数介绍具体作用qsort函数是一种用于对不同类型数据进行快速排序的函数,排序算法有很多最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,qsort函数的底层原理是一种快速排序.基本构造qsort( void* arr, int sz, int sizeof, cmp_code);…...
SEO技术风口来了|SEO能否抓住全球约93%的网络用户?
开篇词作者/出品人 | 美洽 SEO 流量专家 白桦为什么要做一个 SEO 专栏?在一部分人眼中,SEO(搜索引擎优化)已经是老掉牙的玩意儿,在这个信息爆炸的年代,它似乎已经无法承担吸引流量的主要作用。但ÿ…...
mxnet版本与numpy,requests等都不兼容问题
简介 跟着李沐学AI时遇到的mxnet环境问题。 问题 使用pip install mxnet时会重新安装相匹配的numpy和requests,而这新安装的这两个版本不满足d2l所需的版本。 然后报错: ERROR: pips dependency resolver does not currently take into account all …...
逆向分析——壳
你脑海中的壳是什么 壳在自然界是动物的保护壳,软件同样有保护壳,为了防止破解 也许大海给贝壳下的定义是珍珠,也许时间给煤炭下的定义是钻石 ——沙与沫 壳的由来 在DOS时代,壳一般指的是磁盘加密软件中的一段加密程序 后来发展…...
为 Argo CD 应用程序指定多个来源
在 Argo CD 2.6 中引入多源功能之前,Argo CD 仅限于管理来自 单个 Git 或 Helm 存储库 的应用程序。用户必须将每个应用程序作为 Argo CD 中的单个实体进行管理,即使资源存储在多个存储库中也是如此。借助多源功能,现在可以创建一个 Argo CD 应用程序,指定存储在多个存储库…...
verilog specify语法
specify block用来描述从源点(source:input/inout port)到终点(destination:output/inout port)的路径延时(path delay),由specify开始,到endspecify结束&…...
CMake编译学习笔记
CMake学习笔记CMake编译概述CMake学习资源CMake编译项目架构cmake指令CMakeList基础准则CMakeList编写项目构建cmake_minimum_required() 和 project()set()find_package()add_executable()aux_source_directory()连接库文件include_directories()和target_include_directories…...
Day913.反向代理和网关是什么关系 -SpringBoot与K8s云原生微服务实践
反向代理和网关是什么关系 Hi,我是阿昌,今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术,用于将客户端的请求转发到一个或多个服务器上,并将响应返回给客户端。与正向代理不同&am…...
IT行业就业趋势显示:二季度平均月薪超8千
我国的IT互联网行业在近些年来规模迅速扩大,技能和技术水平也明显提升,目前IT互联网行业已经成为社会发展中新型产业的重要组成部分,行业的人才队伍也在不断的发展壮大,选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...
【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
简介 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端…...
C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator
今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:DrawMoveIndicator属性:表示确定移动分隔符时是否绘制移动…...
Java的jar包打包成exe应用
将springboot项目使用maven打出的jar包,打成windows平台下exe应用程序包(自带jre环境)。 工具:1、exe4j 2、Inno Setup 工具放到网盘,链接:https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
