Spring Cloud Edgware新特性之八:Zuul回退的改进

为什么80%的码农都做不了架构师?>>>   hot3.png

Spring Cloud Edgware对Hystrix回退的逻辑进行了一些改进。本文将信息探讨新旧版本的回退操作,并分析的原因及改进后的优势。

Dalston及更低版本

对于Dalston及更低版本,要想为Zuul提供回退,只需编写代码如下:

@Component
public class MyFallbackProvider implements ZuulFallbackProvider {@Overridepublic String getRoute() {// 表明是为哪个微服务提供回退,*表示为所有微服务提供回退return "*";}@Overridepublic ClientHttpResponse fallbackResponse() {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {// fallback时的状态码return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {// 数字类型的状态码,本例返回的其实就是200,详见HttpStatusreturn this.getStatusCode().value();}@Overridepublic String getStatusText() throws IOException {// 状态文本,本例返回的其实就是OK,详见HttpStatusreturn this.getStatusCode().getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {// 响应体return new ByteArrayInputStream("用户微服务不可用,请稍后再试。".getBytes());}@Overridepublic HttpHeaders getHeaders() {// headers设定HttpHeaders headers = new HttpHeaders();MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));headers.setContentType(mt);return headers;}};}
}

Edgware及更高版本

@Component
public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {// 表明是为哪个微服务提供回退,*表示为所有微服务提供回退return "*";}@Overridepublic ClientHttpResponse fallbackResponse(Throwable cause) {if (cause instanceof HystrixTimeoutException) {return response(HttpStatus.GATEWAY_TIMEOUT);} else {return this.fallbackResponse();}}@Overridepublic ClientHttpResponse fallbackResponse() {return this.response(HttpStatus.INTERNAL_SERVER_ERROR);}private ClientHttpResponse response(final HttpStatus status) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return status;}@Overridepublic int getRawStatusCode() throws IOException {return status.value();}@Overridepublic String getStatusText() throws IOException {return status.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("服务不可用,请稍后再试。".getBytes());}@Overridepublic HttpHeaders getHeaders() {// headers设定HttpHeaders headers = new HttpHeaders();MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));headers.setContentType(mt);return headers;}};}
}

分析

由代码可知:

