本文为博主原创,未经允许不得转载:  

  1. Feign 日志级别配置

  2. Feign client 封装调用

  3. Feign 定义熔断降级方法

  4. 通过 FallbackFactory 工厂 实现降级

  5. 配置 @FeignClient 的 configuration 属性

  6. 配置http 连接池

  7. feign 配合 hystrix 超时熔断配置

  

  Feign 是NetFlix 开源的声明式的 HTTP 客户端。一般在服务消费端实现 Feign 的客户端,进行服务调用。

  1. Feign 日志级别配置

    Feign 默认实现调用时,不会打印调用的请求日志。配置 feign client 调用日志打印:

feign:
client:
config:
# 全局配置
default:
loggerLevel: full

   Feign 日志级别及打印内容:

日志级别 打印内容
NONE(默认值) 不打印任何日志
BASIC 仅记录请求方法,url,响应状态以及执行时间
HEADERS 在BASIC的基础上,记录了请求和响应的HEADER
FULL 记录请求和响应的header,body和元数据

  2.Feign client 封装调用:

     2.1 添加 feign 的pom 依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>

    2.2 定义Feign client接口,并在启动类添加 @EnableFeignClients 注解

import com.contentcenter.domain.dto.user.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "user-center") // name为调用的服务模块名称
public interface UserCenterFeignClient {
/**
* http://user-center/users/{id}
*
* @param id
* @return
*/
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}

    2.3 非用户中心可通过在自己侧封装的 Feign client 进行调用,获取用户数据:

    @Autowire
private UserCenterFeignClient userFeignClient; @Test
public void test(){
UserDTO userDto = userFeignClient.findById(11);
system.out.println(JSON.toJsonString(userDto));
}

  

  3. Feign 定义熔断降级方法

    3.1 自定义实现 FeignClient 的接口返回

@Component
public class UserCenterFeignClientFallback implements UserCenterFeignClient {
@Override
public UserDTO findById(Integer id) {
UserDTO userDTO = new UserDTO();
userDTO.setWxNickname("流控/降级返回的用户");
return userDTO;
}
}

    3.2 在定义Feign client 时指定 fallback 方法

import com.contentcenter.domain.dto.user.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name = "user-center",fallback = UserCenterFeignClientFallback.class)
public interface UserCenterFeignClient {
/**
* http://user-center/users/{id}
*
* @param id
* @return
*/
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}

  4. 通过 FallbackFactory 工厂 实现降级

      通过 FallbackFactory 实现的降级可以捕获 熔断的异常信息,而通过方法实现的熔断,则不能获取熔断的异常信息。

    所以推荐使用 FallbackFactory 进行降级实现。

import com.contentcenter.domain.dto.user.UserDTO;
import com.contentcenter.feignclient.UserCenterFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; @Component
@Slf4j
public class UserCenterFeignClientFallbackFactory implements FallbackFactory<UserCenterFeignClient> {
@Override
public UserCenterFeignClient create(Throwable cause) {
return new UserCenterFeignClient() {
     // 当 UserCenterFeignClient 有多个方法时,在这里逐个重写实现即可
@Override
public UserDTO findById(Integer id) {
log.warn("远程调用被限流/降级了", cause);
UserDTO userDTO = new UserDTO();
userDTO.setWxNickname("流控/降级返回的用户");
return userDTO;
}
};
}
}

  调用方式:

@FeignClient(name = "user-center",fallbackFactory = UserCenterFeignClientFallbackFactory.class)

  5. 配置 @FeignClient 的 configuration 属性

    通过@FeignClient 的 configuration 属性可以实现对 feign请求的自定义封装。如实现拦截配置,对 feign 请求添加认证请求头,添加 ssl 认证等等。

    具体可参考我的这篇文章: spring cloud 通过feign请求设置请求头    https://www.cnblogs.com/zjdxr-up/p/14152438.html

  

  6. 配置http 连接池

    添加依赖

    <dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

    添加配置:

feign:
httpclient:
# 让feign使用apache httpclient做请求;而不是默认的urlconnection
enabled: true
# feign的最大连接数
max-connections: 200
# feign单个路径的最大连接数
max-connections-per-route: 50

  7. feign 配合 hystrix 超时熔断配置:

      Spring Cloud Feign HTTP请求异常 Fallback 容错机制,它是基于Hystrix实现的,所以要通过配置参数 feign.hystrix.enabled=true 

    开启该功能,以及配置 hystrix 超时时间。

