routing zuul_尚学堂0131之zuul的相关概念及如何性能调优

采用服务名称指定路由方式

1.1使用服务名称指定路由的规则是什么?

1.2需改配置文件,将路由规则修改为使用服务名称路由。

通过服务名, service-id为服务名

zuul:

routes:

E-Book-Product-Provider:

path: /suibian/**

service-id: E-Book-Product-Provider

路由的排除方法

2.1什么是路由排除法?

2.2修改配置文件,将路由规则修改为添加前缀法。

排除知道服务。也可以排除所有服务/*,可以同routes添加不排除的服务

zuul:

ignored-services: #排除知道服务。也可以排除所有服务/*,可以同routes添加不排除的服务

- /* # E-Book-Product-Provider

ignored-patterns: #排除指定路径 使用符号统配

- /*/findAll

自定义网关过滤器

3.1创建一个Maven的jar项目。

3.2 修改POM文件,添加Zuul启动器。

3.3需改配置文件,添加服务相关配置。

spring:

application:

name: Zuul-Gateway-Filter

server:

port: 9999

eureka:

client:

serviceUrl:

defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/

# URL 匹配关键字,如果包含path就跳转到指定的 URL中

zuul: #配置路由规则

routes:

E-Book-Product-Provider:

path: /E-Book-Product-Provider/**

url: http://localhost:8001/

过滤器类型讲解

4.1 ZuulFilter的作用是什么?

4.2过滤器有哪些类型?有什么作用?

4.3在项目中创建一个登陆过滤器。

网关过滤器,过滤符合条件的url请求

PRE过滤器:是在请求路由到具体服务之前执行的,可以做安全验证,如身份验证,参数验证。

ROUTING过滤器:它用于将请求 路由到具体的微服务实例。默认使用Http Client进行网络请求。

POST过滤器:在请求已被路由到微服务后执行的。可用作收集统计信息、指标,以及将响应传输到客户端。

ERROR过滤器:在其他过滤器发生错误时执行。

Zuul的请求生命周期

5.1阐述Zuul的请求生命周期。

5.2创建权限验证服务。

5.3修改POM文件,添加相关坐标。

5.4修改POM问价,添加Zuul启动器坐标。

5.5修改配置文件,添加服务相关配置。

7b59a8dca5002d8a210cbe0a98e38595.png

采用网关过滤器实现权限验证

6.1 AccessFilter添加登录权限验证业务。

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import com.netflix.zuul.exception.ZuulException;

import io.micrometer.core.instrument.util.StringUtils;

/**

* 简单的登录权限校验

* @author Administrator

*

*/

@Component

public class TokenFilter extends ZuulFilter{

private static final Logger log=LoggerFactory.getLogger(TokenFilter.class);

/**

* 过滤逻辑

*/

@Override

public Object run() throws ZuulException {

RequestContext rc=RequestContext.getCurrentContext();

HttpServletRequest req = rc.getRequest();

String token = req.getParameter("token");

if(StringUtils.isEmpty(token)) {

//未登录

log.warn("未登录!!!!");

rc.setSendZuulResponse(false);//设置不向下传递,拦截不通过

rc.setResponseStatusCode(401);

rc.setResponseBody("未登录!!请先登录");

rc.getResponse().setContentType("text/html;charset=utf-8");

}else {

http://log.info("已登录,通过过滤器!!!");

}

return null;

}

/**

* 是否开启过滤

*/

@Override

public boolean shouldFilter() {

return true;

}

/**

* 拦截优先级 数字越小越高

*/

@Override

public int filterOrder() {

return 0;

}

/**

* 拦截器类型

* PRE过滤器:是在请求路由到具体服务之前执行的,可以做安全验证,如身份验证,参数验证。

*ROUTING过滤器:它用于将请求 路由到具体的微服务实例。默认使用Http Client进行网络请求。

*POST过滤器:在请求已被路由到微服务后执行的。可用作收集统计信息、指标,以及将响应传输到客户端。

*ERROR过滤器:在其他过滤器发生错误时执行。

*/

@Override

public String filterType() {

//只能是小写

return "pre";

}

}

