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#_router_and_filter_zuul

  代码编写

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

   maven引入Zuul

1<!-- Zuul --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-netflix-zuul</artifactId> 5 </dependency>

  配置文件

1server.port=10010 2spring.application.name=zuul-server 3eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 4#健康检查(需要spring-boot-starter-actuator依赖) 5eureka.client.healthcheck.enabled=true 6# 续约更新时间间隔(默认30秒) 7eureka.instance.lease-renewal-interval-in-seconds=10 8# 续约到期时间(默认90秒) 9eureka.instance.lease-expiration-duration-in-seconds=10 10 11#zuul代理配置 zuul.routes.服务名.path,服务名要与注册的一致 12#应用名映射 13zuul.routes.myspringboot.path=/myspringboot/** 14zuul.routes.myspringboot.service-id=myspringboot 15 16#URL映射 17#zuul.routes.myspringboot.path=/myspringboot/** 18#zuul.routes.myspringboot-url.url=http://localhost:10087/

  自定义Zuul过滤器

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

1/** 2 * Zuul过滤器,实现了路由检查 3 */ 4public class AccessFilter extends ZuulFilter { 5 6 /** 7 * 通过int值来定义过滤器的执行顺序 8 */ 9 @Override 10 public int filterOrder() { 11 // PreDecoration之前运行 12 return PRE_DECORATION_FILTER_ORDER - 1; 13 } 14 15 /** 16 * 过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型: 17 * public static final String ERROR_TYPE = "error"; 18 * public static final String POST_TYPE = "post"; 19 * public static final String PRE_TYPE = "pre"; 20 * public static final String ROUTE_TYPE = "route"; 21 */ 22 @Override 23 public String filterType() { 24 return PRE_TYPE; 25 } 26 27 /** 28 * 过滤器的具体逻辑 29 */ 30 @Override 31 public Object run() { 32 RequestContext ctx = RequestContext.getCurrentContext(); 33 HttpServletRequest request = ctx.getRequest(); 34 System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(),request.getRequestURL().toString())); 35 String accessToken = request.getParameter("accessToken"); 36 //有权限令牌 37 if (!StringUtils.isEmpty(accessToken)) { 38 ctx.setSendZuulResponse(true); 39 ctx.setResponseStatusCode(200); 40 //可以设置一些值 41 ctx.set("isSuccess", true); 42 return null; 43 } else { 44 ctx.setSendZuulResponse(false); 45 ctx.setResponseStatusCode(401); 46 ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}"); 47 //可以设置一些值 48 ctx.set("isSuccess", false); 49 return null; 50 } 51 } 52 53 /** 54 * 返回一个boolean类型来判断该过滤器是否要执行 55 */ 56 @Override 57 public boolean shouldFilter() { 58 return true; 59 } 60}

  启动类

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

1@EnableZuulProxy 2@SpringBootApplication 3public class ZuulServerApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(ZuulServerApplication.class, args); 7 } 8 9 @Bean 10 public AccessFilter accessFilter() { 11 return new AccessFilter(); 12 } 13}

   效果演示

  启动所有项目,我们在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配置,请看官方文档

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springCloud

  码云:https://gitee.com/huanzi-qch/springCloud

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )