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…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
 
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
 
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
 
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
 
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
