入门


@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
1.1 四种路由规则zuul-gateway-route


## 1 ############# 路由指定:URL指定 #################
## URL匹配关键字,如果包含关键字就跳转到指定的URL中
#zuul.routes.book-product.path=/book-product/\*\*
#zuul.routes.book-product.url=http://127.0.0.1:8083/
## 2 ########### 路由指定:服务指定1 ##############
##将路径的/book-product/引到 eureka的e-book-product服务上
##规则:zuul.routes.路径名.path
##规则:zuul.routes.路径名.serviceId=eureka的服务名
##http://127.0.0.1:9010/book-product/product/list
##等同于
##http://127.0.0.1:9010/e-book-product/product/list
#zuul.routes.book-product.path=/book-product/\*\*
#zuul.routes.book-product.serviceId=e-book-product
**## 3 ##########** **路由指定****:****服务指定****1 #################**
#zuul.routes后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
#zuul.routes.e-book-product.path=/book-product/\*\*
## 4 ############ 路由排除:排除某几个服务 ################
##排除后,这个地址将为空 #http://127.0.0.1:9010/e-book-product/product/list
## 多个服务逗号隔开
#zuul.ignored-services=e-book-product
## 5 ############### 路由排除:排除所有服务 ###################由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加
#zuul.ignored-services=\*
#zuul.routes.e-book-consumer-hystrix.path=/book-consumer/\*\*
## 6 ####### 路由排除:排除指定关键字的路径 ##################
# 排除所有包括/list/的路径
#zuul.ignored-patterns=/\*\*/list/\*\*
#zuul.routes.e-book-product.path=/book-product/\*\*
## 7 ########## 路由添加前缀:为所有路径添加前缀 ##############
##http://127.0.0.1:9010/book-product/product/list
##必须改成
##http://127.0.0.1:9010/api/book-product/product/list
#zuul.prefix=/api
#zuul.routes.e-book-product.path=/book-product/\*\*
1.1 自定义过滤器zuul-gateway-filter