网关过滤器执行顺序与post类型演示

7.1阐述多网关过滤器的执行顺序。

7.2创建AccessFilter2过滤器,PostFilter2过滤器,分析他们的执行顺序。

采用网关过滤器对系统异常同一处理

8.1阐述如何通过网关过滤器实现异常同意处理?

8.2 ErrorController接口的作用是什么?

8.3创建异常处理过滤器。

8.4创建处理异常响应的控制器,实现异常统一处理。

@Component

public class ErrorMyFilter extends ZuulFilter{

private Logger log=LoggerFactory.getLogger(ErrorMyFilter.class);

/**

* 过滤逻辑

*/

@Override

public Object run() throws ZuulException {

RequestContext rc=RequestContext.getCurrentContext();

HttpServletRequest req = rc.getRequest();

//http://localhost:9999/E-Book-Product-Provider/product/find?token=suibian

http://log.info("------网关过滤器拦截异常------");

throw new RuntimeException("运行异常");

}

/**

* 是否开启过滤

*/

@Override

public boolean shouldFilter() {

// TODO Auto-generated method stub

return true;

}

/**

* 拦截优先级 数字越小越高

*/

@Override

public int filterOrder() {

// TODO Auto-generated method stub

return 0;

}

/**

* 拦截器类型

* PRE过滤器:是在请求路由到具体服务之前执行的,可以做安全验证,如身份验证,参数验证。

*ROUTING过滤器:它用于将请求 路由到具体的微服务实例。默认使用Http Client进行网络请求。

*POST过滤器:在请求已被路由到微服务后执行的。可用作收集统计信息、指标,以及将响应传输到客户端。

*ERROR过滤器:在其他过滤器发生错误时执行。

*只能小写

*/

@Override

public String filterType() {

// TODO Auto-generated method stub

return "error";

}

}

Zuul和hystrix无缝结合

9.1 Zuul与Hystrix结合时,是否需要添加Hystrix坐标?

9.2获取网关数据流的URL是什么?

在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我们不需要在项目中添加 Hystrix 的坐标

http://localhost:port/actuator/hystrix.stream

在网关中实现对服务降级处理

10.1 ZuulFallbackProvider接口的作用是什么?

10.2创建Maven的jar工程。

10.3需改POM文件,添加相关坐标。

10.4修改POM文件,添加Zuul坐标。

10.5修改配置文件,添加服务相关配置。

10.6创建ProviderProductFallback类,添加服务降级业务逻辑。

ZuulFallbackProvider:定义了网关服务返回托底数据的方法

/**

* 实现FallbackProvider接口,实现服务降级

*

* 1.添加@Component注解

* 2.getRoute方法返回监控的服务名称

* 3.FallbackProvider

*

* @author Administrator

*

*/

@Component

public class ProductProviderFallback implements FallbackProvider {

/**

* 对指定的服务提供降级处理

*/

@Override

public String getRoute() {

return "E-Book-Product-Provider";

}

/**

* 设置降级后返回的响应

*/

@Override

public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

return new ClientHttpResponse() {

/**

* 响应头

*/

@Override

public HttpHeaders getHeaders() {

HttpHeaders hander=new HttpHeaders();

hander.setContentType(MediaType.APPLICATION_JSON_UTF8);

return hander;

}

/**

* 响应体

*/

@Override

public InputStream getBody() throws IOException {

String content="请求服务不可达!请联系管理员!";

return new ByteArrayInputStream(content.getBytes());

}

/**

* 状态码:String类型

*/

@Override

public String getStatusText() throws IOException {

// TODO Auto-generated method stub

return getStatusCode().getReasonPhrase();

}

/**

* 状态码:HttpStatus类型

*/

@Override

public HttpStatus getStatusCode() throws IOException {

return HttpStatus.OK;

}

/**

* 状态码:int类型

*/

@Override

public int getRawStatusCode() throws IOException {

// TODO Auto-generated method stub

return getStatusCode().value();

}

/**

* 关闭

*/

@Override

public void close() {

}

};

}

}

