zuul网关

zuul网关

    • zuul自定义过滤器
    • hystrix和ribbon时间
    • RibbonAutoConfiguration自动配置
    • FeignAutoConfiguration自动配置
    • RibbonEurekaAutoConfiguration
    • SendErrorFilter过滤器
    • @EnableZuulServer
      • HasFeatures
    • @EnableZuulProxy

zuul自定义过滤器

  1. 继承ZuulFilter类,实现其方法filterType()、filterOrder()、shouldFilter()、run()
    1. filterType()表示过滤器的类型:pre-前置过滤器,用于请求处理前;route-路由过滤器,用于路由请求;post-后置过滤器,用于响应请求;error-错误过滤器,用于处理错误情况。
    2. filterOrder()表示过滤器的执行顺序,较小意味着先执行
    3. shouldFilter()表示是否执行过滤器的逻辑,可以编写逻辑确定是否执行过滤器
    4. run(),过滤器的实际执行逻辑
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;public class CustomFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre"; // 前置过滤器}@Overridepublic int filterOrder() {return 1; // 执行顺序,数字越小越早执行}@Overridepublic boolean shouldFilter() {return true; // 在该方法中可以定义过滤器是否执行的逻辑}@Overridepublic Object run() {// 获取请求的信息RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();String uri = request.getRequestURI();// 获取请求信息、响应信息等// 对请求或响应进行处理if(auth(ctd)){ctx.setSendZuulResponse(false); // 不将请求路由到后端服务ctx.setResponseStatusCode("401"); ctx.setResponseBody("Access Denied"); // 设置响应内容ctx.set("responseFiltered", true); // 标记该请求已被过滤}return null;}
}

在这里插入图片描述

hystrix和ribbon时间

Ribbon超时时间
在这里插入图片描述

Hystrix超时时间
在这里插入图片描述

配置文件
在这里插入图片描述

调用过程

在这里插入图片描述

RibbonAutoConfiguration自动配置

// 注入属性
@Autowired(required = false)
private List<RibbonClientSpecification> configurations = new ArrayList<>();

FeignAutoConfiguration自动配置

@Bean
public FeignContext feignContext() {FeignContext context = new FeignContext();context.setConfigurations(this.configurations);return context;
}

RibbonEurekaAutoConfiguration

SendErrorFilter过滤器

sendErrorFilter.ran请求上下为true则不执行这个默认过滤器

public class SendErrorFilter extends ZuulFilter {private static final Log log = LogFactory.getLog(SendErrorFilter.class);protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";@Value("${error.path:/error}")private String errorPath;@Overridepublic String filterType() {return ERROR_TYPE;}@Overridepublic int filterOrder() {return SEND_ERROR_FILTER_ORDER;}@Overridepublic boolean shouldFilter() {RequestContext ctx = RequestContext.getCurrentContext();// only forward to errorPath if it hasn't been forwarded to alreadyreturn ctx.getThrowable() != null&& !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false);}@Overridepublic Object run() {try {RequestContext ctx = RequestContext.getCurrentContext();// 获取异常信息ExceptionHolder exception = findZuulException(ctx.getThrowable());HttpServletRequest request = ctx.getRequest();request.setAttribute("javax.servlet.error.status_code", exception.getStatusCode());// 打印什么原因导致的异常异常的信息log.warn("Error during filtering", exception.getThrowable());request.setAttribute("javax.servlet.error.exception", exception.getThrowable());if (StringUtils.hasText(exception.getErrorCause())) {request.setAttribute("javax.servlet.error.message", exception.getErrorCause());}RequestDispatcher dispatcher = request.getRequestDispatcher(this.errorPath);if (dispatcher != null) {ctx.set(SEND_ERROR_FILTER_RAN, true);if (!ctx.getResponse().isCommitted()) {ctx.setResponseStatusCode(exception.getStatusCode());dispatcher.forward(request, ctx.getResponse());}}}catch (Exception ex) {ReflectionUtils.rethrowRuntimeException(ex);}return null;}protected ExceptionHolder findZuulException(Throwable throwable) {if (throwable.getCause() instanceof ZuulRuntimeException) {Throwable cause = null;if (throwable.getCause().getCause() != null) {cause = throwable.getCause().getCause().getCause();}if (cause instanceof ClientException && cause.getCause() != null&& cause.getCause().getCause() instanceof SocketTimeoutException) {ZuulException zuulException = new ZuulException("", 504,ZuulException.class.getName() + ": Hystrix Readed time out");return new ZuulExceptionHolder(zuulException);}// this was a failure initiated by one of the local filtersif(throwable.getCause().getCause() instanceof ZuulException) {return new ZuulExceptionHolder((ZuulException) throwable.getCause().getCause());}}if (throwable.getCause() instanceof ZuulException) {// wrapped zuul exceptionreturn  new ZuulExceptionHolder((ZuulException) throwable.getCause());}if (throwable instanceof ZuulException) {// exception thrown by zuul lifecyclereturn new ZuulExceptionHolder((ZuulException) throwable);}// fallbackreturn new DefaultExceptionHolder(throwable);}protected interface ExceptionHolder {Throwable getThrowable();default int getStatusCode() {return HttpStatus.INTERNAL_SERVER_ERROR.value();}default String getErrorCause() {return null;}}protected static class DefaultExceptionHolder implements ExceptionHolder {private final Throwable throwable;public DefaultExceptionHolder(Throwable throwable) {this.throwable = throwable;}@Overridepublic Throwable getThrowable() {return this.throwable;}}protected static class ZuulExceptionHolder implements ExceptionHolder {private final ZuulException exception;public ZuulExceptionHolder(ZuulException exception) {this.exception = exception;}@Overridepublic Throwable getThrowable() {return this.exception;}@Overridepublic int getStatusCode() {return this.exception.nStatusCode;}@Overridepublic String getErrorCause() {return this.exception.errorCause;}}public void setErrorPath(String errorPath) {this.errorPath = errorPath;}}

@EnableZuulServer

ZuulServerAutoConfiguration自动注入的类

将应用程序设置为没有任何内置反向代理特性的通用Zuul服务器。到Zuul服务器的路由可以通过ZuulProperties配置(默认情况下没有)

HasFeatures

@EnableZuulProxy

设置一个Zuul服务器端点,并在其中安装一些反向代理过滤器,这样它就可以将请求转发到后端服务器。后端可以通过配置手工注册,也可以通过DiscoveryClient注册。

