Zuul 例子配置文件
- spring.application.name=switch-gateway
- server.port=5555
请求路由
传统路由方式
zuul.routes.API-a-url.path=/API-a-url/**
zuul.routes.API-a-url.url=http://localhost:8080
转发规则如下:
访问链接
http://localhost:5555/API-a-url/hello
转发到
http://localhost:8080/hello
上面是单实例配置, 多实例配置如下
zuul.routes.API-a.path=/API-a/**
zuul.routes.API-a.serviceId=hello-service
# 没有 eureka, 所以置为 false
ribbon.eureka.enabled=false
hello-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
面向服务的路由方式
结合 eureka 的发现服务功能, 实现如下
zuul.routes.API-a.path=/API-a/**
zuul.routes.API-a.serviceId=hello-service
zuul.routes.API-b.path=/API-b/**
zuul.routes.API-b.serviceId=hello-client
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka
分别有服务 hello-service 和 hello-client 在 eureka 上注册
访问链接
http://localhost:5555/API-a/hello
会转发到服务 hello-service 的某个实例上去
服务路由默认配置规则
如果没有以下配置
zuul.routes.API-a.path=/API-a/**
zuul.routes.API-a.serviceId=hello-service
则会生成默认的配置如下
http://localhost:5555/hello-service/hello
即网关路径 + 服务实例名 + 访问路径
可通过设置如下取消默认配置规则
zuul.ignored-services=*
忽略表达式配置
如果设置了配置项如下
zuul.routes.API-a.path=/API-a/**
zuul.routes.API-a.serviceId=hello-service
所有访问路径 / API-a/** 都会被路由, 但是如果有一个特定的路径 / API-a/abc 并不想被路由, 则只需要配置如下
zuul.ignored-patterns=/**/abc/**
zuul 路由时带上 cookie 和头部信息
zuul 在默认情况下会过滤掉 http 请求头信息的一些敏感信息, 防止传递到下游服务器. 默认的敏感头信息通过 zuul.sensitiveHeaders 参数定义, 包括 Cookie,set-cookie,authorization 三个属性. 所以 cookie 在默认的 zuul 中是不会传递的, 这样会影响到一些登录鉴权的场景. 可以通过以下设置, 让 cookie 可以传递:
zuul.routes.<router>.customSensitiveHeaders=true
或者
zuul.routes.<router>.sensitiveHeaders=
Hystrix 和 Ribbon 支持
Zuul 本身就有线程隔离和断路器的自我保护功能, 以及负载均衡功能 (前提是配置采用 path 和 serviceId 的方式)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=120000
该参数可以用来设置 API 网关中路由转发请求的 hystrixCommand 执行超时时间
ribbon.ConnectTimeout=60000
该参数用来设置路由转发请求的时候, 创建请求链接的超时时间. 如果该值小于第一个值如果链接超时会自动重试, 重试失败会抛出错误.
ribbon.ReadTimeout=60000
该参数用来设置路由转发请求的超时时间. 如果该值小于第一个值如果链接超时会自动重试, 重试失败会抛出错误.
如果不想要重试机制, 可以如下配置
- zuul.retryable=false
- zuul.routes.<router>.retryable=false
第一个是关闭全局的, 第二个是关闭指定的.
Zuul 过滤器详解
过滤器的类别有
pre: 可以在请求被路由之前调用
route: 在路由被请求时调用
post: 在 route 和 error 过滤器之后调用
error: 处理请求时发生错误时被调用
路由请求时发生异常后自定义处理方法, 可以定义个 error 类型的 filter 来实现.
可以通过以下配置项, 来禁用过滤器
zuul.<SimpleClassName>.<filterType>.disable=true
请求过滤拦截
在路由转发前实现 token, 权限等鉴权验证 (场景例如: 普通操作人员 oper 可以访问 / order/**, 不可以访问 / refund/** 链接, 超级管理人员 admin 可以访问所有)
- @Component
- public class AccessControlFilter extends ZuulFilter {
- @Override
- public boolean shouldFilter() {
- // 该过滤器是否需要被执行
- return true;
- }
- @Override
- public Object run() throws ZuulException {
- // 过滤器的具体逻辑
- RequestContext rc = RequestContext.getCurrentContext();
- HttpServletRequest req = rc.getRequest();
- // 根据 req 参数做权限校验
- String accessType = req.getParameter("accessType");
- if(!StringUtils.equals("success", accessType)) {
- // 拒绝通过
- rc.setSendZuulResponse(false);
- rc.setResponseStatusCode(401);
- rc.setResponseBody("自定义返回内容");
- return null;
- }
- // 可以通过
- return null;
- }
- @Override
- public String filterType() {
- // 过滤器类型, pre 代表会在请求被路由之前执行
- return "pre";
- }
- @Override
- public int filterOrder() {
- // 过滤器的执行次序
- return 0;
- }
- }
总结网关的有点如下:
1. 屏蔽所有微服务的实现细节, 提供统一入口
2. 与微服务治理框架结合, 实现自动化服务实例维护和负载均衡
3. 鉴权功能和业务分离
来源: http://www.bubuko.com/infodetail-3018949.html