在高并发情况下,网关实现限流达到自我保护

11.1在高并发情况下,网关如何实现限流达到自我保护?

11.2网关限流配置参数zuul.ratelimit.enabled的作用是什么?

11.3网关限流配置参数zuul.ratelimit.repositry的作用是什么?

对网关服务进行限流

zuul.ratelimit.enabled:开启网关限流

zuul.ratelimit.repositry: 数据存储方式,默认为内存存储

11.4网关限流配置参数

11.5 zuul.ratelimit.policies.ServiceId.refresh-interval的作用是什么?

11.6网关限流配置参数zuul.ratelimit.policies.ServiceId.limit的作用是什么?

11.7网关限流配置参数zuul.ratelimit.policies.ServiceId.quota的作用是什么?

11.8网关限流配置参数zuul.ratelimit.policies.ServiceId.type的作用是什么?

2282c0393d1bd160841fc18406388e67.png

11.9创建Maven的jar工程。

11.10需改POM文件添加相关坐标。

11.11修改POM文件,添加Zuul坐标。

11.12修改POM文件,添加Ratelimit坐标。

11.13修改配置文件,添加服务相关配置。

11.14修改配置文件,添加全局限流策略。

11.15访问服务,测试限流结果。

11.16需改配置文件,添加局部限流策略。

11.17访问服务,测试限流结果。

spring:

application:

name: Zuul-getway-ratelimit

redis:

#redis单机配置

host: 47.98.169.238

port: 6379

#redis连接池配置

jedis:

pool:

max-idle: 10

min-idle: 5

max-active: 100

max-wait: 3000

server:

port: 8888

eureka:

client:

serviceUrl:

defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/

#配置路由规则

zuul:

routes:

E-Book-Product-Provider:

