一、什么是Zuul
Zuul作为微服务系统的网关组件。所有从设备或网站来的请求都会经过Zuul到达后端,用于构建边界服务,致力于动态路由、过滤、监控、弹性伸缩和安全。Zuul底层利用各种filter来实现如:认证和安全、性能检测、动态路由、压力测试、负载均衡、静态资源处理。
二、Zuul和Nginx的区别
- 相同点
Zuul和Nginx都可以实现负载均衡、反向代理(隐藏真实ip地址),过滤请求,实现网关的效果
- 不同点
Nginx:C语言开发,采用服务器负载均衡
Zuul:java开发,使用eureka+ribbon实现负载均衡。
Nging相对Zuul更加强大,Nginx可以整合一些脚本语言。
三、Zuul学习
3.1、Demo搭建
Zuul的学习是在上一章工程基础之上建立的
- Maven
<parent> <artifactId>cloud-parent</artifactId> <groupId>com.yk</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud-zuul</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies>
- application.properties
## Zuul 代理应用 spring.application.name = spring-cloud-zuul ## 服务端口 server.port = 6060 #配置eureka eureka.client.serviceUrl.defaultZone = http://localhost:1234/eureka/ eureka.instance.hostname = localhost eureka.instance.prefer-ip-address = true eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} #配置zuul路由规则 指定spring-cloud-api-client http://localhost:6060/api-provider/* => http://localhost:802 zuul.routes.spring-cloud-api-client = /api-client/** #Ribbon负载均衡配置 spring-cloud-api-client.ribbon.listOfServers = http://locahost:802 #忽略指定服务 #zuul.ignored-services= spring-cloud-api-client
- 启动入口
@EnableZuulProxy @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableDiscoveryClient public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class,args); } }
- Demo演示
- 执行简图
3.2、ZuulFilter
- 创建RequestFilter
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.exception.ZuulException; import javax.servlet.http.HttpServletRequest; import com.netflix.zuul.context.RequestContext; public class RequestFilter extends ZuulFilter { //这里可以处理逻辑 @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); System.out.println(String.format( request.getMethod(), request.getRequestURL().toString())); // 对该请求进行路由 ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); // 设值,让下一个Filter看到上一个Filter的状态 ctx.set("isSuccess", true); return null; } // 前置过滤器 @Override public String filterType() { return "pre"; } /** * 优先级为0,数字越大,优先级越低 */ @Override public int filterOrder() { return 0; } //是否执行该过滤器 false为不执行 @Override public boolean shouldFilter() { return true; } }
- 入口类增加RequestFilter Bean
@Bean public RequestFilter requestFilter(){ return new RequestFilter(); }