feign:
hystrix:
enabled:true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000

  

Feign 实现微服务调用及进行服务熔断与降级的更多相关文章

  1. 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

  2. spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

  3. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 外部服务调用、内部服务调用优化,面向服务化的

    现在的信息系统越来越复杂,越来越庞大,不仅需要内部是一个整体,而且还需要提供很多对外的服务调用. 1:别人如何调用最方便?用不同的开发语言调用.例如app.手持设备.服务器.2:服务的返回状态是什么样 ...

  4. 18_Android中Service的生命周期,远程服务,绑定远程服务,aidl服务调用,综合服务案例,编写一个应用程序调用远程支付宝远程服务场景

    ============================================================================ 服务的生命周期: 一.采用start的方式开始 ...

  5. Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

  6. go微服务系列(三) - 服务调用(http)

    1. 关于服务调用 2. 基本方式调用服务 3. 服务调用正确姿势(初步) 3.1 服务端代码 3.2 客户端调用(重要) 1. 关于服务调用 这里的服务调用,我们调用的可以是http api也可以是 ...

  7. .Net 7 轻松上手Dapr之服务调用

    前言 对于Dapr ,在项目中也有用过一段时间,优缺点并存,但是瑕不掩瑜,目前随着版本的迭代和第三方团队对它的支持也使得我们用得更加得心应手,所以借此也回顾一下Dapr的相关知识以及分享一下项目中用到 ...

  8. Dubbo——服务调用过程

    文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...

  9. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  10. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

随机推荐

  1. AI助力软件工程师高效工作:8款神器助你优化工作流程

    随着人工智能技术的不断发展,AI工具在软件工程领域展现出强大的应用潜力.善用 AI 工具可以消除繁琐事务带来的倦怠,帮助软件工程师更好地传达想法,完成更高质量的工作.我们可以将 AI 以各种方式应用于 ...

  2. 在蓝图中使用flask-restful

    flask-restful中的Api如果传递整个app对象,那么就是整个flask应用都被包装成restful. 但是,你可以只针对某个蓝图(django中的子应用)来进行包装,这样就只有某个蓝图才会 ...

  3. 【笔记整理】忽略https证书校验

    import requests url = "https://sam.huat.edu.cn:8443/selfservice/" # 默认不忽略ssl证书,如果有证书问题的网站会 ...

  4. MySQL 8.0.32 InnoDB ReplicaSet 配置和手动切换

    1.环境准备 主库:192.168.137.4 mytest3 从库:192.168.137.5 mytest4 MySQL: 8.0.32 2.配置 ReplicaSet 实例 启动 mysql s ...

  5. 基于 WinCC OA 构建分布式可视化平台

    ​WinCC OA 的全称是:SIMATIC WinCC Open Architecture,是西门子工业自动化品牌SIMATIC系列的一部分.专门针对客户定制大型和/或复杂的应用以及需要满足特定系统 ...

  6. 《An End-to-end Model for Entity-level Relation Extraction using Multi-instance Learning》阅读笔记

    代码   原文地址   预备知识: 1.什么是MIL? 多示例学习(MIL)是一种机器学习的方法,它的特点是每个训练数据不是一个单独的实例,而是一个包含多个实例的集合(称为包).每个包有一个标签,但是 ...

  7. springboot的启动器

    前言 ~ 面试的时候,被问到springboot 官方提供的启动器常见的有哪些?(头大) 正文 ~ 启动器作用: 启动器是为了 适应 一个特定的场景的,里面定义了 这个场景下 需要用到的依赖. 启动器 ...

  8. 使用MediaDevices接口实现录屏技术

    摘要:本文将介绍如何使用JavaScript的MediaDevices接口实现录屏功能.我们将通过WebRTC技术捕获用户的屏幕或摄像头画面,并将其编码为MP4视频文件. 在线录屏是指在互联网上进行屏 ...

  9. 云图说 | MSSI之应用业务模型ABM,搭建业务与技术的数据治理桥梁

    摘要:应用业务模型ABM(Application Business Model)是MSSI为客户提供的统一模型管理服务. 本文分享自华为云社区<[云图说] | 第274期 MSSI之应用业务模型 ...

  10. 面向对象的Python编程,你需要知道这些!

    摘要:Python 没有像 java 中的"private"这样的访问说明符.除了强封装外,它支持大多数与"面向对象"编程语言相关的术语.因此它不是完全面向对象 ...