zuul相当于是路由网关,默认结合了Ribbon。Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接。
1.zuul单独搭建网关项目
1.1 增加项目依赖
<!--增加服务注册能力-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--增加网关能力-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
1.2 增加配置文件配置
server:
port: 8855
spring:
application:
name: demo-springcloud-zuul
zuul:
routes:
api-a:
path: /api-a/**
serviceId: demo-springcloud-service-order
api-b:
path: /api-b/**
serviceId: demo-springcloud-service-user
eureka:
client:
service-url:
defaultZone: http://user:user@demo-springcloud-eureka-one:8761/eureka/
instance:
prefer-ip-address: true
1.3 启动类增加代码修改
//开启网关能力
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class DemoSpringcloudZuulApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringcloudZuulApplication.class, args);
}
//实例化我们的拦截器
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
}
1.4 增加一些常用的拦截器
//利用Zuul的过滤器来实现我们对外服务的安全控制, 这个只是pre过滤器
public class AccessFilter extends ZuulFilter {
/**
* filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
* pre:可以在请求被路由之前调用
* routing:在路由请求时候被调用
* post:在routing和error过滤器之后被调用
* error:处理请求时发生错误时被调用
*/
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
//这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
return true;
}
//过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("age");
if(accessToken == null) {
System.out.println("未通过安全校验");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return "you can not access to the api-*";
}
System.out.println("通过安全校验");
return null;
}
}
1.5调用例子
image.png2.zuul其他相关知识
2.1 zuul常用的过滤器
就和上文一样,我们同时继承 zuulFilter,里面有四种方法
1. filterType:该函数需要返回一个字符串来代表过滤器的类型,而这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了四种不同生命周期的过滤器类型,具体如下:
- pre:可以在请求被路由之前调用。
- routing:在路由请求时候被调用。
- post:在routing和error过滤器之后被调用。
- error:处理请求时发生错误时被调用。
- filterOrder:通过int值来定义过滤器的执行顺序,数值越小优先级越高。
- shouldFilter:返回一个boolean类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
- run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。
2.2 zuul处理异常
因为zuul不太好用,建议替换成gateway. 所以后续再更新这块。
todo
网友评论