在声明式远程服务调用Feign中,实现服务灾难性雪崩效应处理也是通过Hystrix实现的。而feign启动器spring-cloud-starter-feign中是包含Hystrix相关依赖的。如果只使用服务降级功能不需要做独立依赖。如果需要使用Hystrix其他服务容错能力,需要依赖spring-cloud-starter-hystrix资源。从Dalston版本后,feign默认关闭Hystrix支持。所以必须在全局配置文件中开启feign技术中的Hystrix支持。配置如下:

feign.hystrix.enabled=true

如果不使用Hystrix服务容错功能,在application client端,服务接口只需要继承服务标准api接口即可实现远程服务调用。如果使用了Hystrix,则有不同的编写方式。具体如下。

一、接口实现类方式

定义和服务标准api相同的application client服务接口。

并通过@FeignClient注解来描述fallback方法所在类是什么。

这个fallback方法所在类就是接口的实现类,实现的方法就是接中定义方法的fallback方法。

import java.util.List;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import com.yucong.api.pojo.FeignTestPOJO; /**
* 如果在Feign中使用Hystrix,则不能直接继承服务标准接口。
* 因为继承接口,一般都不会给予实现。会缺少fallback方法。熔断机制链条不完整。
* 在当前接口中,重复定义服务标准接口中定义的方法。
* 远程服务调用的时候,是通过@FeignClient实现的。
* 如果远程服务调用失败,则触发fallback注解属性定义的接口实现类中的对应方法,作为fallback方法。
*
* 在默认的Hystrix配置环境中,使用的是服务降级保护机制。
*
* 服务降级,默认的情况下,包含了请求超时。
* feign声明式远程服务调用,在启动的时候,初始化过程比较慢。比ribbon要慢很多。
* 很容易在第一次访问的时候,产生超时。导致返回fallback数据。
*/
@FeignClient(name="test-feign-application-service",
//fallback=FirstClientFeignServiceImpl.class
fallbackFactory=FirstClientFeignServiceFallbackFactory.class
)
public interface FirstClientFeignService{ @RequestMapping(value="/testFeign", method=RequestMethod.GET)
public List<String> testFeign(); @RequestMapping(value="/get", method=RequestMethod.GET)
public FeignTestPOJO getById(@RequestParam(value="id") Long id); @RequestMapping(value="/get", method=RequestMethod.POST)
public FeignTestPOJO getByIdWithPOST(@RequestBody Long id); @RequestMapping(value="/add", method=RequestMethod.GET)
public FeignTestPOJO add(@RequestParam("id") Long id, @RequestParam("name") String name); @RequestMapping(value="/addWithGET", method=RequestMethod.GET)
public FeignTestPOJO add(@RequestBody FeignTestPOJO pojo); @RequestMapping(value="/addWithPOST", method=RequestMethod.POST)
public FeignTestPOJO addWithPOST(@RequestBody FeignTestPOJO pojo); }

为接口提供实现类,类中的方法实现就是fallback逻辑。实现类需要spring容器管理,使用@Component注解来描述类型。

package com.yucong.eureka.service.impl;

import java.util.ArrayList;
import java.util.List; import org.springframework.stereotype.Component; import com.yucong.api.pojo.FeignTestPOJO;
import com.yucong.eureka.service.FirstClientFeignService; /**
* 实现类中的每个方法,都是对应的接口方法的fallback。
* 一定要提供spring相关注解(@Component/@Service/@Repository等)。
* 注解是为了让当前类型的对象被spring容器管理。
* fallback是本地方法。
* 是接口的实现方法。
*/
@Component
public class FirstClientFeignServiceImpl implements FirstClientFeignService { @Override
public List<String> testFeign() {
List<String> result = new ArrayList<>();
result.add("this is testFeign method fallback datas");
return result;
} @Override
public FeignTestPOJO getById(Long id) {
return new FeignTestPOJO(-1L, "this is getById method fallback datas");
} @Override
public FeignTestPOJO getByIdWithPOST(Long id) {
return new FeignTestPOJO(-1L, "this is getByIdWithPOST method fallback datas");
} @Override
public FeignTestPOJO add(Long id, String name) {
return new FeignTestPOJO(-1L, "this is add(id, name) method fallback datas");
} @Override
public FeignTestPOJO add(FeignTestPOJO pojo) {
return new FeignTestPOJO(-1L, "this is add(pojo) method fallback datas");
} @Override
public FeignTestPOJO addWithPOST(FeignTestPOJO pojo) {
return new FeignTestPOJO(-1L, "this is addWithPOST method fallback datas");
} }

二、Factory实现方式

在服务接口的@FeignClient注解中,不再使用fallback属性,而是定义fallbackFactory属性。这个属性的类型是Class类型的,用于配置fallback代码所处的Factory。

再定义一个Java类,实现接口FallbackFactory,实现其中的create方法。使用匿名内部类的方式,为服务接口定义一个实现类,定义fallback方法实现。

这种实现逻辑的优势是,可以获取远程调用服务的异常信息。为后期异常处理提供参考。

工厂实现方案和实现类的实现方案,没有效率和逻辑上的优缺点对比。只是在远程服务调用异常的处理上有区别。

package com.yucong.eureka.service;

