SpringCloud项目(七)Zuul路由网关

作者:陆金龙    发表时间:2019-08-02 11:31   

关键词:EnableZuulProxy  ZuulFilter  

3.7 Zuul路由网关

3.7.1 创建工程,配置pom.xml

创建maven module工程klblog-zuul-gateway,配置pom.xml依赖项

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- zuul路由网关 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-zuul</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

</dependencies>

3.7.2 配置application.yml

server:

  port: 8090

 

#网关名称

spring:

  application:

    name: klblog-zuul-gateway

 

eureka:

  client:

    serviceUrl:

      defaultZone:  http://eureka8051.com:8051/eureka/,http://eureka8052.com:8052/eureka/

  instance:

    instance-id: gateway-8090

    prefer-ip-address: true

    

info:

  app.name: klblog-zuul-gateway

  company.name: www.klfront.com

  build.artifactId: $project.artifactId$

  build.version: $project.version$

  

#配置网关反向代理 针对消费者工程    

zuul:

  routes:

    api-c:

      path: /api/**

      serviceId: klblog-consumer

    api-c-f:

      path: /api-feign/**

      serviceId:  klblog-consumer-feign

3.7.3 主启动类

@SpringBootApplication

@EnableZuulProxy // @EnableZuulProxy 开启Zuul网关代理

public class ZuulMainApplication {

public static void main(String[] args) {

SpringApplication.run(ZuulMainApplication.class, args);

}

// 如需启用登录验证过滤器,请取消以下注释

// @Bean

// public TokenFilter accessFilter() {

// return new TokenFilter();

// }

}

/**

  *  登录验证过滤器

 */

public class TokenFilter extends ZuulFilter {

public Object run() {

// 拦截参数执行业务逻辑

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequest request = ctx.getRequest();

String token = request.getParameter("token");

if (StringUtils.isEmpty(token)) {

// 直接不能够继续执行下面业务逻辑

ctx.setSendZuulResponse(false); // 不继续执行下面业务逻辑

ctx.setResponseStatusCode(500);// 不继续执行下面业务逻辑

ctx.setResponseBody("token is null");

return null;

}

// 继续正常执行业务逻辑

return null;

}

 

public boolean shouldFilter() {

return true; // 是否开启当前filter

}

 

@Override

public int filterOrder() {

return 0; // 过滤器优先级 数字越大 越优先执行大

}

 

@Override

public String filterType() {

return "pre";// 前置执行

}

3.7.4 测试

测试基于ribbon自定义负载均衡的consumer(每个provider服务连续5次后切换的轮询)

http://localhost:8090/api/category/discovery

测试基于feign的consumer(轮询 轮流访问8061和8062)

http://localhost:8090/api-feign/category/discovery

测试登录验证

3.7.5 应用场景说明

在设计中消费者工程是提供给外部访问的,因此这里klblog-zuul-gateway对相关的消费者工程进行路由映射了,而不关心服务提供者,否则结构就比较繁杂了。

上述示例中消费者工程是klblog-consumer和klblog-consumer-feign,这两个工程是在架构构建过程中的示例工程,使用他们来测试zuul网关主要暂时是没有别的consumer工程可用于测试。

按照klblog项目的功能模块文章、书评、知识百科、相册,实际可以设计4个consumer工程,对应4个provider微服务(每个微服务都可以部署多个实例实现集群,consumer以负载均衡方式访问其接口)为klblog-consumer-article、klblog-consumer-book、klblog-consumer-knowledge、klblog-consumer-photo。klblog-zuul-gateway则可以配置路由,通过类似 http://zuul.klfront.com/api-article、http://zuul.klfront.com/api-book、http://zuul.klfront.com/api-knowledge、http://zuul.klfront.com/api-photo的地址来访问4各消费者工程。

后续通过zuul-gateway与consumer共同完成验证与安全、动态路由、负载分配、静态响应处理、压力测试等功能,甚至consumer工程上针对controller集成swagger文档。

从而让provider工程则专注于业务功能和数据访问,并提供相关的接口。

3.7.6 网关选型,zuul的替代者Spring Cloud Gateway

由于zuul 1.x系列的性能问题,以及zuul 2.0未集成到Spring Cloud,Spring Cloud Gateway逐渐成为zuul的替代方案。由于准备使用IDEA基于SpringCloud 2.x对本项目代码框架进行重构,因此新的内容将不再这里展开。