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

  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. Selenium基本使用、过检测

    import time from selenium import webdriver from selenium.webdriver.chrome.service import Service as ...

  2. 如何使用Redisson实现分布式锁?

    在分布式系统中,当多个线程(或进程)同时操作同一个资源时,为了保证数据一致性问题,所以就需要一种机制来确保在同一时间只有一个线程(或进程)能够对资源进行修改,这就是分布式锁的作用. 分布式锁是一种在分 ...

  3. GO的逃逸分析

    逃逸分析 前言 指的就是由编译器决定内存分配的位置,不需要由程序员来指定.函数中申请一个新的对象,其目的是为了提高程序的性能,减少内存分配和垃圾回收的开销. 分配在 栈 中, 则函数执行结束则可自动将 ...

  4. Python——第五章:csv模块

    未来我们会使用爬虫获取到一些json文件,例如去英雄联盟官方爬取英雄的数据库 查看代码 {"hero":[{"heroId":"1",&qu ...

  5. NoClassDefFoundError: javax/el/ELManager

    Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager at org.hibernate.validator.messageinte ...

  6. Java中ArrayList的遍历与删除元素方式总结

    在Java编程中,我们经常需要对数据结构进行遍历操作,并根据业务需求删除部分元素.而数组列表(ArrayList)是集合类中的一种,它可以动态地添加和删除元素,非常适合在程序中使用.本篇博客将总结Ar ...

  7. 理论+实践详解最热的LLM应用框架LangChain

    本文分享自华为云社区<LangChain是什么?LangChain的详细介绍和使用场景>,作者:码上开花_Lancer . 一.概念介绍 1.1 Langchain 是什么? 官方定义是: ...

  8. 技术实践丨GaussDB(DWS)运维管理功能“升级”的原理和使用

    摘要:本文将详细介绍GaussDB(DWS)重要运维管理功能"升级"的原理和使用. 运维管理模块是任何软件产品最基础和重要的一部分.是软件产品的门户,也是用户接触和使用软件产品的和 ...

  9. 共赴元宇宙新纪元,华为云VR开发应用大赛总决赛倒计时7天!

    摘要:"第三届华为云VR开发应用暨沈阳元宇宙开发应用大赛"总决赛即将于2月13日在沈阳市和平区揭幕. 由沈阳市和平区人民政府.华为技术有限公司共同主办的"第三届华为云VR ...

  10. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!

    摘要:在华为全联接2021期间,华为云GaussDB(for openGauss)正式推出重大内核新特性--同城双集群高可用方案,提供金融级高可用服务,支持RPO=0 .RTO<60s的同城双集 ...