ToB企服应用市场:ToB评测及商务社交产业平台

标题: 微服务网关 —— SpringCloud Netflix Zuul [打印本页]

作者: 西河刘卡车医    时间: 2023-9-1 18:34
标题: 微服务网关 —— SpringCloud Netflix Zuul
概述

Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,有以下用途:

构建 Zuul 网关

创建 zuul-service 项目,引入依赖,本项目基于 SpringBoot 2.3.1,SpringCloud Hoxton.SR12
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  4. </dependency>
复制代码
在 application.yml 配置文件中添加如下配置:
  1. server:
  2.   port: 9080 # 指定运行端口
  3. spring:
  4.   application:
  5.     name: zuul-service # 指定服务名称
  6.    
  7. zuul:
  8.   routes:
  9.     blog:
  10.       path: /baidu/**
  11.       url: https://www.baidu.com  # url用于配置符合path的请求路径路由到的服务地址
复制代码
在启动类中添加 @EnableZuulProxy 注解
  1. @EnableZuulProxy
  2. @SpringBootApplication
  3. public class ZuulServiceApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(ZuulServiceApplication.class, args);
  6.     }
  7. }
复制代码
Spring Cloud Netflix Zuul 提供了许多过滤器,具体取决于启用的 Zuul 的注解,@EnableZuulProxy 是 @EnableZuulServer 的超集,包含 @EnableZuulServer 安装的所有过滤器
启动项目,在浏览器中输入访问地址 http://localhost:9080/baidu,发现请求被路由到百度界面,Zuul 服务搭建成功

Zuul 路由配置

上一节,我们使用路径的方式匹配路由规则,path 的结构如下
  1. # 其中customName 为用户自定义名称
  2. zuul:
  3.   routes:
  4.     customName:
  5.       # 可使用的通配符有以下几种:
  6.       # ?:单个字符
  7.       # *:任意多个字符,不包含多级路径
  8.       # **:任意多个字符,包含多级路径
  9.       path: xxx
复制代码
对于 url 路径匹配,还可以使用服务名称匹配
  1. zuul:
  2.   routes:
  3.     # users为用户自定义名称
  4.     users:
  5.       path: /users/**
  6.       # serviceId用于配置符合path的请求路径路由到的服务名称
  7.       serviceId: users-service
复制代码
服务名称匹配也可以使用简化的配置
  1. zuul:
  2.   routes:
  3.     service-provider:
  4.       path: /users/**
复制代码
如果只配置 path 不配置 serviceld,则 customName 相当于服务名称,即 service-provider 会被当作服务名称,使用 serviceId 要将 zuul 服务注册到注册中心使用,比如 Eureka,从而拉取注册服务列表名称完成调用
如果想排查配置,可以使用 ignored-services
  1. zuul:
  2.   ignoredServices: "*"
  3.   routes:
  4.     users:
  5.       path: /users/**
复制代码
ignored-services 可以配置不被 zuul 管理的服务列表,多个服务名称使用号分隔,配置的的务将不被 Zuul代理,在上面的实例中,除了用户服务外,所有的服务均被忽略
可以通过 zuul.prefix 配置路由前缀,例如:
  1. zuul:
  2.   prefix: /api
  3.   routes:
  4.     users:
  5.       path: /users/**
复制代码
配置请求路径前缀,所有基于此前缀的请求都由 Zuul 网关提供代理

Zuul 过滤器

Zuul 定义过滤器用来过滤代理请求,提供额外功能逻辑,如权限验证、日志记录等,filter 与 filter 之间不直接通信,在请求线程中会通过 RequestContext 来共享状态,它内部是用 ThreadLocal 实现的
Zuul 过滤器分为前置过滤、路由后过滤、后置过滤以及异常过滤:
ZuulFilter 类及其父类 IZuulFilter 共提供了四种抽象方法:
具体实例如下:
  1. public class tokenFilter extends ZuulFilter {
  2.     @Override
  3.     public String filterType() {
  4.         //定义过滤器的类型,pre 表示在请求被路由前执行
  5.         return "pre";
  6.     }
  7.     @Override
  8.     public int filterOrder() {
  9.         //返回int 数据,用于为同一种 filterType 的多个过滤器定制执行顺序
  10.         //返回值越小,执行顺序越优先
  11.         return 0;
  12.     }
  13.     @Override
  14.     public boolean shouldFilter() {
  15.         //判断过滤器是否生效,true 代表生效
  16.         return true;
  17.     }
  18.     @Override
  19.     public Object run() throws ZuulException {
  20.         //获取上下文
  21.         RequestContext currentContext = RequestContext.getCurrentContext();
  22.         //获取 request 对象
  23.         HttpServletRequest request = currentContext.getRequest();
  24.         //从请求头获取 token 的参数
  25.         String userToken = request.getParameter("token");
  26.         if (StringUtils.isEmpty(userToken)) {
  27.             //返回错误提示
  28.             //false:表示不会继续往下执行,不会调用服务接口,直接响应给客户
  29.             currentContext.setSendZuulResponse(false);
  30.             currentContext.setResponseBody("token is null");
  31.             currentContext.setResponseStatusCode(401);
  32.             return null;
  33.         }
  34.         //否则正常执行,调用服务接口...
  35.         return null;
  36.     }
  37. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4