前言
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3
本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的实现。
参考
概念
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,例如将请求/api/goods转发到商品服务上、/api/order转发到订单服务上等。
Zull默认和Ribbon结合实现了负载均衡功能。
创建Zuul工程
1.1 创建sping boot工程:eureka-zuul
1.2 添加pom.xml相关依赖
<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>
1.3 application添加配置信息
spring: application: name: eureka-zuul server: port: 8400 eureka: instance: hostname: localhost lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/ zuul: routes: eureka-ribbon: #对应服务名称,可以自定义(最好保持一致) path: /ribbon/* serviceId: eureka-ribbon #对应服务名称 eureka-feign: path: /eureka-feign/* serviceId: eureka-feign #对应服务名称
1.4 启动类EurekaZuulApplication增加注解
package spring.cloud.demo.eurekazuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy @SpringBootApplication public class EurekaZuulApplication { public static void main(String[] args) { SpringApplication.run(EurekaZuulApplication.class, args); } }
@EnableZuulProxy:开启Zuul网关注解
1.5 启动eureka-zuul服务
打开浏览器,分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果分别如下:
可以看到Zuul按照路由转发的配置规则,把/ribbon/的请求转发到eureka-ribbon服务上,把/eureka-feign/的请求转发到eureka-feign的服务上。
至此,一个简单基于Zuul路由网关就搭建完成了。
彩蛋
添加自定义过滤器
Zuul过滤器有四种类型分别是
- pre 路由前
- route 路由时
- post 路由完毕
- error 发生错误时
创建自定义过滤器filter
package spring.cloud.demo.eurekazuul.fillter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.apache.commons.lang.StringUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 简单filter过滤器 * @auther: maomao * @DateT: 2019-09-17 */ public class CommonFilter extends ZuulFilter { /** * 在请求被路由之前调用 * @return */ @Override public String filterType() { return "pre"; } /** * filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低 * @return */ @Override public int filterOrder() { return 0; } /** * 是否执行该过滤器,此处为true,说明需要过滤 * @return */ @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); //获取请求参数 String token = request.getParameter("token"); //校验token是否可以通过 if (StringUtils.isNotBlank(token) && token.equals("maomao")) { requestContext.setSendZuulResponse(true); requestContext.setResponseStatusCode(200); requestContext.set("code", 1); } else { requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(401); HttpServletResponse response = requestContext.getResponse(); response.setHeader("content-type", "text/html;charset=utf-8"); requestContext.setResponseBody("网关认证失败,停止路由"); requestContext.set("code", 0); } return null; } }
将过滤器加入Bean,增加Config类
package spring.cloud.demo.eurekazuul.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import spring.cloud.demo.eurekazuul.fillter.CommonFilter; /** * @auther: maomao * @DateT: 2019-09-17 */ @Configuration public class ZuulFilterConfig { @Bean public CommonFilter commonFilter() { return new CommonFilter(); } }
启动工程
在浏览器分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果如下:
显示结果证明,过滤器已经生效。因为过滤CommonFilter中要求输入参入带token=maomao,所以请求被拦截,Zuul停止转发。
在浏览器中URL中增加token参数,显示如下:
显示结果证明,在token正确的情况下,Zuul转发成功。
至此,自定义的过滤器就演示完成。
总结
本文要实现了简单的Zuul路由转发应用。
代码地址
- spring cloud 2.x版本 Eureka Server服务注册中心教程
- spring cloud 2.x版本 Eureka Client服务提供者教程
- spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)
- spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)
- spring cloud 2.x版本 Zuul路由网关教程
- spring cloud 2.x版本 config分布式配置中心教程
- spring cloud 2.x版本 Hystrix Dashboard断路器教程
- spring cloud 2.x版本 Gateway路由网关教程
- spring cloud 2.x版本 Gateway自定义过滤器教程
- spring cloud 2.x版本 Gateway熔断、限流教程
spring cloud 2.x版本 Gateway动态路由教程
- 写作不易,转载请注明出处,喜欢的小伙伴可以关注公众号查看更多喜欢的文章。
- 联系方式:4272231@163.com