path: /suibian/**

ratelimit:

enabled: true #开启限流

#全 局 限 流

default-policy-list: #全局配置

- limit: 10 #访问次数

quota: 30 #访问总时间

refresh-interval: 60 #时间间隔

# 即在时间间隔内 访问的次数 总时间小于 访问总时间 就会被限制

type:

- origin #对ip进行限制

repository: redis #数据存储方式,默认为内存存储

#指定服务限流(局部限流)

# policy-list:

# E-Book-Product-Provider: #被限流的服务名

# - limit: 10

# quota: 30

# refresh-interval: 60

# type:

# - url

# repository: redis #数据存储方式,默认为内存存储

#开启监控端点 http://ip:port/actuator/hystrix.stream 需要actuatorjar包

#management:

# endpoints:

# web:

# exposure:

# include: hystrix.stream

Zuul性能调优-网关的2层超时调优

12.1什么是网关的2层超时调优?

12.1创建Maven的jar工程。

12.2修改POM文件,添加相关坐标。

12.4修改POM文件,添加Zuul启动器坐标。

12.5修改配置文件,添加2层超时调优策略。

hystrix的超时时间为1s,而ribbon为5s,假设请求在1s内没有处理完,就会timeout。

我们将hystrix的超时时间调高,避免timeout。

但ribbon的超时时间应该小于hystrix,在集群环境下,给充足的时间让ribbon调用集群中其他服务。

<!-- SpringBoot配套的运行环境,一定要加上,不加会报错!!! -->

<properties>

<java.version>1.8</java.version>

<spring-cloud.version>Greenwich.SR2</spring-cloud.version>

<maven-jar-plugin.version>2.6</maven-jar-plugin.version>

</properties>

<dependencies>

<!-- 表示依赖不向下传递 -->

<optional>true</optional>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

<!-- 网关服务 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-zuul</artifactId>

</dependency>

</dependencies>

spring:

application:

name: Zuul-Gateway-Timeout

server:

port: 9999

eureka:

client:

serviceUrl:

defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/

#http://localhost:9999/suibian/product/find

zuul:

routes:

E-Book-Product-Provider:

path: /suibian/**

#hystrix的超时时限

hystrix:

command:

default:

execution:

isolation:

thread:

timeoutInMilliseconds: 8000

#ribbon的超时时限

ribbon:

ReadTimeout: 5000

ConnectTimeout: 5000

management:

endpoints:

web:

exposure:

include: hystrix.stream

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

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

相关文章

实时通信:使用Spring Boot实现Websocket

在开发Web应用程序时&#xff0c;有时我们需要将服务器事件下推到已连接的客户端。 但是&#xff0c;HTTP并非旨在允许这样做。 客户端打开与服务器的连接并请求数据。 服务器不会打开与客户端的连接并推送数据。 为了解决此限制&#xff0c;建立了一种轮询模式&#xff0c;其…

CUDA10.1配置VS2017

目录 一 CUDA 安装 二 CUDA环境变量配置 三 CUDA配置VS2017 一 CUDA 安装 1.1 CUDA下载 网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 可以根据需要下载不同版本的CUDA安装包。 1.2 CUDA安装 1.2.1 双击下载的.exe文件安装 1.2.2 点击‘OK’ 1.2…

鸿蒙应用开发 常用组件与布局

简介 HarmonyOS ArkUI 提供了丰富多样的 UI 组件&#xff0c;您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇 Codelab 中&#xff0c;您将通过一个简单的购物社交应用示例&#xff0c;学习如何使用常用的基础组件和容器组件。本示例主要包含&#xff1a;“登录”…

[数论]莫比乌斯反演1

索引 莫比乌斯反演1 定理莫比乌斯反演2 证明莫比乌斯反演3 技巧前言 本篇内容全部为定理&#xff0c;无证明 定义 莫比乌斯函数的符号为\(\mu\)&#xff0c;通俗的来讲\[ \mu(n) \left\{ \begin{matrix} 1 & n1\\ (-1)^k & n p_1p_2p_3\dots p_k\\ 0 & \text{其他…

怎么卸载光速头条_我用这三招,整理了桌面并且屏蔽了广告弹窗

这段时间&#xff0c;在用公司电脑工作时&#xff0c;有两个问题让我非常不爽。一是正处在专心工作中&#xff0c;突然桌面中间就弹出一个&#xff1a;天猫双12的广告&#xff0c;而且还没有关闭按钮。只能打开然后再关闭。二是每次打开电脑&#xff0c;桌面中间和右下角就有一…

Qt配置VS2017

目录 一 Qt安装 二 VS2017安装 三 Qt配置VS2017 一 Qt安装 1.1 下载网址&#xff1a;http://download.qt.io/archive/qt/ 这里选择 1.2 安装Qt 安装路径可以自己更改&#xff0c;然后点下一步 可以根据自己的VS版本自己选择&#xff0c;我们这里选MSVC-2017 64-bit 二…

opencv python tutorials_OpenCV-Python Tutorials 笔记(二)

OpenCV官方有一个面向python的文档OpenCV-PythonTutorials&#xff1a;我根据此文档进行了实践学习&#xff0c;结合自己经验简单记录一下笔记。(续)4、Image Processing inOpenCV4.1ChangingColorspaces转换颜色空间算是极其常用的操作了。不用说&#xff0c;cvtColor()。相关…

runltp出现问题 [

runltp 623行&#xff1a; if [ "$?" "0" ]; then 对[解析出了问题。 我灵机一动&#xff0c;是不是sh的问题。 which sh /bin/sh ls -l /bin/sh sh指向dash 果然不对 rm后 ln -s /bin/bash /bin/sh 再次运行&#xff0c;正确。 转载于:https://www.cnbl…

fork join框架_Java 7:Fork / Join框架示例

fork join框架Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计&#xff0c;并将这些任务的结果组合起来以产生最终结果。 通常&#xff0c;使用Fork / Join Framework的类遵循以下简单算法&#xff1a; // pseudocode Result solve(Problem problem) {if (p…

numpy T、transpose()函数、swapaxes()函数

目录 1 矩阵转置T&#xff0c;既线性代数中矩阵转置 2 transpose()函数 3 swapaxes()函数 1 矩阵转置T&#xff0c;既线性代数中矩阵转置 示例程序如下&#xff1a; import numpy as npa np.arange(0,24,2).reshape(3, 4)print(*****a****) print(a: \n, a) print(a.…

leetcode-54 螺旋矩阵

题目: 给定一个包含 m x n 个元素的矩阵&#xff08;m 行, n 列&#xff09;&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,…

米线店结账程序 装饰着模式_实验报告2_装饰者模式

序号&#xff1a;姓名&#xff1a;杨林燕学号&#xff1a;106专业&#xff1a;软件工程日期&#xff1a;成绩&#xff1a;实验二装饰者模式的运用一、实验目的&#xff1a;装饰者模式动态地将责任附加到对象上&#xff0c;若要扩展功能&#xff0c;装饰者提供了比继承更有弹性的…

Java的内置垃圾收集如何使您的生活更美好(大部分时间)

通过从应用程序中学习企业APM产品&#xff0c;发现更快&#xff0c;更高效的性能监控。 参加AppDynamics APM导览&#xff01; “无需为用户编写将寄存器返回到自由存储列表的程序。” 该行&#xff08;以及随后的十几行&#xff09;被埋在约翰麦卡锡&#xff08;John McCart…

PyOpenCV 坐标系统

pyOpenCV中的坐标系统&#xff0c;以图片左上角为原点&#xff08;0,0&#xff09;&#xff0c;水平方向为x轴&#xff08;也既图像的宽度width&#xff09;&#xff0c;竖直方向为y轴&#xff08;也既图像的高度height&#xff09;&#xff0c;如下图所示&#xff1a; #图像中…

office 论文 页码_毕业论文必备技巧:Word页码从第三页开始设置方法

许多应届毕业生在排版毕业论文时候&#xff0c;都会按要求设置页码&#xff0c;第一页是封面&#xff0c;第二页是目录&#xff0c;那么正文内容就要从第三页正式开始了。按照正规设置方式&#xff0c;那么页码此时应该是第三页。但是按照论文格式规定&#xff0c;页码应该是从…

散列

一.什么是散列 散列使用一个散列函数&#xff0c;将一个键映射到一个索引上。散列非常高效。使用散列将耗费O(1)时间来查找、插入、及删除一个元素。 映射表是一种用散列实现的数据结构&#xff0c;映射表是一种存储条目的容器&#xff0c;每个条目包含两个部分&#xff1a;一个…

移动端触摸(touch)事件

目有个交互需要实现手指滑动的交互&#xff0c;pc端使用mousedown,mousemove,mouseup监听实现。 但在ios设备上mousemove是不好监听的&#xff0c;同类的方法是touchstart,touchmove,touchend。 项目需求&#xff0c;需要用到拖动事件。由于不需要考虑IE8等低端浏览器的兼容性&…

numcpp速度对比_PHP和C++性能对比.pdf

PHP 与C性能比较本文博客链接&#xff1a;http://keping.me/php_vs_cpp/PHP 是速度很快的脚本语言&#xff0c;但是用了框架以后好像感觉挺慢的。于是猜测会不会PHP 本身也不是很快。如果不是很快&#xff0c;能否采用 PHP 调用本地动态链接库的形式来提升速度。于是有了下面的…

jndi ldap_什么是JNDI,SPI,CCI,LDAP和JCA?

jndi ldapJNDI代表Java命名和目录接口 。 它是用于提供对目录服务&#xff08;即&#xff0c;服务映射名称&#xff08;字符串&#xff09;与对象&#xff0c;对远程对象或简单数据的引用&#xff09;访问的API。 这就是所谓的 约束力 。 绑定集称为上下文 。 应用程序使用JND…

PyOpenCV 基本操作

目录 1. 图片加载、显示和保存 2. 图像显示窗口创建与销毁 3. 图片宽、高、通道数获取 4. 图像像素数目和图像数据类型的获取 5. 生成指定大小的空图像, 生成指定大小的空图像 6. 访问和操作图像像素 7. 图像三通道分离和合并 8. 抓取摄像头 1. 图片加载、显示和保存 …