zuul网关_124 服务网关Zuul

什么是微服务中的网关

1.1为什么要使用网关?

协调请求与服务的调用关系,协调服务之间的关系。

1.2网关解决了什么问题?

71fbf9e5a1e3dc2c3e73f7dc10cf1331.png

网关服务入门

2.1 @EnableZuulProxy注解的作用是什么?

加在网关的启动类上,开启项目对于zuul网关技术的支持。

2.2添加网关服务后,访问服务的URL格式是什么?

http://网关服务地址:网关服务端口/访问的服务的名称/访问的服务中的接口的~~地址~~~

e3aaa9d8b38cdbb68945fda7dbfc43f1.png

2.3创建一个Maven的jar工程。

6081a47531c41603eb81dc52a08da37d.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

采用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

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

5.2创建权限验证服务。

53ddd9c568b6b130604bc5c386070891.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

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

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

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

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

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

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

5dcfd7c9a5fa5e705ce8e9ba18591fd2.png

b99bc6b6f30a45c09beedb98b41426d5.png

12.1创建Maven的jar工程。

20c3922e56839d937f74a4587a75557e.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值