Feign组件
一、简介
Feign是Netflix开发的声明式,模块化的HTTP客户端
1 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2 配置调用接口
/*
* 声明需要调用的微服务名称
* @FeignClient
* */
@FeignClient(name = "service-product")
public interface ProductFeignClient {
/*
* 配置需要调用的微服务接口
* */
@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable Long id);
}
3 在启动类上激活feign
@EnableFeignClients
4 通过自动的接口调用远程微服务
@Autowired
private ProductFeignClient productFeignClient;
@GetMapping("{id}")
public Product findById(@PathVariable Long id){
Product product = productFeignClient.findById(id);
return product;
}
二:日志追踪
配置服务消费者的配置文件
# 配置feign日志输出
# 日志级别: NONE(不输出日志,性能高) BASIC(适用于生产环境追踪问题)
# HEADERS(在BASIC基础上,记录请求和响应头信息) FULL(记录所有信息)
feign:
client:
config:
service-product: # 需要调用的服务名称,即服务服务提供者
loggerLevel: FULL
logging:
level:
com.gfy.eureka.feign.ProductFeignClient: debug
三、源码分析
启动类 @EnableFeignClients
--->FeignClientsRegister.class(1.注册配置2.创建并注册FeignClientFactoryBean对象)
--->FeignClientFactoryBean
--->FeignInvocaitonHandler(动态代理对象)
扫描所有@FeignClien注解,找到对应的接口
创建标注了@FeignClient接口的动态代理对象FeignInvocationHandler
四、高并发问题
由于tomcat会以线程池的形式对所有请求进行统一管理,所以当某个方法存在耗时问题时,
外面积压的请求越来越多,会导致其他请求无法访问,最终导致系统的崩溃
为了解决该问题,采用两种方法:
1.线程池隔离(为访问量高的接口创建独立的线程池)
2.信号量隔离(为每个请求设置访问阈值,请求量若超过阈值,则请求失败)
五:雪崩
由于系统服务之间的强依赖性,导致在某服务处于长时间等待时,导致依赖其服务的服务积压过多的请求,造成服务瘫痪(故障传播)。
解决方法:
1.服务隔离
2.熔断降级
3.服务限流
Feign组件的更多相关文章
- Spring Cloud Feign组件
采用Spring Cloud微服务框架后,经常会涉及到服务间调用,服务间调用采用了Feign组件. 由于之前有使用dubbo经验.dubbo的负载均衡策略(轮训.最小连接数.随机轮训.加权轮训),du ...
- docker 部署springcloud Feign组件无法访问问题
如题: docker部署后的服务注册ID是这样的. 这导致了Feign在调用其他组件的时候访问不到. 解决: 在docker部署指令添加EUREKA_INSTANCE_IP-ADDRESS=[你的IP ...
- springcloud微服务feign组件报错
今天在用springcloud搭建微服务时,利用feign做通讯组件,结果报错 java.lang.IllegalStateException: Failed to introspect Class ...
- ②SpringCloud 实战:引入Feign组件,完善服务间调用
这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...
- SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡
本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...
- Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题
问题描述 最近在使用Spring Cloud改造现有服务的工作中,在内部服务的调用方式上选择了Feign组件,由于服务与服务之间有权限控制,发现通过Feign来进行调用时如果发生了401.407错误时 ...
- 不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用
在微服务架构中,如果使用得是SpringCloud,那么只需要集成SpringFeign就可以了,SpringFeign可以很友好的帮我们进行服务请求,对象解析等工作. 然而SpingCloud是依赖 ...
- 深入Eureka/Feign/Hystrix原理学习(1)
第一步: 创建注册中心项目,引入cloud discovery相关依赖. ①在pom文件中引入相关依赖. ②在启动类上加上@EnableEurekaServer注解,标注这是一个注 册中心. ③在ap ...
- Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...
- SpringCloud微服务架构分布式组件如何共享session对象
一.简单做一个背景说明1.为说明问题,本文简单微服务架构示例如下 2.组件说明分布式架构,每个组件都是集群或者主备.具体说明如下:zuul service:网关,API调用都走zuul service ...
随机推荐
- python自动化-取消"Chrome正受到自动软件的控制"提示
chrome浏览器V78及以上版本解决做法,代码如下: from selenium import webdriver chrome_options = webdriver.ChromeOptions( ...
- “初始化 Java 工具”期间发生了内部错误, java.lang.NullPointerException
今天刚打开eclipse就报了这个错误,我怀疑是昨晚想关电脑的时候,关闭eclipse太快,没有等待工作空间保存就关了电脑的缘故 错误如图: (图片来自下方链接博客,因为忘记截图了) 我百度后按照提示 ...
- WCF教程 简单入门
版权 本文摘自 http://www.cnblogs.com/iamlilinfeng 本人只做了搬运工 转载请注明出处:http://www.cnblogs.com/iamlilinfeng ...
- HIVE- concat方法
(1)concat_ws() select user ,concat_ws(';' , collect_set(cast(amt as string))) as amt from table grou ...
- Kubernetes--Pod生命周期中的重要行为
Pod生命周期中的重要行为 除了创建应用容器(主容器及其辅助容器)之外,用户还可以为Pod对象定义其生命周期中的多种行为,如初始化容器.存活性探测及就绪性探测等. 初始化容器 初始化容器 (init ...
- didi-笔试
import java.util.*; /** * 正整数,没有前导0 * 相邻的数字不能相同 * 可以被3整除 * 输入:?12?0?9?? * 输出:212101902 */ public cla ...
- (0409) Pycharm 的设置--参数设置(运行.py文件带参数,例如argument) 比如: demo.py -prj xxx
1) https://www.cnblogs.com/yksgzlyh/p/10221960.html 点击"Run"菜单下的"Edit Configurations. ...
- 掌控安全学院SQL注入靶场
注入的本质:用户输入的字符被带入数据库中并且执行了 靶场地址:http://inject2.lab.aqlab.cn/ 第六关:http://inject2.lab.aqlab.cn/Pass-06/ ...
- MyBatis_07(动态SQL)
动态SQL: Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能, 它存在的意义是:"为了解决拼接SQL语句字符串时的痛点问题". 一.If if标签可通 ...
- a菜单点击标红,其他标黑代码
<script> let aList = document.querySelectorAll('a'); console.log(aList); for (let index = 0; i ...