spring cloud 2.x版本 Zuul路由网关教程

mac2024-03-16  26

前言

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3

本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的实现。

参考

- 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路由转发应用。

代码地址

gitHub地址

《Srping Cloud 2.X小白教程》目录

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断路器教程------

转载请注明出处,

联系方式:4272231@163.com
最新回复(0)