版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。

网关api Gateway的重要性不言而喻,网关负责统一接收所有请求,然后根据不同的规则进行转发到不同的服务。使用网关能够统一的管理请求日志、进行权限控制、过滤等,这样就能避免在每个单体应用中做重复的工作。

这一篇主要是讲zuul的独立使用,就是只作为一个独立的项目进行请求转发,而不关联SpringCloud的那一堆Eureka、Ribbon等,因为很多时候我们的项目并不都是基于springcloud的微服务,或者不想搞那么麻烦用注册中心什么的,就只想做个简单的请求转发代理和权限控制。

zuul是可以进行开发的,里面可以自定义一些自己的规则,譬如涉及查表之类的,能够完成颗粒很细的需求。

这里我们打算完成如下的功能,当访问ip/user时就进入到User的独立项目中,访问ip/club时就进入到club的独立项目中。入口是zuul,在zuul里做权限控制,譬如查表过滤黑名单、限制同一个userId单位时间内的访问次数等。

请求转发

使用zuul很简单,新建一个Springboot项目,创建时勾选zuul即可。pom.xml如下

[html] view plaincopy print?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.tianyalei</groupId>
  6. <artifactId>testzuul</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>testzuul</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.6.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20. <java.version>1.8</java.version>
  21. <spring-cloud.version>Dalston.SR3</spring-cloud.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-zuul</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. </dependency>
  33. </dependencies>
  34. <dependencyManagement>
  35. <dependencies>
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-dependencies</artifactId>
  39. <version>${spring-cloud.version}</version>
  40. <type>pom</type>
  41. <scope>import</scope>
  42. </dependency>
  43. </dependencies>
  44. </dependencyManagement>
  45. <build>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. </plugin>
  51. </plugins>
  52. </build>
  53. </project>

然后在Application类加上@EnableZuulProxy注解即可,该项目就具备了zuul的功能了

[java] view plaincopy print?
  1. @EnableZuulProxy
  2. @SpringBootApplication
  3. public class TestzuulApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(TestzuulApplication.class, args);
  6. }
  7. }

然后关键的地方在application.yml配置里,规则在这里配置

