整合Zuul

为什么要使用Zuul?

  • 易于监控
  • 易于认证
  • 减少客户端与各个微服务之间的交互次数
  1. 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. 配置文件

    可不配置,具体配置参数见下文
  2. 开启注解

启动类上加@EnableZuulProxy

备注:不配置任何配置文件时,启动zuul服务,zuul可以通过服务名去访问到其他服务。

例:http://localhost:8000/study-trade/trade/testTrade/2

二、配置详解

  1. 路径映射
#关闭通过微服务名称访问
zuul.ignored-services=* #指定微服务名称和路径的映射
#zuul.routes.study-trade=/strade/** #指定微服务名称和路径的映射,是否剥离前缀
zuul.routes.study-trade.service-id=study-trade
zuul.routes.study-trade.path=/orderservice/**
zuul.routes.study-trade.strip-prefix=true #指定ip映射,而不用负载均衡
#zuul.routes.study-trade.url=http://localhost:8005/
#zuul.routes.study-trade.path=/st/** #为我们目标下游服务器设置统一的请求前缀
# 本来是http://localhost:8000/strade/trade/testTrade/2 的配置了就需要http://localhost:8000/study-springcloud/strade/trade/testTrade/2才能访问
#zuul.prefix=/study-springcloud
#是否剥离请求前缀
#zuul.strip-prefix=true #屏蔽敏感的路径
zuul.ignored-patterns=/**/admin/** #过滤敏感头信息,不加这行,cookie,setcookie,authrotion三个同步信息不能传递的,等号后不用写值
zuul.routes.study-trade.sensitive-headers= #禁用Zuul的过滤器 simpleClassname代表类名
#zuul.simpleClassname.pre|router|post|error=true
  1. 降级回退
  • 宕机回退
  • 超时回退(ribbon.ConnectionTimeout=4000

    ribbon.ReadTimeout=4000)

代码实现:

/**
* @description: Zull的降级回退
* @author: mmc
* @create: 2020-04-12 22:39
**/
@Component
public class ZuulFallBack implements FallbackProvider { @Override
public String getRoute() {
//可以填微服务实例名称或*
return "*";
} @Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
} @Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
} @Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
} @Override
public void close() { } @Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("后端服务异常".getBytes());
} @Override
public HttpHeaders getHeaders() {
HttpHeaders httpHeaders=new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return httpHeaders;
}
};
}
}
  1. 过滤器
@Component
public class ThrowExeceptionFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
} @Override
public int filterOrder() {
return 0;
} @Override
public boolean shouldFilter() {
return true;
} @Override
public Object run() throws ZuulException {
return null;
}
}
  1. 统一异常处理
  • 4.1 禁用系统异常

    zuul.SendErrorFilter.error.disable=true

  • 4.2 自定义异常处理类

@Component
public class ErrorFilter extends SendErrorFilter { @Override
public Object run() {
try{
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
HttpServletResponse response = ctx.getResponse();
ExceptionHolder exception = findZuulException(ctx.getThrowable());
response.setContentType("application/json;charset=utf-8");
response.setCharacterEncoding("UTF-8"); Map<String,Object> errorMap=new HashMap<>();
errorMap.put("code","-1");
errorMap.put("errMsg",exception.getThrowable().getCause().getMessage());
response.getWriter().write(JSON.toJSONString(errorMap));
}catch (Exception e){
try {
ReflectionUtils.rethrowException(e);
} catch (Exception e1) {
e1.printStackTrace();
}
}
return null;
}
}

从零搭建一个SpringCloud项目之Zuul(四)的更多相关文章

  1. 从零搭建一个SpringCloud项目之Feign搭建

    从零搭建一个SpringCloud项目之Feign搭建 工程简述 目的:实现trade服务通过feign调用user服务的功能.因为trade服务会用到user里的一些类和接口,所以抽出了其他服务需要 ...

  2. 从零搭建一个SpringCloud项目之Config(五)

    配置中心 一.配置中心服务端 新建项目study-config-server 引入依赖 <dependency> <groupId>org.springframework.cl ...

  3. 从零搭建一个IdentityServer——项目搭建

    本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可 ...

  4. 使用Vue脚手架(vue-cli)从零搭建一个vue项目(包含vue项目结构展示)

    注:在搭建项目之前,请先安装一些全局的工具(如:node,vue-cli等) node安装:去node官网(https://nodejs.org/en/)下载并安装node即可,安装node以后就可以 ...

  5. 从零搭建一个IdentityServer——目录(更新中...)

    从零搭建一个IdentityServer--项目搭建 从零搭建一个IdentityServer--集成Asp.net core Identity 从零搭建一个IdentityServer--初识Ope ...

  6. 从零搭建一个IdentityServer——会话管理与登出

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...

  7. 从零搭建一个IdentityServer——资源与访问控制

    IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...

  8. vue-用Vue-cli从零开始搭建一个Vue项目

    Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...

  9. 基于 Express 搭建一个node项目 - 起步

    一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...

随机推荐

  1. CentOS RPM 安装 MySQL5.7

    环境 CentOS 7 64位 MySQL 5.7 64位 1.卸载系统自带的 mariadb [root@localhost /]# rpm -qa|grep mariadb mariadb-lib ...

  2. [android]com.android.support:appcompat-v7:XXX 包导入无法Build

    在学习<Android编程权威指南>时,按书中要求添加com.android.support:appcompat的依赖,然后编译不通过,提示如下问题: 大概意思是,Android Pie之 ...

  3. sql 语句系列(null 值处理)[八百章之第二章]

    查找只存在一个表中的数据 有两张表: EMP: select * from emp DEPT: 他们有共同的属性:deptno 现在要查询EMP 中的deptno不等于DEPTNO的deptno项. ...

  4. Spotlight on Unix/Mysql安装使用详解

    Spotlight on Unix安装使用详解  1.远程连接linux服务器,查看系统是否已经安装sysstat包,如果没有的话,按照以下方法安装sysstat. (1)检查Linux是否安装sys ...

  5. 欲善事先利器-IEAD插件篇

    工欲善其事,必先利其器,好鞋踢好球是非常合乎逻辑的事情. --<长江七号> 同样的开场白,不一样的酒,不一样的故事. 上篇<欲善事先利器--系统篇>已经推荐了一些个人常用的效率 ...

  6. Zend Studio 13.6.1 汉化及安装方法详解

    Zend Studio 13.6.1是一套专业开发人员使用的集成开发环境 (IDE),具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持语法自动缩排 ...

  7. 全文搜索技术--Solr7.1之配置中文分析器

    前言:中国文化博大精深,但是solr只能一个一个的识别,而是更加符合中国人的习惯,所以加了中文分析器. 1.安装中文分词器 第一步:把中文分词器(ik-analyzer-solr7-7.x.jar)/ ...

  8. Unity 游戏框架搭建 2019 (八) 关于导出 UnityPackage 功能的小结

    导出 UnityPackage 功能到这里要告一段落了,相信认真看的童鞋都有收获.笔者在写教程之前纠结了很久.到底是先给出一坨工具代码,然后再逐个讲解比较好,还是一篇一个知识点比较好.后来想通了.工具 ...

  9. python基础知识6——函数

    函数:自定义函数:函数的参数:不带参数,普通参数,默认参数,动态参数:返回值return:函数作用域:内置函数高阶函数:map,reduce,filter,sorted:lambda表达式:文件操作: ...

  10. SqlBulkCopy批量插入数据 显示 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 smalldatetime。错误

    因为需要大量插入数据,linq ef无法达到速度的要求,因此把模型转换成SQL ,使用SqlBulkCopy快速插入.但是去提示 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 s ...