  • Dalston及更低版本通过实现ZuulFallbackProvider 接口,从而实现回退;
  • Edgware及更高版本通过实现FallbackProvider 接口,从而实现回退。
  • 在Edgware中:
    • FallbackProvider是ZuulFallbackProvider的子接口。
    • ZuulFallbackProvider已经被标注Deprecated ,很可能在未来的版本中被删除。
    • FallbackProvider接口比ZuulFallbackProvider多了一个ClientHttpResponse fallbackResponse(Throwable cause); 方法,使用该方法,可获得造成回退的原因。
  • 笔者将在下一篇文章详细总结在Spring Cloud中如何获得造成回退原因的各种姿势。

转载于:https://my.oschina.net/eacdy/blog/1609309

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因特网 以太网 互联网的含义及区别

互联网是Internet的意译,因特网是Internet的音译,两者是等同的,是一个全世界范围的广域网。目前应用最为广泛的一类局域网是总线局域网-以太网。以太网的核心技术是它的随机争用型介质访问控制方法,即带有冲突检测的载波侦听多路访…

idea插件导出_Intellij IDEA 中我一直在用的几个插件

提前声明一下,今天这篇文章是在我家的那台 Mac 机子上写的,但是文中使用的快捷键还是主要针对于 Windows 平台「由于我的大多数读者在使用该系统,我是有多么爱你们~~~」。接上一篇《谈谈我与 Intellij IDEA…

打开.md格式文件的方式

我们平常偶尔会收到后缀为*.md的文件, md是简称,它的全名为MARKDOWN。MARKDOWN是一种标记语言软件,下载安装MarkdownPad2即可打开。 具体安装参考文章:MarkdownPad2安装汉化与注册码 https://blog.csdn.net/weixin_40612082/art…

吃透理财三句话人人都能成百万富翁

财专家告诉我们:理财的最佳方式并非追求高超的金融投资技巧,只要你掌握正确的理财观念,并且持之以恒,若干年之后——人人都能成为百万富翁。我每月到企业举办一小时的免费“理财讲座”,一直都很受员工们的欢迎。讲座内…

Apache - Storm

一、Apache Storm Storm是一个分布式的,可靠的,容错的数据流处理系统。Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt,bolt要么把数据保存到某种存储器,要么把数据传递给其它的bolt。一个Stor…

Python基础学习五 内置模块

time 模块 1 >>> import time2 >>> time.time()3 1491064723.8086694 >>> # time.time()返回当前时间的时间戳timestamp(定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)的方法,无参数5 >>> time.asctime()6 Sun Apr 2…

如何在windows上将本地项目上传到Github

详细步骤参考: https://www.cnblogs.com/smfx1314/p/8426115.html 感谢作者分享!

Sublime Text3使用Package Control 报错There Are No Packages Available For Installation

在使用sublime时,有时候我们希望将代码复制出来后仍然是高亮显示,这样我们便需要安装SublimeHighLight插件,在安装SublimeHighLight插件之前,我们应该先安装Package Control插件! 1、Package Control插件作用&#xff…

数据结构学习笔记

数据结构学习笔记(一) 假期以来我都坚持每天看一点郝斌的数据结构视频。讲的很透彻,也很风趣。 前几天都是为讲数据结构而做准备,讲了一些结构体和指针,今天终于开始正式将数据结构。说实话,我今天才知道…

2018-1-27:内存的划分

内存的划分 1.寄存器 2.本地方法区 3.方法区 4.栈内存 存储的都是局部变量,变量的作用域一结束,该变量就立即释放 5.堆内存 存储的是对象,即凡是new的都在堆中 特点:   1.每一个实体都有首地址 2.堆内存中每一个变量都有默认初始…

mysql 1130 localhost_解决1130 Host 'localhost' is not allowed to connect to this MySQL server

WAMP 64bit安装好后,连接数据库,提示#1130 Host ‘localhost’ is not allowed to connect to this MySQL server1.首先停止mysql服务,如果不会可以直接停止所有wampserver。2.然后打开一个命令行窗口,切换到mysql的安装目录&…

Ubuntu 14.04下安装Redis报错:“You need tcl 8.5 or newer in order to run the Redis test”问题解决

解决方案参考文献:安装tcl https://blog.csdn.net/zhangshu123321/article/details/51440106 感谢楼主分享!

InstallSheild 获取系统环境变量,如Desktop路径等

使用FOLDER_DESKTOP变量获取的桌面路径可能为:C:\Users\Public\Desktop 而不是C:\Users\用户\Desktop Copy and paste the following define statements at the beginning of your setup.rul file. Also, make sure you copy and paste the prototype for the SHGe…

线程2---异步1

在Java中什么是同步?什么是异步?对于这两个概念我们必须要明确。只有明确这两个概念,才会在明确在什么场景下使用同步以及异步。 在这里我可以形象的举个例子来辨明这两个概念: 1.同步与异步同步和异步关注的是消息通信机制 (sync…

mysql通常使用语句_Mysql 常用SQL语句集锦

基础篇//查询时间,友好提示$sql "select date_format(create_time, %Y-%m-%d) as day from table_name";//int 时间戳类型$sql "select from_unixtime(create_time, %Y-%m-%d) as day from table_name";//一个sql返回多个总数$sql "sel…

为什么你需要设计和维护一套自我移动标准?

在一个很长的调研日的休息时分,我在同一个客户谈一个项目,在这个项目中,我正为一个全球经济公司开发一个iOS标准。他们的第一反应是这样的:“什么?你在开发Apple iOS以外的标准?那还要开发什么?…

JS 小知识点汇总

1.offsetWidth & width A:因为. 1.offsetWidth是只读属性,而style.width是可读写得。2.offsetWidth返回的是一个整数,style.width返回的是一个字符串,并且带有单位;**3.style.width只能返回以style方式定义的内部样式的width属性值。4.of…