[html] view plaincopy print?
  1. server:
  2. port: 9000
  3. zuul:
  4. routes:
  5. api-1:
  6. path: /user/**
  7. url: http://localhost:8081/
  8. api-2:
  9. path: /club/**
  10. url: http://localhost:8082/

主要就是配置zuul.routes相关,api-1名字随便起,主要是配置里面的path和url这个是固定的

通过源码可以看到支持serviceId,url两种,path是固定的,代表访问zuul时的路径,url代表访问该路径时会被转发到哪个url上,serviceId是给springcloud用的,代表在Eureka上注册的服务id,也是确定是转发到哪一个服务的。

这里我们配置的是url,当访问localhost:9000/user/abc时,就相当于访问localhost:8081/abc.

到这里就已经完成了请求转发了,如果你本地跑了两个项目,端口分别是8081,8082,就已经可以通过请求zuul配置的url规则访问到了。

[java] view plaincopy print?
  1. @RequestMapping("club")
  2. public String index() {
  3. return "hello,我来自Club客户端";
  4. }

权限控制

在zuul里新建一个AccessFilter类,如下的写法。
[java] view plaincopy print?
  1. package com.tianyalei.testzuul;
  2. import com.netflix.zuul.ZuulFilter;
  3. import com.netflix.zuul.context.RequestContext;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.stereotype.Component;
  7. import javax.servlet.http.HttpServletRequest;
  8. @Component
  9. public class AccessFilter extends ZuulFilter {
  10. private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
  11. @Override
  12. public String filterType() {
  13. //前置过滤器
  14. return "pre";
  15. }
  16. @Override
  17. public int filterOrder() {
  18. //优先级,数字越大,优先级越低
  19. return 0;
  20. }
  21. @Override
  22. public boolean shouldFilter() {
  23. //是否执行该过滤器,true代表需要过滤
  24. return true;
  25. }
  26. @Override
  27. public Object run() {
  28. RequestContext ctx = RequestContext.getCurrentContext();
  29. HttpServletRequest request = ctx.getRequest();
  30. log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
  31. //获取传来的参数accessToken
  32. Object accessToken = request.getParameter("accessToken");
  33. if(accessToken == null) {
  34. log.warn("access token is empty");
  35. //过滤该请求,不往下级服务去转发请求,到此结束
  36. ctx.setSendZuulResponse(false);
  37. ctx.setResponseStatusCode(401);
  38. ctx.setResponseBody("{\"result\":\"accessToken is empty!\"}");
  39. return null;
  40. }
  41. //如果有token,则进行路由转发
  42. log.info("access token ok");
  43. //这里return的值没有意义,zuul框架没有使用该返回值
  44. return null;
  45. }
  46. }

别的先不管,看看run方法,在这里可以获取到用户传来的所有参数,然后可以配置自己的规则来决定是否往最终的服务转发请求,false为不给最终的服务发送这次请求,默认为true。在这里,我们设置如果accessToken为空,就停止转发,直接给客户端返回结果。需要注意一点,Filter是可以配置多个的,按照order从小到大依次执行,即使设置了setSendZuulResponse(false),也是会继续执行下一个Filter的。

注意,路由转发的停止和继续是由ctx.setSendZuulResponse来控制的,与下面的return null无关,这个方法的return值没有意义,并没有使用。

效果如图

下一篇来详细看看Filter的配置。

转载于:https://www.cnblogs.com/bigben0123/articles/7779209.html

独立使用zuul网关分发不同服务的请求、权限控制,非SpringCloud相关推荐

  1. zuul网关_SpringCould之服务网关(zuul)介绍与配置

    ??记得点击上方蓝字"程序员小强"关注哦 一.前言介绍 1.什么是服务(API)网关? 服务网关也就是API网关,可以作为服务的统一入口. 可提供身份校验.动态路由.负载均衡.安全 ...

  2. SpringCloud之Zuul网关服务

    Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...

  3. 认识微服务(七)之 Zuul 网关

    认识微服务(七)之 Zuul 网关 1 简介 2 Zuul 加入后的架构 3 快速入门 3.1 新建工程 3.2 编写启动类 3.3 编写配置 3.4 编写路由规则 3.5 启动测试 4 面向服务的路 ...

  4. 微服务架构: 基于nacos注册中心的Zuul网关实现

    一. 为什么需要网关 在微服务架构设计中,通常会有若干个服务提供者.例如一个券商系统,会有用户系统.开户系统.资讯系统.交易系统等多个服务,而每个服务数量会最着集群部署会变得越来越庞大和复杂.客户端在 ...

  5. properties 配置回车_非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!...

    本文同步Java知音社区,专注于Java 作者:kosamino http://www.cnblogs.com/jing99/p/11696192.html Zuul是spring cloud中的微服 ...

  6. 网关的作用是什么_SpringCloud中Zuul网关原理及其配置,看它就够了

    正文 Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务 ...

  7. 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!

    作者:kosamino www.cnblogs.com/jing99/p/11696192.html Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首 ...

  8. properties 配置回车_非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了! - 风平浪静如码

    Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...

  9. 全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了

    Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...

最新文章

  1. Linux获取系统当前时间(精确到毫秒)
  2. 10年后的计算机会是怎样的?
  3. 克鲁斯卡尔(并查集)hdu 1233
  4. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示
  5. Chrome MessageLoop类分析
  6. tic tac toe php,Python tic-tac-toe检测作弊
  7. 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
  8. u盘在磁盘管理可以显示 但是电脑中找不到_U盘无法识别怎么办?试试这种方法,没准还有救!...
  9. 设计模式学习总结7 - 行为型2 - Command命令模式
  10. mysql如何实现递归查询
  11. IDEA 字符编码转换问题
  12. python求和1到100_python实现1加到100
  13. 珍藏的PS技巧(可以尝试一下哦)(转载)
  14. Excel 统计起止时间
  15. 求导——基本初等函数的导数公式
  16. 《别告诉我你懂PPT》札记
  17. NVIDIA安培架构下MIG技术分析
  18. 科技云报道:ChatGPT的胜利,宣告知识图谱的消亡?
  19. 必读!2018最具突破性计算机视觉论文Top 10
  20. 第一套Android视频教程连接

热门文章

  1. IDEA 2020 配置 Maven 创建 Spring Boot 项目
  2. 【Java 强化】单元测试(JUnit3、JUnit4)、XML(语法、约束、文档结构)、DOM、DOM4J
  3. Centos7+ 修改hostname主机名命令
  4. django进阶06数据库事务
  5. 一行代码让 Python 的运行速度提高100倍
  6. 手把手教你做酷炫的数据可视化大屏,零基础的你仅需6步
  7. Object型转list,jsonObject型转list方法,亲测可用
  8. html绘制城堡,HTML5动画 - 山谷城堡
  9. python时间模块 dir(time)_python sys,os,time模块的使用(包括时间格式的各种转换)...
  10. 批处理 无效驱动器规格_电脑维修之硬盘驱动器的常见故障判断