1.介绍
在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个 API 网关根据请求的 URL,路由到相应的服务。当添加 API 网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制后将请求均衡分发给后台服务端。
在 Spring Cloud 体系中, Spring Cloud Zuul 就是提供负载均衡、反向代理、权限认证的一个 API 网关。我们这里说的 Zuul 是 Zuul 1,实际上 Netflix 已经发布了 Zuul 2,不过 Spring 好像并没有将 Zuul 2 整合到 Spring Cloud 生态中的意思,因为它自己做了一个 Spring Cloud Gateway(高性能的网关),暂且先学会Zuul吧,东西都是大同小异的。Spring Cloud Zuul 路由是微服务架构的不可或缺的一部分,提供动态路由、监控、弹性、安全等的边缘服务。Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
2.Zuul路由功能的使用(基于前面的工程)
2.1 新建工程,添加依赖
新建module,api-gateway
主要依赖:
2.2 添加配置文件,注解开启功能
使用@EnableZuulProxy注解开启Zuul的功能
2.3启动和测试
启动服务,访问注册中心:http://localhost:7000,看到服务已注册上去了
由于 Spring Cloud Zuul 在整合了 Eureka 之后,具备默认的服务路由功能,即:当我们这里构建的 api-gateway 应用启动并注册到 Eureka 之后,服务网关会发现上面我们启动的两个服务 eureka-producer 和 service-feign,这时候 Zuul 就会创建两个路由规则。每个路由规则都包含两部分,一部分是外部请求的匹配规则,另一部分是路由的服务 ID。针对当前的情况,Zuul 会创建下面的两个路由规则:
转发到 eureka-producer 服务的请求规则为:/eureka-producer/**
转发到 service-feign服务的请求规则为:/service-feign/**
最后,我们可以通过访问 8000 端口的服务网关来验证上述路由的正确性:
访问请求:localhost:8000/service-feign/helloFeign?name=feign。返回:
该请求最终被路由到service-feign的/helloFeign接口上。
3. Zuul过滤器功能
3.1 自定义Filter
假设服务网关应对的是外部的所有请求,为了避免产生安全隐患,我们需要对请求做一定的限制,比如请求中含有 Token 便让请求继续往下走,如果请求不带 Token 就直接返回并给出提示。
这里我们通过 currentContext.setSendZuulResponse(false) 令 Zuul 过滤该请求,不对其进行路由,然后通过 currentContext.setResponseStatusCode(401) 设置了其返回的错误码,当然我们也可以进一步优化我们的返回,比如,通过 currentContext.setResponseBody(body) 对返回 body 内容进行编辑等。
在实现了自定义的过滤器之后,它并不会直接生效,还需要为其创建具体的bean注入ioc容器中才能启动该过滤器,如下:
访问:localhost:8000/service-feign/helloFeign?name=feign
返回:
加上token,访问:localhost:8000/service-feign/helloFeign?name=feign&token=666
成功返回:
源码地址:https://github.com/wxkhz/springcloud