SpringCloud feign服务熔断下的异常处理

spring-cloud微服务 feign调用 本地调试问题 现象反馈,公司微服务间相互调用时通过feignClient来实现,feignClient自带负载均衡(轮询),  但是本地调试时候,大家都用同一个注册中心Eureka Server  有几率分发至其他机器,而不是本地自己调试机器   解决办法: 1、目前已经有部门同事(包括本人)解决办法是 自己修改端口号,修改@FeignClient(value = "11501-pica-cloud-h... 阅读详情

2019-01-18 10:21 在此推荐下自个的一个基础复习库,囊括常见的数据结构和算法以及一些解决方案,还处于更新状态

---------------------------------------------------------------------------------------------------------------------------------------

 

今天做项目的时候,遇到一个问题,如果我调用某个服务的接口,但是这个服务挂了,同时业务要求这个接口的结果是必须的,那我该怎么办呢,答案是通过hystrix,但是又有一点,服务不是平白无故挂的(排除服务器停电等问题),也就是说有可能是timeout or wrong argument 等等,那么我该如何越过hystrix的同时又能将异常成功抛出呢

第一点:先总结一下异常处理的方式:

 1):通过在controller中编写@ExceptionHandler 方法  ,直接在controller中编写异常处理器方法

	@RequestMapping("/test")
	public ModelAndView test()
	{
		throw new TmallBaseException();
	}
	@ExceptionHandler(TmallBaseException.class)
	public ModelAndView handleBaseException()
	{
		return new ModelAndView("error");
	}

但是呢这种方法只能在这个controller中有效,如果其他的controller也抛出了这个异常,是不会执行的

2):全局异常处理:

@ControllerAdvice
public class AdminExceptionHandler
{
	@ExceptionHandler(TmallBaseException.class)
	public ModelAndView hAndView(Exception exception)
	{
		//logic
		return null;
	}
}

本质是aop代理,如名字所言,全局异常处理,可以处理任意方法抛出的异常

3)通过实现SpringMVC的HandlerExceptionResolver接口

public static class Tt implements HandlerExceptionResolver
	{

		@Override
		public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
				Exception ex)
		{
			//logic
			return null;
		}
		
	}

然后在mvc配置中添加即可
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {

  
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
    //初始化异常处理器链
        exceptionResolvers.add(new Tt());
    }


}

接下来就是Fegin ,如果想自定义异常需要了解1个接口:ErrorDecoder

先来看下rmi调用结束后是如果进行decode的

Object executeAndDecode(RequestTemplate template) throws Throwable {
    Request request = targetRequest(template);

    //代码省略
    try {
      if (logLevel != Logger.Level.NONE) {
        response =
            logger.logAndRebufferResponse(metadata.configKey(), logLevel, response, elapsedTime);
        response.toBuilder().request(request).build();
      }
      if (Response.class == metadata.returnType()) {
        if (response.body() == null) {
          return response;
        }
        if (response.body().length() == null ||
                response.body().length() > MAX_RESPONSE_BUFFER_SIZE) {
          shouldClose = false;
          return response;
        }
        // Ensure the response body is disconnected
        byte[] bodyData = Util.toByteArray(response.body().asInputStream());
        return response.toBuilder().body(bodyData).build();
      }
      //从此处可以发现,如果状态码不再200-300,或是404的时候,意味着非正常响应
就会对内部异常进行解析
      if (response.status() >= 200 && response.status() < 300) {
        if (void.class == metadata.returnType()) {
          return null;
        } else {
          return decode(response);
        }
      } else if (decode404 && response.status() == 404 && void.class != metadata.returnType()) {
        return decode(response);
      } else {
        throw errorDecoder.decode(metadata.configKey(), response);
      }
    } catch (IOException e) {
      if (logLevel != Logger.Level.NONE) {
        logger.logIOException(metadata.configKey(), logLevel, e, elapsedTime);
      }
      throw errorReading(request, response, e);
    } finally {
      if (shouldClose) {
        ensureClosed(response.body());
      }
    }
  }

