博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java B2B2C电子商务平台分析之十六----Zuul的容错回退与高可用
阅读量:6184 次
发布时间:2019-06-21

本文共 3195 字,大约阅读时间需要 10 分钟。

hot3.png

zuul的容错与回退

之前说到过,使用Hystrix实现微服务的容错与回退,其实Zuul默认已经整合了Hystrix,使用起来也是比较简单:

在原有 zuul-gateway 项目的基础上新增,实现ZuulFallbackProvider接口,并实现getRoute和fallbackResponse方法。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三

import com.google.gson.Gson;import com.simons.cn.util.CommonEnum;import com.simons.cn.util.CommonResult;import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.client.ClientHttpResponse;import org.springframework.stereotype.Component;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset; @Componentpublic class UserProviderZuulFallBack implements ZuulFallbackProvider {     private static final String USER_PROVIDER_SERVICE = "user-provider";     @Override    public String getRoute() {        return USER_PROVIDER_SERVICE; //返回你需要为哪个微服务提供回退    }     @Override    public ClientHttpResponse fallbackResponse() {        return new ClientHttpResponse() {            /**             * 返回Http状态码标识             */            @Override            public HttpStatus getStatusCode() throws IOException {                return HttpStatus.OK;            }             /**             * 返回Http状态码对应数字:200,详见HttpStatus             */            @Override            public int getRawStatusCode() throws IOException {                return 200;            }             /**             *返回Http状态码对应中译:OK,详见HttpStatus             */            @Override            public String getStatusText() throws IOException {                return HttpStatus.OK.getReasonPhrase();            }             @Override            public void close() {             }             /**             *body响应体             */            @Override            public InputStream getBody() throws IOException {                String message = new Gson().toJson(CommonResult.success(CommonEnum.SERVICE_NOT_AVAILABLE.getCode(), CommonEnum.SERVICE_NOT_AVAILABLE.getMessage()));                return new ByteArrayInputStream(message.getBytes("UTF-8"));            }             /**             * 设置HttpHeaders             */            @Override            public HttpHeaders getHeaders() {                HttpHeaders headers = new HttpHeaders();                //    MediaType mediaType = new MediaType("application/json;charset=utf-8");  //这是错误写法                MediaType mediaType = new MediaType("application", "json", Charset.forName("utf-8"));                headers.setContentType(mediaType);                return headers;            }        };    }}

CommonEnum中的枚举(部分):

SERVICE_NOT_AVAILABLE("5001","当前服务不可用,请稍后重试!"),

测试:

启动zuul-gateway项目和user-provider-eureka、discovery-eureka三个项目,浏览器访问http://localhost:10010/user/getuserinfo?name=jack,效果如图:

关闭user-provider-eureka服务,再访问http://localhost:10010/user/getuserinfo?name=jack,效果如图:

可以看到,当用户微服务不可用时候,默认返回了自定义的json。

zuul的高可用策略

一、如果Zuul也注册到了服务发现组件Eureka上,那么zuul就已经实现了高可用配置,这种情况和普通的服务消费者和提供者的高可用是一致的;

二、若zuul未注册到Eureka上,则可以通过Nginx/HAProxy等负载均衡器来将请求分配到zuul的其中一个节点;这点更多的还是负载均衡器的配置。例如nginx的:

整体代码结构如下:

转载于:https://my.oschina.net/u/3873725/blog/2977667

你可能感兴趣的文章
安卓学习第一天
查看>>
Oracle expdp数据泵远程导出
查看>>
Trilead,SSH2的Java调用
查看>>
Linux开机自动挂载(磁盘)
查看>>
Python自学笔记之函数式编程5——返回函数
查看>>
乐观锁和悲观锁初步认识
查看>>
MFC中的几个常用类——CWinApp
查看>>
overflow、display、visibility的区别?
查看>>
div 滚动条
查看>>
关于JAVA序列化的一个注意点
查看>>
博客刚建好一定要做好SEO基本工作,方便各大搜索引擎收录!!!
查看>>
RecyclerAdapter封装
查看>>
React Native初探
查看>>
架构学习(二)知识脑图
查看>>
Intent的用法大全
查看>>
1:dubbo集成spring
查看>>
JNI Java层类关联C/C++层的类
查看>>
ubuntu配置jdk,jre同样适用
查看>>
修复桌面小键盘
查看>>
内联元素(inline element)和块元素(block element)
查看>>