  1. ServiceRouteMapper
  2. DiscoveryClientRouteLocator
  3. HasFeatures
  4. HttpClientConfiguration(Import)
    1. ApacheHttpClientConnectionManagerFactory
    2. HttpClientBuilder
    3. ApacheHttpClientFactory
  5. RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class(Import)
    1. RibbonCommandFactory
  6. PreDecorationFilter
  7. RibbonRoutingFilter
  8. SimpleHostRoutingFilter

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

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

相关文章

Linux/Uinx 系统编程:进程管理(1)

Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09; 文章目录 Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09;什么是进程进程来源INIT 和 守护进程登录进程sh进程进程的执行模式进程管理的系统调用关于syscall中参数b&#xff0c;c&#x…

谷歌出品!读懂 QUIC 协议:更快、更高效的通信协议

QUIC结构 QUIC协议模型如下图所示&#xff0c;其放弃了TCP∕IP网络中使用五元组(源IP,源端口,目的IP,目的端口,协议标识符)来唯一标识一条连接的方式,而使用一个全局唯一的随机生成的ID(即Connection ID) 来标识一条连接。 由低向上分层讨论QUIC协议&#xff1a; •UDP层:在U…

MongoDB莫名崩溃的问题定位与解决纪实

MongoDB莫名崩溃的问题定位与解决纪实 国庆之前发布的软件版本一直运行正常&#xff0c;国庆之后&#xff0c;测试同事跑自动化测试脚本&#xff0c;发现该软件频繁异常&#xff0c;通过查看log发现&#xff0c;该软件使用的MongoDB崩溃了。 该软件是个Windows的桌面软件&…

【QT+QGIS跨平台编译】之十二:【libpng+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文件目录 一、libpng介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libpng介绍 PNG(Portable Network Graphics,便携式网络图形),是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。 PNG使用从LZ77派生的无损数据压缩算…

Java类加载器

什么是类加载器? 1.1类加载器 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 需要有个人把我们写的java文件编译后的字节码文件搬运到虚拟机上 1.2类加载的完整过程 1.2类加载的完整过程 类加载时机 简单理解&#xff1a;字节码文件什么时候…

网络协议与攻击模拟_09部署DHCP服务器

一、部署DHCP服务器 Windows server部署DHCP服务器 1、虚拟机网络架构理解 Vmware里面不同的虚拟机可以设置相同的Vmnet网络&#xff0c;也可以设置不同的Vmnet网络。两台虚拟机设置相同的Vmnet1网卡&#xff0c;可以看作为使用虚拟交换机将两台Vmnet1的虚拟机连接起来的。 …

java学习之路(1)-隐藏桌面图标从CMD命令中打开软件

1.找到文件所在路径&#xff1a; 2.将文件路径添加到环境变量中 3.winr 打开cmd 输入命令&#xff08;目录后面的QQScLauncher.exe&#xff09; 直接可以打开QQ软件&#xff0c;删除桌面图标&#xff0c;别人就找不到了&#xff0c;只能通过cmd命令或者是找到安装包所在位置 …

微服务入门篇:Eureka注册中心(作用,搭建Eureka客户端和服务端)

目录 1.提供者与消费者2.Eureka的作用3.搭建EurekaServer1.配置服务端2.配置客户端3.复制实例操作4.服务拉取 1.提供者与消费者 ①服务提供者:一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务) ②服务消费者:一次业务中&#xff0c;调用其它微…

