什么是微服务中的网关
1.1为什么要使用网关?
协调请求与服务的调用关系,协调服务之间的关系。
1.2网关解决了什么问题?
![71fbf9e5a1e3dc2c3e73f7dc10cf1331.png](https://i-blog.csdnimg.cn/blog_migrate/1c4511f6cc71d4060b2af29a4b5a470d.png)
网关服务入门
2.1 @EnableZuulProxy注解的作用是什么?
加在网关的启动类上,开启项目对于zuul网关技术的支持。
2.2添加网关服务后,访问服务的URL格式是什么?
http://网关服务地址:网关服务端口/访问的服务的名称/访问的服务中的接口的~~地址~~~
![e3aaa9d8b38cdbb68945fda7dbfc43f1.png](https://i-blog.csdnimg.cn/blog_migrate/202d1922b287c6ca51afd0234918c6c7.png)
2.3创建一个Maven的jar工程。
![6081a47531c41603eb81dc52a08da37d.png](https://i-blog.csdnimg.cn/blog_migrate/4fd28ebce650f198ea1dffafff83b437.png)
2.4修改POM文件,添加相关坐标。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.5修改配置文件,添加服务相关配置。
spring.application.name=zuul-gateway
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
2.6创建启动类。开启网关代理。
@SpringBootApplication
@EnableZuulProxy
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class,args);
}
}
2.7测试通过网关请求服务。
![a3db55fe5ea4e4497df626fec23c09e3.png](https://i-blog.csdnimg.cn/blog_migrate/4189158f0e6da00ed56e5db03825565c.png)
采用URL指定路由方式
3.1路由器中支持几种路由规则?
4种:
修改配置文件配置路由规则;
采用服务名称指定路由方式;
路由的排除方法;
路由的添加前缀方法。
3.2 URL指定路由是什么规则?
URL 匹配关键字,如果包含关键字就跳转到指定的 URL 中
3.3通配符?表示的含义是什么?
匹配任意单个字符
如:/e-book-product-provider/?
代表可以匹配:
/e-book-product-provider/a
/e-book-product-provider/b
3.4通配符*表示的含义是什么?
匹配任意多个字符
如:/e-book-product-provider/*
代表可以匹配:
/e-book-product-provider/abc
/e-book-product-provider/bac
3.5通配符**表示的含义是什么?
匹配任意多层字符路径
如:/e-book-product-provider/**
代表可以匹配:
/e-book-product-provider/abc/aab
/e-book-product-provider/bac/abc
3.6修改配置文件配置URL路由规则。
修改配置文件,添加以下配置:
zuul.routes.e-book-product-provider.path=/e-book-product-provider/**
zuul.routes.e-book-product-provider.url=http://127.0.0.1:9001/
采用服务名称指定路由方式
1.1使用服务名称指定路由的规则是什么?
路由指定:服务指定 1
将路径的/suibian/引到 eureka 的 e-book-product-provider 服务上
规则:zuul.routes.路径名.path
规则:zuul.routes.路径名.serviceId=eureka 的服务名
路由指定:服务指定 2
zuul.routes 后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
1.2需改配置文件,将路由规则修改为使用服务名称路由。
# 路由指定:服务指定 1
#zuul.routes.e-book-product-provider.path=/suibian/**
#zuul.routes.e-book-product-provider.serviceId=e-book-product-provider
# 路由指定:服务指定 2
zuul.routes.e-book-product-provider.path=/suibian/**
路由的排除方法
2.1什么是路由排除法?
路由排除:排除某几个服务。排除后,这个地址将为空。多个服务逗号隔开。
由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加。
2.2修改配置文件,将路由规则修改为添加前缀法。
##
http://127.0.0.1:9030/suibian/product-provider/product/findAll
zuul.prefix=/suibian
zuul.routes.e-book-product-provider.path=/product-provider/**
自定义网关过滤器
3.1创建一个Maven的jar项目。
![abbbe888cf2952d7fd276aa16ff5e982.png](https://i-blog.csdnimg.cn/blog_migrate/eb0617ae2aa9d3a30705f3776f903729.png)
3.2 修改POM文件,添加Zuul启动器。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway-filter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动器
@SpringBootApplication
@EnableZuulProxy
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class, args);
}
}
3.3需改配置文件,添加服务相关配置。
spring.application.name=zuul-gateway
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
zuul.routes.e-book-product-provider.path=/anyname/**
过滤器类型讲解
4.1 ZuulFilter的作用是什么?
对指向服务的请求进行一些处理。
4.2过滤器有哪些类型?有什么作用?
Pre:可以在请求被路由之前调用。一般用于身份权限认证、记录调用日志等等。
Routing:在请求路由之后被调用。
Post:在rooting和error过滤器之后被调用。可用于信息征集、统计信息例如性能指标,对response的结构做些特殊处理。
Error:处理请求发生错误时进行调用。用于异常处理封装。
4.3在项目中创建一个登陆过滤器。
package com.bjsxt.filter;
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;
@Component
public class MyFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(MyFilter.class);
/**
* 是否开启过滤器,默认为false不开启
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 执行过滤的逻辑
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
logger.info("-------------------pre1--------------------------");
String token = request.getParameter("token");
if (token==null) {
logger.warn("token is null...........");
context.setSendZuulResponse(false);
context.setResponseBody("{"result":"token is null"}");
context.setResponseStatusCode(401);
context.getResponse().setContentType("text/html;charset=utf-8");
}else {
logger.info("token is ok");
}
return null;
}
/**
* 过滤器的类型
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre";
}
/**
* 过滤器的执行优先级,数字越小,优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
Zuul的请求生命周期
5.1阐述Zuul的请求生命周期。
![af018416ff9c6edc24c05be1f1802223.png](https://i-blog.csdnimg.cn/blog_migrate/2bb2233efcb0b78aa43811c3cc9b9cb1.png)
5.2创建权限验证服务。
![53ddd9c568b6b130604bc5c386070891.png](https://i-blog.csdnimg.cn/blog_migrate/273e3ae71993410d4d4fd71133b0825e.png)
5.3修改POM文件,添加相关坐标。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.4修改配置文件,添加服务相关配置。
spring.application.name=zuul-gateway
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
zuul.routes.e-book-product-provider.path=/anyname/**
采用网关过滤器实现权限验证
6.1 AccessFilter添加登录权限验证业务。
/**
* 执行过滤的逻辑
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
logger.info("-------------------pre1--------------------------");
String token = request.getParameter("token");
if (token==null) {
logger.warn("token is null...........");
context.setSendZuulResponse(false);
context.setResponseBody("{"result":"token is null"}");
context.setResponseStatusCode(401);
context.getResponse().setContentType("text/html;charset=utf-8");
}else {
logger.info("token is ok");
}
return null;
}
网关过滤器执行顺序与post类型演示
7.1阐述多网关过滤器的执行顺序。
Pre routing post依次执行,类型相同时,比较FilterOrder的大小,数字越小,执行优先级越高。
7.2创建AccessFilter2过滤器,PostFilter2过滤器,分析他们的执行顺序。
例如AccessFilter2是pre类型,FilterOrder为1,大于AccessFilter的FilterOrder 0 ,又因为post在pre过滤器之后执行,所以执行顺序是:
AccessFilter--->AccessFilter2--->PostFilter2
采用网关过滤器对系统异常同一处理
8.1阐述如何通过网关过滤器实现异常统一处理?
定义一个类,继承ZuulFilter,FilterType返回值设置为error,说明该过滤器是异常过滤器,专门处理路由请求时所产生的异常。
8.2 ErrorController接口的作用是什么?
截取异常请求的路径,对异常进行统一的处理。
8.3创建异常处理过滤器。
package com.bjsxt.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
@Component
public class ErrorFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
/**
* 是否开启过滤器,默认为false不开启
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 执行过滤的逻辑
*/
@Override
public Object run() throws ZuulException {
logger.info("-------------------error--------------------------");
return null;
}
/**
* 过滤器的类型
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "error";
}
/**
* 过滤器的执行优先级,数字越小,优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
8.4创建处理异常响应的控制器,实现异常统一处理。
package com.bjsxt.filter;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
// TODO Auto-generated method stub
return "/error";
}
@RequestMapping("/error")
public String showError() {
return "{"result":"error 500!!!!!"}";
}
}
Zuul和hystrix无缝结合
9.1 Zuul与Hystrix结合时,是否需要添加Hystrix坐标?
在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我们不需要在项目中加 Hystrix 的坐标
9.2获取网关数据流的URL是什么?
http://localhost:9020/actuator/hystrix.stream
注意:要在配置文件中暴露健康信息的端口
management.endpoint.env.enabled=true
management.endpoints.web.exposure.include=*
在网关中实现对服务降级处理
10.1 ZuulFallbackProvider接口的作用是什么?
在hystrix 1.5.18版中是FallbackProvider
10.2创建Maven的jar工程。
![f2eade2efc0cb07208f8b37fe692d45c.png](https://i-blog.csdnimg.cn/blog_migrate/8d015d0f71c477a62f4387a0f7aa0b8e.png)
10.3需改POM文件,添加相关坐标。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway-fallback</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
10.4修改POM文件,添加Zuul坐标。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
10.5修改配置文件,添加服务相关配置。
spring.application.name=zuul-gateway-fallback
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
zuul.routes.e-book-product-provider.path=/anyname/**
management.endpoint.env.enabled=true
management.endpoints.web.exposure.include=*
10.6创建ProviderProductFallback类,添加服务降级业务逻辑。
package com.bjsxt.fallback;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
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;
@Component
public class ProductProviderFallback implements FallbackProvider{
@Override
public String getRoute() {
// TODO Auto-generated method stub
return "e-book-product-provider";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
// TODO Auto-generated method stub
return new ClientHttpResponse() {
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("application", "json", Charset.forName("utf-8"));
headers.setContentType(mediaType);
return headers;
}
@Override
public InputStream getBody() throws IOException {
String resp = "商品服务不可用,请与管理员联系";
return new ByteArrayInputStream(resp.getBytes());
}
@Override
public String getStatusText() throws IOException {
// TODO Auto-generated method stub
return this.getStatusCode().getReasonPhrase();
}
@Override
public HttpStatus getStatusCode() throws IOException {
// TODO Auto-generated method stub
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
// TODO Auto-generated method stub
return this.getStatusCode().value();
}
@Override
public void close() {
// TODO Auto-generated method stub
}
};
}
}
在高并发情况下,网关实现限流达到自我保护
11.1在高并发情况下,网关如何实现限流达到自我保护?
通过ratelimit来限制用户单位时间发送给服务器的请求的次数,超过次数就会报异常并拒绝请求。
11.2网关限流配置参数zuul.ratelimit.enabled的作用是什么?
开启ratelimit限流控制
11.3网关限流配置参数zuul.ratelimit.repositry的作用是什么?
指定支持的存储方式:
IN_MEMORY:使用ConcurrentHashMap作为数据存储
Consul:使用Consul作为数据存储
REDIS:使用redis作为数据存储
JPA:使用数据库作为数据存储
11.4网关限流配置参数
![b11f686d334d2ebd340a929d0f2c4f4c.png](https://i-blog.csdnimg.cn/blog_migrate/feb8b5705c890fbae58eee6a332df623.jpeg)
11.5zuul.ratelimit.policies.ServiceId.refresh-interval的作用是什么?
刷新时间窗口的时间,默认为60秒
11.6网关限流配置参数zuul.ratelimit.policies.ServiceId.limit的作用是什么?
每个刷新时间窗口对应的请求数量限制
11.7网关限流配置参数zuul.ratelimit.policies.ServiceId.quota的作用是什么?
单位时间内允许被访问的总时间,例如一分钟中内所有请求的时间总计不能超过30秒
11.8网关限流配置参数zuul.ratelimit.policies.ServiceId.type的作用是什么?
指定限流的策略
ORIGIN:对访问IP进行限流
URL:对被访问的URL进行限流
USER:对某些特定用户或用户组进行限流
11.9创建Maven的jar工程。
![a7c820f260c529f68004fe9e3f95785d.png](https://i-blog.csdnimg.cn/blog_migrate/3e0988c8debdce074246bce5739d89dc.png)
11.10需改POM文件添加相关坐标。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway-ratelimit</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.marcosbarbero.cloud/spring-cloud-zuul-ratelimit -->
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
11.11修改POM文件,添加Zuul坐标。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
11.12修改POM文件,添加Ratelimit坐标。
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
11.13修改配置文件,添加服务相关配置。
spring.application.name=zuul-gateway-ratelimit
server.port=9020
eureka.client.service-url.defaultZone=http://user:123@eureka1:8761/eureka/,http://user:123@eureka2:8761/eureka/
#zuul.routes.e-book-product-provider.path=/anyname/**
#zuul.routes.e-book-product-provider.url=http://127.0.0.1:9001/
#zuul.routes.e-book-product-provider.path=/anyname/**
#zuul.routes.e-book-product-provider.serviceId=e-book-product-provider
#zuul.prefix=/api
zuul.routes.e-book-product-provider.path=/product/**
management.endpoint.env.enabled=true
management.endpoints.web.exposure.include=*
zuul.ratelimit.enabled=true
#zuul.ratelimit.default-policy.limit=3
#zuul.ratelimit.default-policy.refresh-interval=60
#zuul.ratelimit.default-policy.type=origin
11.14修改配置文件,添加全局限流策略。
zuul.ratelimit.enabled=true
zuul.ratelimit.default-policy.limit=3
zuul.ratelimit.default-policy.refresh-interval=60
zuul.ratelimit.default-policy.type=origin
11.15访问服务,测试限流结果。
![5dcfd7c9a5fa5e705ce8e9ba18591fd2.png](https://i-blog.csdnimg.cn/blog_migrate/a9d32c88af8a825f864ab0133497aee1.png)
11.16需改配置文件,添加局部限流策略。
zuul.ratelimit.enabled=true
zuul.ratelimit.policies.e-book-product-provider.limit=3
zuul.ratelimit.policies.e-book-product-provider.refresh-interval=60
zuul.ratelimit.policies.e-book-product-provider.type=origin
11.17访问服务,测试限流结果。
![5dcfd7c9a5fa5e705ce8e9ba18591fd2.png](https://i-blog.csdnimg.cn/blog_migrate/a9d32c88af8a825f864ab0133497aee1.png)
Zuul性能调优-网关的2层超时调优
12.1什么是网关的2层超时调优?
![5dcfd7c9a5fa5e705ce8e9ba18591fd2.png](https://i-blog.csdnimg.cn/blog_migrate/a9d32c88af8a825f864ab0133497aee1.png)
![b99bc6b6f30a45c09beedb98b41426d5.png](https://i-blog.csdnimg.cn/blog_migrate/84e826c5ba2c629296da088a4172d8d1.png)
12.1创建Maven的jar工程。
![20c3922e56839d937f74a4587a75557e.png](https://i-blog.csdnimg.cn/blog_migrate/da3b2e71b4d2e004604b0d0b4a50b165.png)
12.2修改POM文件,添加相关坐标。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>zuul-gateway-timeout</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
12.4修改POM文件,添加Zuul启动器坐标。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
12.5修改配置文件,添加2层超时调优策略。
#第一层 hystrix 超时时间设置
#默认情况下是线程池隔离,超时时间 1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=8000
#第二层 ribbon 超时时间设置:设置比第一层小
# 请求连接的超时时间: 默认 5s
ribbon.ConnectTimeout=5000
# 请求处理的超时时间: 默认 5s
ribbon.ReadTimeout=5000