SpringCloud微服务实战之网关服务zuul
Spring Cloud Zuul同样是基于NetFlix Zuul实现的API网关组件。主要用于解决1.对于路由规则和服务实例的维护问题。2.对于类似签名校验、登录校验在微服务架构中的冗余问题。
一、构建网关
1、新建Maven项目SpringCloud-zuul
2、在pom中添加zuul依赖
<!-- add zuul depend -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
spring-cloud-starter-zuul该模块不仅包含了Netflix Zuul的核心依赖zuul-core,还包含下面的依赖:spring-cloud-starter-hystrix、spring-cloud-starter-ribbon、spring-cloud-starter-actuator。
3、使用注解@EnableZuulProxy开启Zuul的API网关注解。
4、配置application.properties文件
server.port=9000
spring.application.name=api-geteway
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka/
二、请求路由
1、传统路由方式
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:9888
2、面向服务的路由
- 为了与Eureka整合,需要添加Eureka依赖
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=helloservice
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=feignconsumer
三、请求过滤
请求路由建立之后,客户端可以通过统一的API网关接口访问服务,但是不同的客户端的访问权限有差异,所以需要过滤请求。
zuul提供了ZuulFilter来实现过滤和拦截,我们只需要继承ZuulFilter类并实现他定义的4个抽象函数就可以实现过滤了。
package com.spring.springcloud.filter;
import com.netflix.zuul.ZuulFilter;
public class MyFilter extends ZuulFilter {
@Override
public Object run() {
//实现过滤规则
return null;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public String filterType() {
return null;
}
}
-
filterType:过滤器类型,决定过滤器在什么生命周期里执行。
PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器
filterOrder 过滤器执行顺序,当请求一个阶段中存在多个过滤器时,需要根据该方法的返回值来判断执行顺序。
- shouldFilter 判断过滤器是否被执行,返回true代表执行。
- run 过滤器执行的具体规则。
过滤器定义完成后,还需要再主类中添加如下才能启动过滤器。
@Bean
public MyFilter myFilter(){
return new MyFilter();
}