docker的资源限制(cgroup)

前瞻 Docker 通过 Cgroup 来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c; 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写&#xff0c;是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、…

雪亮工程视频智能监控方案,助力打造全方位、多层次视频监管体系

随着科技的不断发展&#xff0c;视频监控已经成为城市安全防范的重要手段之一。为了提高城市安全防范水平&#xff0c;各地纷纷开展“雪亮工程”&#xff0c;即利用视频智能监控技术&#xff0c;实现对城市各个角落的全方位、全天候监控。本文将介绍一种雪亮工程视频智能监控方…

虚拟化与容器化:服务部署转变的关键事件和国内发展动态

引言&#xff1a; 虚拟化和容器化技术的发展在服务部署领域产生了深远的影响&#xff0c;改变了企业的IT架构和应用部署方式。国际上&#xff0c;VMware和云计算的兴起是推动服务部署从物理机向虚拟化转变的重要事件和企业。而在容器化领域&#xff0c;Docker和Kubernetes的出…

Android 基础控件bug总结

1. Switch 控件 setChecked方法触发onCheckedChanged监听器问题 代码 setChecked&#xff0c;会触发监听。 解决方法&#xff1a; if (!mSwitch.isPressed()) {return; } 参考&#xff1a; Switch 控件 setChecked方法触发onCheckedChanged监听器问题_qml 为什么switch 没有…

Shell脚本⑤函数与数组

一.函数 封装的可重复利用的具有特定功能的代码 格式&#xff1a; 方法一&#xff1a; [function] 函数名 (){ 命令序列 [return x] #使用return或者exit可以显式的结束函数 } 方法二&#xff1a; 函数名(){ 命令序列 } 1.函数的调用方法 &#xff08;1&…

css flex布局详解

CSS Flex布局&#xff0c;即Flexible Box布局&#xff0c;是一种用于在页面上排列元素的高效方式&#xff0c;特别适合于响应式设计。Flex布局主要由容器&#xff08;Flex Container&#xff09;和项目&#xff08;Flex Items&#xff09;两部分组成。下面是Flex布局的一些基本…

洛谷 P1032 字串变换

题目描述 已知有两个字串 A,B 及一组字串变换的规则&#xff08;至多 6 个规则&#xff09;&#xff0c;形如&#xff1a; A1​→B1​。A2​→B2​。 规则的含义为&#xff1a;在 A 中的子串 A1​ 可以变换为 B1​&#xff0c;A2​ 可以变换为 B2​⋯。 例如&#xff1a;Aa…

Tensorflow2.0笔记 - tensor排序操作

本笔记主要记录sort,argsort,以及top_k操作&#xff0c;加上一个求Top K准确度的例子。 import tensorflow as tf import numpy as nptf.__version__#sort,argsort#对1维的tensor进行排序 tensor tf.random.shuffle(tf.range(10)) print(tensor) #升序 print("tf.sort(d…

纯血鸿蒙来了,企业开发者应该关注什么

2024年对于鸿蒙来说是一个里程碑&#xff0c;鸿蒙将正式对外发布 HarmonyOS NEXT 5.0&#xff0c;而此前传言的系统将不再对开发者层面兼容Android等消息将成为定论。 为什么鸿蒙能有这个底气&#xff1f;因为研究机构TechInsights发布预测报告称&#xff0c;华为HarmonyOS将在…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

基于 Docker 搭建 Uptime-Kuma 一个极简风的应用监控

GitHub&#xff1a;https://github.com/louislam/uptime-kuma 一、uptime-kuma 介绍 Demo&#xff1a;https://uptime.wuhanjiayou.cn/ uptime-kuma 是一款开源的监控工具, 支持 TCP / PING / HTTP 等多种监控方式&#xff0c;可监测网站&#xff0c;数据库&#xff0c;Docker…

如何在 Ubuntu 20.04 上安装 MySQL

介绍 MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xff09;堆栈的一部分安装。它实现关系模型并使用结构化查询语言&#xff08;更称为 SQL&#xff09;来管理其数据。 本教程将介绍如何在 Ubuntu 20…