SpringCloud Zuul实现动态路由

 更新时间:2019年01月11日 09:32:21   作者:huanzi-qch  
这篇文章主要介绍了SpringCloud Zuul实现动态路由,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。本文基于上篇(SpringCloud系列——Ribbon 负载均衡)实现Zuul动态路由

GitHub地址:https://github.com/Netflix/zuul

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html

代码编写

首先我们在springCloud下面新建一个springboot项目:zuul-server,pom继承parent,并且在Eureka上面注册(还不会服务注册与发现的,请戳:SpringCloud系列——Eureka 服务注册与发现

maven引入Zuul

 <!-- Zuul -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>

配置文件

server.port=10010
spring.application.name=zuul-server
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
#健康检查(需要spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled=true
# 续约更新时间间隔(默认30秒)
eureka.instance.lease-renewal-interval-in-seconds=10
# 续约到期时间(默认90秒)
eureka.instance.lease-expiration-duration-in-seconds=10

#zuul代理配置 zuul.routes.服务名.path,服务名要与注册的一致
#应用名映射
zuul.routes.myspringboot.path=/myspringboot/**
zuul.routes.myspringboot.service-id=myspringboot

#URL映射
#zuul.routes.myspringboot.path=/myspringboot/**
#zuul.routes.myspringboot-url.url=http://localhost:10087/

自定义Zuul过滤器

更多的检查规则后续慢慢健全

/**
 * Zuul过滤器,实现了路由检查
 */
public class AccessFilter extends ZuulFilter {

  /**
   * 通过int值来定义过滤器的执行顺序
   */
  @Override
  public int filterOrder() {
    // PreDecoration之前运行
    return PRE_DECORATION_FILTER_ORDER - 1;
  }

  /**
   * 过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型:
   *   public static final String ERROR_TYPE = "error";
   *   public static final String POST_TYPE = "post";
   *   public static final String PRE_TYPE = "pre";
   *   public static final String ROUTE_TYPE = "route";
   */
  @Override
  public String filterType() {
    return PRE_TYPE;
  }

  /**
   * 过滤器的具体逻辑
   */
  @Override
  public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest request = ctx.getRequest();
    System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(),request.getRequestURL().toString()));
    String accessToken = request.getParameter("accessToken");
    //有权限令牌
    if (!StringUtils.isEmpty(accessToken)) {
      ctx.setSendZuulResponse(true);
      ctx.setResponseStatusCode(200);
      //可以设置一些值
      ctx.set("isSuccess", true);
      return null;
    } else {
      ctx.setSendZuulResponse(false);
      ctx.setResponseStatusCode(401);
      ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}");
      //可以设置一些值
      ctx.set("isSuccess", false);
      return null;
    }
  }

  /**
   * 返回一个boolean类型来判断该过滤器是否要执行
   */
  @Override
  public boolean shouldFilter() {
    return true;
  }
}

启动类

添加@EnableZuulProxy注解并使用自定义过滤器

@EnableZuulProxy
@SpringBootApplication
public class ZuulServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(ZuulServerApplication.class, args);
  }

  @Bean
  public AccessFilter accessFilter() {
    return new AccessFilter();
  }
}

效果演示

启动所有项目,我们在Eureka上注册了四个服务,相比上篇(SpringCloud系列——Ribbon 负载均衡)多了一个Zuul

浏览器访问 http://localhost:10010/myspringboot/feign/ribbon、http://localhost:10010/myspringboot/feign/ribbon?accessToken=123456

http://localhost:10010/ 这个端口对外暴露,相对于总入口,后面接不同的路径由,Zuul路由到对应的服务上

1、没有accessToken是,无法通过检查

2、携带accessToken时,可正常路由,并且Feign调用、Ribbon负载均衡

后记

我们为什么要使用Zuul呢?

1、请求校验、路由转发,接口校验与业务逻辑分离

2、隐藏诸多服务路径,只暴露统一入口,安全

更多Zuul配置,请看官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    这篇文章主要介绍了解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 解决springboot 获取form-data里的file文件的问题

    解决springboot 获取form-data里的file文件的问题

    这篇文章主要介绍了解决springboot 获取form-data里的file文件的问题的相关资料,这里提供了详细的解决步骤,需要的朋友可以参考下
    2017-07-07
  • java生成字母数字组合的随机数示例 java生成随机数

    java生成字母数字组合的随机数示例 java生成随机数

    这篇文章主要介绍了java生成字母数字组合的随机数的示例,大家参考使用吧
    2014-01-01
  • IDEA调试小技巧之Evaluate调试工具详解

    IDEA调试小技巧之Evaluate调试工具详解

    这篇文章主要介绍了IDEA调试小技巧之Evaluate调试工具,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java多线程的具体介绍与使用笔记小结

    Java多线程的具体介绍与使用笔记小结

    Java多线程详细介绍线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关)。 接下来通过本文给大家介绍Java多线程的具体介绍与使用笔记小结,感兴趣的朋友一起看看吧
    2021-05-05
  • Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    这篇文章主要为大家介绍了Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java agent 使用及实现代码

    java agent 使用及实现代码

    java agent的作用可以在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要给大家讲解java agent 使用及实现代码,感兴趣的朋友一起看看吧
    2018-07-07
  • 深入解析Spring TransactionTemplate 高级用法(示例代码)

    深入解析Spring TransactionTemplate 高级用法(示例代码)

    TransactionTemplate是 Spring 框架中一个强大的工具,它允许开发者以编程方式控制事务,通过本文的详细解析和示例代码,我们可以看到如何使用 `TransactionTemplate` 来执行事务性操作,并处理高级事务场景,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • Springboot+Bootstrap实现增删改查实战

    Springboot+Bootstrap实现增删改查实战

    这篇文章主要介绍了Springboot+Bootstrap实现增删改查实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vue 使用vuex在页面跳转的实现方式

    vue 使用vuex在页面跳转的实现方式

    这篇文章主要介绍了vue 使用vuex在页面跳转的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论