原文作者:思想者

原文地址:一起学习使用Spring Cloud Netflix之Zuul

前言

Zuul在Spring Cloud 体系中扮演着统一网关的角色,负责与外部交互。用户可以通过不同的URL特征来访问不同的后端服务,类似于Nginx代理的效果。Zuul与Eureka结合使用,可以根据服务名来访问后端的服务,对于Eureka而言,Zuul也是一个Eureka Client。系统的信息流入流出都需要经过Zuul,在Zuul中,我们可以统一监控流量,统一安全认证,统一报文组装等等。本文来源于我的博客网站:http://51think.net

1、Zuul架构

从图中可以看到,之前博客中提到的srping-cloud-ribbon-client应用以及spring-cloud-eureka-myservice应用都有参与。这两个应用和spring-cloud-zuul都属于Eureka的client,因此都需要在Eureka中进行注册,否则无法相互调用。

2、创建Zuul应用

1)IDEA创建module,选择Zuul 

2)pom文件中添加web组件以及Eureka组件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>spring-cloud-zuul</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-zuul</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3)applicaton类加上注解@EnableZuulProxy和@EnableEurekaClient,开启Zuul功能

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class SpringCloudZuulApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudZuulApplication.class, args);}}

4)修改application.yml文件

eureka:client:serviceUrl:defaultZone: http://localhost:8010/eureka/
server:port: 8030
spring:application:name: cloudZuul
zuul:routes:ribbonClient:path: /ribbonClient/**serviceId: ribbonClient

其中 path: /ribbonClient/**表示URL中如果带有/ribbonClient/将被代理到serviceId为ribbonClient的服务中去。

3、启动观察

启动spring-cloud-zuul之后,访问Eureka面板,观察cloudZuul是否在服务列表中。

在之前的ribbon博客中,我们的访问地址是http://localhost:8020/sayHello?say=helloWorld,现在我们通过Zuul来访问spring-cloud-ribbon-client应用,在浏览器中使用此地址进行访问:http://localhost:8030/ribbonClient/sayHello?say=helloWorld,可以发现访问效果和直接访问http://localhost:8020/sayHello?say=helloWorld的效果是一致的。

4、使用服务过滤

服务过滤就是一个filter,它可以在指定事件中(路由前,路由中,路由后等)执行相关操作。Zuul中提供了一个filter接口,实现它即可。

@Component
public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object accessToken = request.getParameter("token");if(accessToken == null) {ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is not exist!");}catch (Exception e){}return null;}return null;}
}

这段代码表示,如果请求中没有token信息,就会报错“token is not exist!”。关注filterType字段,它代表过滤器的类型,具体如下:

  • pre:路由之前会调用
  • route:路由转发的时候会调用
  • error:处理请求时发生错误时会调用
  • post:运行结束被调用

我们再次重启一下spring-cloud-zuul,浏览器再次访问http://localhost:8030/ribbonClient/sayHello?say=helloWorld,会发现如下错误提示:

加上token参数之后,即可正常访问:

API网关—Spring Cloud Zuul相关推荐

  1. 《深入理解 Spring Cloud 与微服务构建》第十章 路由网关 Spring Cloud Zuul

    <深入理解 Spring Cloud 与微服务构建>第十章 路由网关 Spring Cloud Zuul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十章 ...

  2. 路由网关--spring cloud zuul

    路由网关--spring boot Zuul 1.为什么需要Zuul? Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到 ...

  3. 14 基于网关Spring Cloud Zuul的接口限流实现方案

    在Spring Cloud Zuul网关中,限流业务是放在前置过滤器实现的,也就是在请求被Zuul转发给微服务之前进行限流.另外,当前置过滤器中同时存在限流.鉴权.身份认证等业务时,应该将限流业务放在 ...

  4. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  5. 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token

    整理思路 由网关Zuul进行Token颁布 由网关Zuul进行登录认证拦截 拦截的配置等可以用Mysql存储配置或者配置文件,只配置默认放开的路径即可 拦截后把在zuul中的token,换成跟后台用户 ...

  6. Spring Cloud Zuul API 网关服务

    API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实 ...

  7. API 网关服务:Spring Cloud Zuul(二):路由详解、Cookie 与头信息

    实践出于<Spring Cloud 微服务实战> - 瞿永超 著 路由详解 传统路由配置   传统路由配置就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实 ...

  8. Spring Cloud——API网关服务:Spring Cloud Zuul

    API网关像是整个微服务框架系统的门面一样,所有的客户端访问都需要经过它来进行调度和过滤.它实现了请求路由.负载均衡.校验过滤等功能.zuul包含了hystrix.ribbon.acturator等重 ...

  9. Spring Cloud Zuul中使用Swagger汇总API接口文档

    有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...

最新文章

  1. 百度母婴技术团队—基于Reactjs实现webapp #1
  2. 大学生如何进化到程序猿
  3. mariadb数据库备份与恢复
  4. 1-javascript基础学习
  5. c#中 uint--byte[]--char[]--string相互转换汇总
  6. Node — 第七天 (大事件项目接口实现一)
  7. 希尔排序 最坏时间_排序算法(2)
  8. Wireshark 抓包
  9. 面试准备每日系列:计算机底层之并发编程(三)JVM-垃圾回收
  10. Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET
  11. dns服务期搭建使用_DNS服务器搭建
  12. 小新 无法开机 联想_19年最“狠”轻薄本诞生 联想小新Pro 13优缺点一览
  13. 主成分分析碎石图_因子分析碎石图
  14. 计算机组成体系结构复习笔记
  15. 坚果云 linux 使用方法,Ubuntu坚果云安装与卸载教程
  16. 访问请转到 http://hi.baidu.com/yuyu8848
  17. 跨考计算机日程记录01
  18. python中py是什么意思_python中__init__.py是干什么的
  19. vnr光学识别怎么打开_小区安装家用防盗报警系统方案
  20. C语言程序软件电脑版,C语言宝典PC版-C语言宝典电脑版下载 v1.7.3--PC6电脑版

热门文章

  1. 源代码管理之SVN服务器搭建和使用
  2. c++ 或者 vc++中判断程序实例是否运行
  3. Linux启动/停止/重启Mysql数据库的方法
  4. sqlserver-事务处理
  5. java中array,arrayList,iterator;
  6. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
  7. 有关android UI 线程
  8. sql中exists替换in的区别
  9. C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表
  10. [转贴]Ultimate List of Free Windows Software from Microsoft