采用服务名称指定路由方式
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修改配置文件,添加服务相关配置。

采用网关过滤器实现权限验证
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的作用是什么?

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