import java.util.ArrayList;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import com.yucong.api.pojo.FeignTestPOJO; import feign.hystrix.FallbackFactory; /**
* 使用Factory方式实现Feign的Hystrix容错处理。
* 编写的自定义Factory必须实现接口FallbackFactory。
* FallbackFactory中的方法是
* 服务接口的类型 create(Throwable 远程服务调用的错误)
*
* 工厂实现方案和服务接口实现类实现方案的区别:
* 工厂可以提供自定义的异常信息处理逻辑。因为create方法负责传递远程服务调用的异常对象。
* 实现类可以快速的开发,但是会丢失远程服务调用的异常信息。
*/
@Component
public class FirstClientFeignServiceFallbackFactory implements FallbackFactory<FirstClientFeignService> { Logger logger = LoggerFactory.getLogger(FirstClientFeignServiceFallbackFactory.class); /**
* create方法 - 就是工厂的生产产品的方法。
* 当前工厂生产的产品就是服务接口的Fallback处理对象。 就是服务接口的实现类的对象。
*/
@Override
public FirstClientFeignService create(final Throwable cause) { return new FirstClientFeignService() {
@Override
public List<String> testFeign() {
logger.warn("testFeign() - ", cause);
List<String> result = new ArrayList<>();
result.add("this is testFeign method fallback datas");
return result;
} @Override
public FeignTestPOJO getById(Long id) {
return new FeignTestPOJO(-1L, "this is getById method fallback datas");
} @Override
public FeignTestPOJO getByIdWithPOST(Long id) {
return new FeignTestPOJO(-1L, "this is getByIdWithPOST method fallback datas");
} @Override
public FeignTestPOJO add(Long id, String name) {
return new FeignTestPOJO(-1L, "this is add(id, name) method fallback datas");
} @Override
public FeignTestPOJO add(FeignTestPOJO pojo) {
return new FeignTestPOJO(-1L, "this is add(pojo) method fallback datas");
} @Override
public FeignTestPOJO addWithPOST(FeignTestPOJO pojo) {
return new FeignTestPOJO(-1L, "this is addWithPOST method fallback datas");
}
};
} }

Feign的雪崩处理的更多相关文章

  1. SpringCloud之Hystrix容错保护原理及配置

    1 什么是灾难性雪崩效应? 如下图的过程所示,灾难性雪崩形成原因就大致如此: 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等 ...

  2. SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  3. springcloud第八步:hystrix解决服务雪崩

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  4. spring cloud之Feign的使用

    原始的调用客户端的方式是通过注入restTemplate的方式 restTemplate.getForObject("http://CLIENT/hello", String.cl ...

  5. Spring Cloud+Dubbo对Feign进行RPC改造

    因为Spring Cloud Feign是基于Http Restful的调用,在高并发下的性能不够理想(虽然他是基于Ribbon以及带有熔断机制,可以防止雪崩),成为性能瓶颈,所以我们今天对Feign ...

  6. 一文读懂SpringCloud与Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

  7. 玩转SpringCloud(F版本) 三.断路器(Hystrix)RestTemplate+Ribbon和Feign两种方式

    此文章基于: 玩转SpringCloud 一.服务的注册与发现(Eureka) 玩转SpringCloud 二.服务消费者(1)ribbon+restTemplate 转SpringCloud 二.服 ...

  8. spring-cloud服务器雪崩效应

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  9. SpringCloud微服务基础 Eureka、Feign、Ribbon、Zuul、Hystrix、配置中心的基础使用

    1.单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N ...

随机推荐

  1. CVE-2019-0708复现

    本人在此申明: 此次复现仅供学习使用 不可用于非法用途 一切违法后果与本人无关 复现0708第一步 github下载exp Kali里面执行命令 wget https://raw.githubuser ...

  2. 如何使用SendGrid发送邮件

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  3. Python list 遇到的问题

    1.list“+” 运算 <list += > diff. <ndarray +=> list1 += list2是追加,而不是加法运算 list1 = [0,0,0] lis ...

  4. koa 项目实战(七)登录接口

    1.登录接口 /** * @route POST api/users/login * @desc 登录接口地址 * @access 接口是公开的 */ router.post('/login', as ...

  5. Android操作外置SD卡和U盘相关文章

    Android设备与外接U盘实现数据读取操作https://blog.csdn.net/true100/article/details/77775700 usbdisklibhttps://githu ...

  6. git 将本地项目关联到远程仓库

    初始化 在本地需要关联到远程仓库的项目根目录下执行 git init 然后关联远程仓库 [project].你需要存在一个远程仓库,名字随意,然后执行下面的命令(去掉中括号)就可以关联到该仓库. gi ...

  7. shift and add算法相关

    1.超分辨率 非均匀插值 Farsiu S, Robinson D, Milanfar P. Robust shift and add approach to superresolution[J]. ...

  8. Sqlite的操作示例代码

    import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.databa ...

  9. Mac 配置vscode调试PHP

    Mac系统版本:MacOS Mojave  10.14.5 vscode:1.36.0 MacOS Mojave  10.14.5 系统自带 PHP 7.1.23 1.开启php sudo vim / ...

  10. grep 正则表达式用引号括起来和元字符加反斜杠转义的测试

    grep 正则表达式用引号括起来和元字符加反斜杠转义的测试 实验在 grep 命令中的表达式:不加引号,加单引号,加双引号的区别,以及部分元字符前加与不加 `\’ 进行转义的区别.实验环境为“实验楼( ...