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/eureka
4. 创建主启动类
@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…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...