API网关—Spring Cloud Zuul
原文作者:思想者
原文地址:一起学习使用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相关推荐
- 《深入理解 Spring Cloud 与微服务构建》第十章 路由网关 Spring Cloud Zuul
<深入理解 Spring Cloud 与微服务构建>第十章 路由网关 Spring Cloud Zuul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十章 ...
- 路由网关--spring cloud zuul
路由网关--spring boot Zuul 1.为什么需要Zuul? Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到 ...
- 14 基于网关Spring Cloud Zuul的接口限流实现方案
在Spring Cloud Zuul网关中,限流业务是放在前置过滤器实现的,也就是在请求被Zuul转发给微服务之前进行限流.另外,当前置过滤器中同时存在限流.鉴权.身份认证等业务时,应该将限流业务放在 ...
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token
整理思路 由网关Zuul进行Token颁布 由网关Zuul进行登录认证拦截 拦截的配置等可以用Mysql存储配置或者配置文件,只配置默认放开的路径即可 拦截后把在zuul中的token,换成跟后台用户 ...
- Spring Cloud Zuul API 网关服务
API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实 ...
- API 网关服务:Spring Cloud Zuul(二):路由详解、Cookie 与头信息
实践出于<Spring Cloud 微服务实战> - 瞿永超 著 路由详解 传统路由配置 传统路由配置就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实 ...
- Spring Cloud——API网关服务:Spring Cloud Zuul
API网关像是整个微服务框架系统的门面一样,所有的客户端访问都需要经过它来进行调度和过滤.它实现了请求路由.负载均衡.校验过滤等功能.zuul包含了hystrix.ribbon.acturator等重 ...
- Spring Cloud Zuul中使用Swagger汇总API接口文档
有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...
最新文章
- 百度母婴技术团队—基于Reactjs实现webapp #1
- 大学生如何进化到程序猿
- mariadb数据库备份与恢复
- 1-javascript基础学习
- c#中 uint--byte[]--char[]--string相互转换汇总
- Node — 第七天 (大事件项目接口实现一)
- 希尔排序 最坏时间_排序算法(2)
- Wireshark 抓包
- 面试准备每日系列:计算机底层之并发编程(三)JVM-垃圾回收
- Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET
- dns服务期搭建使用_DNS服务器搭建
- 小新 无法开机 联想_19年最“狠”轻薄本诞生 联想小新Pro 13优缺点一览
- 主成分分析碎石图_因子分析碎石图
- 计算机组成体系结构复习笔记
- 坚果云 linux 使用方法,Ubuntu坚果云安装与卸载教程
- 访问请转到 http://hi.baidu.com/yuyu8848
- 跨考计算机日程记录01
- python中py是什么意思_python中__init__.py是干什么的
- vnr光学识别怎么打开_小区安装家用防盗报警系统方案
- C语言程序软件电脑版,C语言宝典PC版-C语言宝典电脑版下载 v1.7.3--PC6电脑版
热门文章
- 源代码管理之SVN服务器搭建和使用
- c++ 或者 vc++中判断程序实例是否运行
- Linux启动/停止/重启Mysql数据库的方法
- sqlserver-事务处理
- java中array,arrayList,iterator;
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
- 有关android UI 线程
- sql中exists替换in的区别
- C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表
- [转贴]Ultimate List of Free Windows Software from Microsoft