默认的解析方式是:

 public static class Default implements ErrorDecoder {

    private final RetryAfterDecoder retryAfterDecoder = new RetryAfterDecoder();

    @Override
    public Exception decode(String methodKey, Response response) {
        //获取错误状态码,生成fegin自定义的exception
      FeignException exception = errorStatus(methodKey, response);
      Date retryAfter = retryAfterDecoder.apply(firstOrNull(response.headers(), RETRY_AFTER));
      if (retryAfter != null) {
        //如果重试多次失败,则抛出相应的exception
        return new RetryableException(exception.getMessage(), exception, retryAfter);
      }
    //否则抛出默认的exception
      return exception;
    }

我们可以发现,做了2件事,第一获取状态码,第二重新抛出异常,额外的判断是否存在多次失败依然error的异常,并没有封装太多的异常,既然如此那我们就可以封装我们自定义的异常了

但是注意,这块并没有涉及hystrix,也就意味着对异常进行处理还是会触发熔断机制,具体避免方法最后讲

首先我们编写一个BaseException 用于扩展:省略getter/setter

public class TmallBaseException extends RuntimeException
{

	/**
	 * 
	 * @author joker
	 * @date 创建时间:2018年8月18日 下午4:46:54
	 */
	private static final long serialVersionUID = -5076254306303975358L;
	// 未认证
	public static final int UNAUTHENTICATED_EXCEPTION = 0;
	// 未授权
	public static final int FORBIDDEN_EXCEPTION = 1;
	// 超时
	public static final int TIMEOUT_EXCEPTION = 2;
	// 业务逻辑异常
	public static final int BIZ_EXCEPTION = 3;
	// 未知异常->系统异常
	public static final int UNKNOWN_EXCEPTION = 4;
	// 异常码
	private int code;

	// 异常信息
	private String message;

	public TmallBaseException(int code, String message)
	{
		super(message);
		this.code = code;
		this.message = message;
	}

	public TmallBaseException(String message, Throwable cause)
	{
		super(message, cause);
		this.message = message;
	}

	public TmallBaseException(int code, String message, Throwable cause)
	{
		super(message, cause);
		this.code = code;
		this.message = message;
	}
}

OK,我们定义好了基类之后可以先进行测试一番:服务接口controller:

    //显示某个商家合作的店铺
	@RequestMapping(value="/store")
	public ResultDTO<Collection<BrandDTO>>findStoreOperatedBrands(@RequestParam("storeId")Long storeId)
	{
        为了测试,先直接抛出异常
		throw new TmallBaseException(TmallBaseException.BIZ_EXCEPTION, "ceshi");

    }
接口:
	@RequestMapping(value="/auth/brand/store",method=RequestMethod.POST,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
	ResultDTO<List<BrandDTO>>findStoreOperatedBrands(@RequestParam("storeId")Long storeId);

其余的先不贴了,然后我们发起rest调用的时候发现,抛出异常之后并没有被异常处理器处理,这是因为我们是通过fegin,而我又配置了feign的fallback类,抛出异常的时候会自动调用这个类中的方法.

有两种解决方法:1.直接撤除hystrix ,很明显its not a good idea

2.再封装一层异常类,具体为何,如下

AbstractCommand#handleFallback 函数是处理异常的函数,从方法后缀名可以得知,当exception 是HystrixBadRequestException的时候是直接抛出的,不会触发fallback,也就意味着不会触发降级

 final Func1<Throwable, Observable<R>> handleFallback = new Func1<Throwable, Observable<R>>() {
            @Override
            public Observable<R> call(Throwable t) {
                circuitBreaker.markNonSuccess();
                Exception e = getExceptionFromThrowable(t);
                executionResult = executionResult.setExecutionException(e);
                if (e instanceof RejectedExecutionException) {
                    return handleThreadPoolRejectionViaFallback(e);
                } else if (t instanceof HystrixTimeoutException) {
                    return handleTimeoutViaFallback();
                } else if (t instanceof HystrixBadRequestException) {
                    return handleBadRequestByEmittingError(e);
                } else {
                    /*
                     * Treat HystrixBadRequestException from ExecutionHook like a plain HystrixBadRequestException.
                     */
                    if (e instanceof HystrixBadRequestException) {
                        eventNotifier.markEvent(HystrixEventType.BAD_REQUEST, commandKey);
                        return Observable.error(e);
                    }

                    return handleFailureViaFallback(e);
                }
            }
        };

既然如此,那一切都明了了,修改类的继承结构即可:

public class TmallBaseException extends HystrixBadRequestException
{

	/**
	 * 
	 * @author joker
	 * @date 创建时间:2018年8月18日 下午4:46:54
	 */
	private static final long serialVersionUID = -5076254306303975358L;
	// 未认证
	public static final int UNAUTHENTICATED_EXCEPTION = 0;
	// 未授权
	public static final int FORBIDDEN_EXCEPTION = 1;
	// 超时
	public static final int TIMEOUT_EXCEPTION = 2;
	// 业务逻辑异常
	public static final int BIZ_EXCEPTION = 3;
	// 未知异常->系统异常
	public static final int UNKNOWN_EXCEPTION = 4;
	// 异常码
	private int code;

	// 异常信息
	private String message;
}

至于怎么从服务器中获取异常然后进行转换,就是通过上面所讲的ErrorHandler:

public class TmallErrorDecoder implements ErrorDecoder 
{

	@Override
	public Exception decode(String methodKey, Response response)
	{
		System.out.println(methodKey);
		Exception exception=null;
		try
		{
			String json = Util.toString(response.body().asReader());
			exception=JsonUtils.json2Object(json,TmallBaseException.class);
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		return exception!=null?exception:new TmallBaseException(TmallBaseException.UNKNOWN_EXCEPTION, "系统运行异常");
	}
}

最后微服务下的全局异常处理就ok了,当然这个ErrorDdecoder 和BaseException推荐放在common模块下,所有其他模块都会使用到他

参考资料:程序猿DD大佬

spring cloud gateway,调用网关200但是返回值为空 其实之前有人已经讨论过这个问题,其中一个原因是资源路径中缺少负载均衡netflix-ribbon。当使用gateway分发微服务访问请求时,返回状态是200,但是无任何返回值。其中ip地址为gate-way所在ip, 路径cloud-client1是另一个服务名称。服务注册和发现中间件使用的是zookeeper,相信使用其他中间件如nacos,consul, eruka等也会出现同样的情况。言归正传,我们来看看另一种情况.开启后路由功能正常访问。 阅读详情

相关推荐

SpringCloud微服务接口这么多怎么调试

本文来自程序猿,本文主要介绍了SpringCloud微服务下服务接口调试及管理,什么样方式可以让微服务的接口管理变得更加容易些,希望对您的学习有所帮助。我们知道在微服务架构下,软件系统会被拆分成很多个独立运行的服务,而这些服务间需要交互通信,就需要定义各种各样的服务接口。具体来说,在基于SpringCloud的微服务模式中,各个微服务会基于SpringMVC的Controller定义多个该微服务需要向外部发布的接口。根据各个微服务功能边界定义的不同,有些微服务会提供与具体业务相关的接口,如支付接口账户接口等;而有些微服务则会提供一些公共性质的服务接口,如短信接口统一认证接口之类。而这些微服务往

feign服务端出异常客户端处理的方法

一、简介 在使用feign进行远程方法调用时,如果远程服务端方法出现异常,客户端有时需要捕获,并且把异常信息返回给前端,而如果在开启熔断之后,这个异常会被消化,所以说,如果希望拿到服务端异常,feign.hystrix.enable需要设置为false,而当不开熔断时,我们也有几种方法把拿到服务端的异常信息,下面总结一下。 try…catch方法 feign异常拦截器 二、try…catch方法 这个方法比较直观,也最好理解,但业务层会有很多try…catch这种代码,所以不是很推荐。 注意:虽然服务

weixin_41979002的博客 6210

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

不一样的feign,获取返回code非200的响应

feign在开发中极大的节省了开发中对接第三方接口的时间,不用在为千奇百怪的三方接口协议去实现不同的请求接口,方便到调用三方接口就像我们自己的接口一样的容易。在大部分情况下不需要特别的处理feign就能很好的为我们工作,然而最进的一个工作让我不得不重新审视feign的使用问题,因为那已经无法完成我的工作了,同时我又不想去手动用httpclien再去写一个请求方法。那是什么问题,我又是怎么解决的呢,...

oXiangYun12345的专栏 7847

从零搭建无人机仿真环境:ROS 2与Gazebo Fortress实战指南

本文提供了一份详细的无人机仿真环境搭建实战指南,基于Ubuntu 22.04系统,整合ROS 2 Humble与Gazebo Fortress两大核心工具。通过分步讲解安装、配置及桥接过程,并引入PX4飞控与XTDrone2工具链,帮助开发者快速构建一个稳定、高效的无人机算法开发与测试平台,有效降低真机测试的成本与风险。

water的专栏 428

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 408

springcloud feign 服务调用其他服务_《SpringCloud微服务之Feign组件》

项目版本: spring cloud版本为Greenwich.SR3 spring-boot版本为2.1.9.RELEASE什么是feigin?Feign:用于远程调用,让服务之间的调用变得更加简单类似于控制层的service,Fegin的底层使用了rabbon作为负载均衡的客户端它的优点是什么?1.feign采用的是基于接口注解2.feign整合了ribbon,具有负载均衡的能力3.整合了Hys...

weixin_39615402的博客 488

vasp和ms_武汉理工大学赵焱课题组开发脚本 MS建模一键获取VASP输入文件POSCAR

本文给大家推介并分享一个通过Materials Studio一键获取VASP输入文件POSCAR的脚本,xsd2pos.pl。此脚本是武汉理工大学首席教授赵焱在帮助学生解决VASP计算问题时编写,解决了其他间接非手动获取POSCAR存在的问题,同时也相较于其他方法更为便捷,相信会对从事VASP计算的同行们带来便利。赵焱老师怀着哺育天下学子的情怀,希望给大家分享一下。下文介绍一下它的使用方法以及它所...

weixin_39706367的博客 2285

SpringCloud Feign通过FallbackFactory显示异常信息

SpringCloud Feign可以进行服务消费,而且内置了Hystrix,能够进行熔断。 Feign可以通过fallback指定熔断回调的类。代码示例及讲解可见:https://www.cnblogs.com/expiator/p/10826852.html 但是,有时候我们还需要记录异常信息,可以通过fallbackFactory实现。 服务提供者 示例如下: @RestControlle...

Cyms,BgXmSfXtsj !!!! Battle Each Moment !!!! 1671

从零到一:OptimizePI Pre-layout PDN前仿真实战指南

本文详细介绍了如何使用OptimizePI进行电源完整性(PDN)前仿真,从软件安装配置到元器件建模、去耦电容配置及仿真参数设置,提供了实战技巧和常见问题排查指南。通过OptimizePI的Pre-layout仿真,工程师可以在PCB布局前优化电源分配网络,显著提升设计效率并降低成本。

weixin_28304023的博客 506

29、集成电路测试技术解析

本文深入解析了集成电路测试技术,涵盖定制电路测试资源与策略、混合模拟/数字电路测试方法、数字测试模式生成难点与解决方案,以及可控性和可观测性的核心概念。同时详细讨论了固定故障、桥接故障和开路故障等主要故障模型及其检测方法。在测试技术的综合应用与优化方面,提出了合理配置测试资源、优化测试模式和设计测试流程的策略。最后展望了测试技术的发展趋势,包括集成化测试、自动化测试和智能化测试。通过全面掌握这些测试技术,可以有效提高集成电路的质量和可靠性,推动集成电路产业的发展。

work3的博客 204

springcloud笔记(二)服务熔断 Hystrix,声明式服务消费 Feign

这里写目录标题1服务熔断 Hystrix是什么1.1为什么使用这个组件1.2作用2入门案例2.1修改 hystrix 的默认超时时间2.2 Hystrix 的服务降级2.3 Hystrix 的异常处理2.4自定义 Hystrix 请求的服务异常熔断处理2.5 Hystrix 仪表盘监控2.5.1 搭建这个项目2.5.2 解读页面3 声明式服务消费 Feign3.1 创建项目3.2 负载均衡:3.2 服务熔断:3.3 服务熔断获取异常信息 1服务熔断 Hystrix是什么 就是一个组件; 1.1为什么使用这个

一天不写代码难受的博客 620

【38】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法

亚像素边缘定位算法实现 本文介绍了一种基于多项式插值的亚像素边缘定位算法,用于提高图像边缘检测的精度。文章首先分析了传统像素级边缘检测方法(如Canny、Sobel)的局限性,指出其在测量应用中的精度不足问题。 算法核心 梯度计算:使用8个方向模板进行卷积运算生成梯度图像 亚像素定位:采用多项式插值方法改进边缘定位精度 实现步骤: 生成8个方向的卷积模板(0°、45°、90°等) 利用filter2D函数计算各方向梯度 通过归一化处理显示梯度图像 代码特点 提供完整的C++实现代码 包含模板生成、梯度计算和

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1099

SpringCloud feign微服务调用之间的异常处理

如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表。 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一、加上hystrix熔断 在定义feignClient的地方指定熔断,如下图 当被调用服务不可用或者被调用方发生错误的时候,会触发熔断,但是,如果被调用方抛出异常,调用方怎么知道究竟是出了什么问题呢? 那,这就出现了 二、feign全局异常处理 我们不得不提到feign提供的一个接口叫做ErrorDecoder, 是用来处理feign异

zf12178的博客 1万+

微店构造订单页面,自动化抢票

之前的文章写过微店抢票如何构造订单页面分析,这篇文章在之前的基础上,进行抢票。

猫敷雪 7201

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringCloud(五)之Spring Cloud 中 Feign结合Hystrix断路器开发实战

1.先讲hystrx(断路器) 在springcloub 中的使用 1.1 加入依赖  注意:网上新旧版本问题,所以要以官网为主,不然部分注解会丢失最新版本 2.0 <dependency> <groupId>org.springframework.cloud</groupId> <art...

weixin_30810239的博客 182

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringCloud (五) --------- Hystrix

目录一、Hystrix 介绍1. 什么是熔断器2. Hystrix 原理3. Hystrix 提供解决方案二、Hystrix 熔断降级三、Hystrix 的异常处理 一、Hystrix 介绍 Hystrix 被称为熔断器,它是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多服务之间通过远程调用实现信息交互,调用时不可避免会出现调用失败,比如超时、异常等原因导致调用失败,Hystrix 能够保证在一个服务出问题的情况下,不会导致整体服务失败,避免级联故障(服务雪崩),以提高分布式系统的弹性。

在森林里麋了鹿 919

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一站式微服务架构SpringCloud-Netflix熔断器Hystrix

目录一站式微服务架构SpringCloud-Netflix熔断器Hystrix项目中使用Hystrix注解方式设置设置hystrix超时时间获取异常信息禁用服务降级服务限流Hystrix整合Feign使用Feign进行服务降级方式一方式二(可以得到异常信息) 一站式微服务架构SpringCloud-Netflix熔断器Hystrix 项目中使用Hystrix 1.消费端添加Hystrix依赖 <dependency> <groupId>org.springframework

桀骜浮沉的博客 529

springcloud微服务hystrix熔断器之feign方式-08

springcloud入门详细搭建微服务环境-01  注册中心搭建 springcloud服务提供端-02  服务提供端的搭建 此demo依赖于以上: Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。        资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。   ...

itboy 882

feign调用接口参数可以为null吗_《SpringCloud微服务之Feign组件》

项目版本: spring cloud版本为Greenwich.SR3 spring-boot版本为2.1.9.RELEASE什么是feigin?Feign:用于远程调用,让服务之间的调用变得更加简单类似于控制层的service,Fegin的底层使用了rabbon作为负载均衡的客户端它的优点是什么?1.feign采用的是基于接口注解2.feign整合了ribbon,具有负载均衡的能力3.整合了Hys...

weixin_35948624的博客 457

使用hystrix实现多服务之间的调用出现异常的情况,及时预警

在使用Feign来实现SpringCloud多模块之间的调用这篇文章我写了如何去调用,但是并没有考虑异常宕机的情况。 比如:快手系统里面调用头条数据,但是头条系统宕机了要如何处理。 第一步:在公共父类中引入hystrix <!-- Hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <arti..

xcc_2269861428的博客 553

SpringCloud系列之Hystrix熔断器【待完善】

目录1. 简介2. 实例2.1 在RestTemplate和Ribbon上使用熔断器2.2 在Feign上使用熔断器2.3 使用Hystrix Dashboard 监控熔断器状态2.4 使用Turbine 聚合监控3. 源码解析 1. 简介 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。 “断路器” 本身是一种开关设置,当某个

陆林烽的博客 721

SpringCloud第十八章AlibabaSentinel实现熔断与限流(服务熔断功能)

9、服务熔断功能 sentinel整合ribbon+openFeign+fallback Ribbon系列 启动nacos和sentinel 提供者9003/9004 新建cloudalibaba-provider-payment9003/9004两个一样的做法 POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

likun111的博客 290

SpringCloud之Feign简介及使用

这里贴上GitHub上openFeign的wiki给出的自定义errorDecoder例子。@Override//这里是给出的自定义异常//这里是给出的自定义异常//这里是其他状态码处理方法自定义好异常处理类后,要在@Configuration修饰的配置类中声明此类。

顺其自然~专栏 812

SpringCloud 2020 Alibaba微服务实战九 sentinel实战之RestTemplate整合Sentinel及Feign整合Sentinel

一,RestTemplate整合Sentinel yml配置 resttemplate: sentinel: #false 关闭@SentinelRestTemplate注解,在做开发调试的时候可以关闭此注解,专注于功能的实现 enabled: true @Bean @LoadBalanced @SentinelRestTemplate public RestTemplate RestTemplate(){ return new RestTemplate(new.

liuerchong的博客 538

初识微服务之Feign

Feign Feign是Netflix公司开发的一个声明书的REST调用客户端 Ribbon负载均衡,Hystrix服务熔断是Spring Cloud中进行微服务开发非常基础的组件,在使用时我们也发现他们一般都是同时出现的,而配置也非常相似,每次都会有很多相同的代码,因此Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让我们的开发工作更加简单,就像Spring Boot是对Spring+Spring MVC的简化一样,Spring Cloud Feign对

qq_41934990的博客 678
上一篇: SpringBoot 与Shirofilter
下一篇: Java 基础知识
Coder_Joker
博客等级 码龄8年 39粉丝 67原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值