@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
类logFilter.java
package com.agan.book.zuul.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;
/\*\*
\*
\*@author 阿甘
\*@see http://study.163.com/instructor/1016671292.htm
\*@version 1.0
\*/
@Component
public class LogFilter extends ZuulFilter{
private static final Logger logger =LoggerFactory.getLogger(LogFilter.class);
/\*\*
\* 开启过滤器
\*/
@Override
public boolean shouldFilter() {
return true;
}
/\*\*
\* 过滤器的作用,打印请求的信息
\*/
@Override
public Object run() {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest request=rc.getRequest();
logger.info("method={},url={}",request.getMethod(),request.getRequestURL().toString());
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
1.1 鉴权+统一异常zuul-gateway-filter-exception
@Component
public class AccessFilter extends ZuulFilter{
private static final Logger logger =LoggerFactory.getLogger(AccessFilter.class);
/\*\*
\* 开启过滤器
\*/
@Override
public boolean shouldFilter() {
return true;
}
/\*\*
\* 过滤器的作用,权限校验
\*/
@Override
public Object run() {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest request=rc.getRequest();
logger.info("--------------pre1-------------------");
String token=request.getParameter("token");
if(token==null){
logger.warn("token is null............");
rc.setSendZuulResponse(false);//代表结束请求,不在继续下级传递。
rc.setResponseStatusCode(401);
rc.setResponseBody("{\\"result\\":\\"token is null\\"}");
rc.getResponse().setContentType("text/html;charset=utf-8");
}else{
// TODO redis 验证
logger.info("token is OK");
}
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
package com.agan.book.zuul.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;
/\*\*
\*
\*@author 阿甘
\*@see http://study.163.com/instructor/1016671292.htm
\*@version 1.0
\*/
@Component
public class PostFilter extends ZuulFilter{
private static final Logger logger =LoggerFactory.getLogger(PostFilter.class);
/\*\*
\* 开启过滤器
\*/
@Override
public boolean shouldFilter() {
return true;
}
/\*\*
\* 过滤器的作用,post验证
\*/
@Override
public Object run() {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest request=rc.getRequest();
logger.info("--------------post-------------------");
return null;
}
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
error
@Component
public class ErrorFilter extends ZuulFilter{
private static final Logger logger =LoggerFactory.getLogger(ErrorFilter.class);
/\*\*
\* 开启过滤器
\*/
@Override
public boolean shouldFilter() {
return true;
}
/\*\*
\* 过滤器的作用,post验证
\*/
@Override
public Object run() {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest request=rc.getRequest();
logger.info("--------------error-------------------");
return null;
}
@Override
public String filterType() {
return "error";
}
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
1.1.1 鉴权效果



1.1.1 执行顺序效果


1.1.1 有异常情况(模拟抛异常)
由下图可知:异常并没有被捕获


1.1.1 异常处理ErrorGatewayController.java
package com.agan.book.zuul.filter;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ErrorGatewayController implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping("/error")
public String error(){
return "{\\"result\\":\\"500 error!!!\\"}";
}
}
1.1.1 统一异常处理效果(超时也有效)


1.1 鉴权加强


测试效果


测试效果二


测试效果三 ————放到请求头里面

1.1.1 工作中情况

返回false直接放行,返回true就拦截进入下面

1.1 网关容错(zuul-gateway-fallback)
1.1.1 zuul和hystrix结合(内含)
启动2.2生产者e-book-product-core
网关3.1 zuul-gateway 9010
监控 e-book-consumer-hystrix-dashboard 1001





1.1.1 网关实现服务降级zuul-gateway-fallback
package com.agan.book.zuul.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.ZuulFallbackProvider;
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 ProductFallbackProvider implements ZuulFallbackProvider{
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse(){
@Override
public InputStream getBody() throws IOException {
String input="商品服务不可用,请联系管理员!";
return
new ByteArrayInputStream(input.getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders header=new HttpHeaders();
MediaType mt=new MediaType(
"application",
"json",
Charset.forName("UTF-8"));
header.setContentType(mt);
return header;
}
@Override
public void close() {
}
@Override
public int getRawStatusCode() throws IOException {
// httpresponse的fallback的状态码,int值
return this.getStatusCode().value();
}
@Override
public HttpStatus getStatusCode() throws IOException {
// httpresponse的fallback的状态码,HttpStatus值
return HttpStatus.OK;
}
@Override
public String getStatusText() throws IOException {
// httpresponse的fallback的状态码,string
return this.getStatusCode().getReasonPhrase();
}
};
}
@Override
public String getRoute() {
// 代表为那个服务提供fallback
return "e-book-product";
}
}
1.1.1.1 测试效果
启动生产者: e-book-produt-core
网关: zuul-gateway-fallback

停掉生产者
效果:


1.1 高并发下,网关实现限流达到自我保护zuul-gateway-ratelimit


# 针对某个服务进行限流
#zuul.routes.book-product.path=/book-product/\*\*
#zuul.routes.book-product.serviceId=e-book-product
#
##开启限流
#zuul.ratelimit.enabled=true
##60s内请求超过3次,服务端就抛出异常,60s后可以恢复正常请求
#zuul.ratelimit.policies.book-product.limit=3
#zuul.ratelimit.policies.book-product.refresh-interval=60
##针对某个IP进行限流,不影响其他IP
#zuul.ratelimit.policies.book-product.type=origin
#全局配置限流
zuul.ratelimit.enabled=true
zuul.ratelimit.default-policy.limit=3
zuul.ratelimit.default-policy.refresh-interval=60
zuul.ratelimit.default-policy.type=origin
1.1 网关2层超时调优zuul-gateway-timeout
#第一层hystrix超时时间设置
#默认情况下是线程池隔离,超时时间1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=8000
#第二层ribbon超时时间设置:设置比第一层小
# 请求连接的超时时间: 默认5s
ribbon.ConnectTimeout=5000
# 请求处理的超时时间: 默认5s
ribbon.ReadTimeout=5000
1.1 请求头被zuul过滤掉

setRoutes方法


只需如下配置:
