利用Spring Cloud实现微服务(六)- 服务网关

1. Zuul介绍

在整个Spring Cloud微服务框架里,Zuul扮演着”智能网关“的角色。一方面,Zuul是接入网关,起到反向代理的作用,是外部消费者请求内部服务的唯一入口。另一方面,Zuul也具备过滤功能,通过在运行时注入过滤规则可实现用户鉴权、动态路由、灰度发布、A/B测试、负载限流等功能。

Zuul的大部分功能都是通过过滤功能来完成的,Zuul可以提供四种标准类型的过滤,如下图所示:

1) Pre: 过滤规则在路由之前起作用。可以利用“Pre”过滤器实现用户鉴权,记录请求日志等;

2) Routing:过滤规则在路由时发生作用。可以利用“Routing”过滤器实现动态路由、灰度发布、A/B测试、负载限流等。

3) Post:过滤规则在路由之后发生作用。可以利用"Post"过滤器收集统计信息和指标,将微服务的相应写入Http响应并返回给服务消费者;

4) Error:过滤规则路由过程中发生错误时发生作用。可以利用Error过滤器记录错误日志,并对错误进行二次处理等。

在过滤器之间用RequestContext传递消息。RequestContext存储的内容包括路由目标地址、错误信息、请求信息、响应信息等。Zuul的过滤规则也可以用基于JVM的语言编写,包括Java、Python、Groovy等。

2. 代码实现及验证

本次代码实现模拟两个场景:对用户进行鉴权;拦截请求,并重导向到另一个网址

2.1新增一个zuul-service项目:过程同之前过程类似,只不过在依赖项里增加对zuul的依赖。

2.2接入网关的实现

1) 在主程序添加@EnableZuulProxy注解,该注解会把外部调用路由到合适的服务;

2) 配置网关项目的属性,端口设为2299。在配置文件里,如果不显式指定负载均衡路由的url或serviceId,负载均衡会将路径/{service}导向到Eureka上注册为{service}的服务,此时也需要使能zuul自身带的load balancer(ribbon)功能。比如:http://.../loadbalance-service/... 会由负载均衡自动到导向到Eureka上注册为loadbalance-service的服务。

也可以用下列两种方式的任何一种显式路径的方式指定负载均衡将导向的服务,zuul将路径自动设为/cars,2288为负载均衡器ribbon的端口, loadbalance-service为负载均衡的应用名称

#zuul.routes.cars.url=http://localhost:2288

#zuul.routes.cars.serviceId=loadbalance-service

当指定url时,可以关闭zuul的load balancer功能;当使用serviceId时,需要使能zuul自身带的load balancer(ribbon)功能

#ribbon.eureka.enabled=false

具体配置如下所示:

3) 验证

在启动网关服务之前,先依次启动eureka server,bookingcar-service,loadbalance-service。其中bookingcar-service启动两个实例,端口号分别为2227和2228。

启动网关服务后,我们在Eureka界面可以看到BOOKINGCAR-SERVICE, LOADBALANCE-SERVICE,GATEWAY-SERVICE都已经启动。注意:服务注册到eureka上后,名称都变成了大写。

点击GATEWAY-SERVICE后面的链接,进入网关服务界面,输入“loadbalance-service/v1/lb/testport?name=bookingcar-service“,我们发现同负载均衡时的结果一样,这说明网关服务已起作用,网关自动连接到负载均衡服务loadbalance-service。


我们也可以通过在配置文件里制定serviceid的方式来使用网关。在配置文件里,取消对serviceId的注解,关闭网关服务后再次启动,我们发现“loadbalance-service/v1/lb/testport?name=bookingcar-service“与“cars/v1/lb/testport?name=bookingcar-service“同样起作用

Loadbalance-service:

Cars:

2.3 用户鉴权的实现

如前所述,用户鉴权一般利用前置过滤器实现。

1)新增一个新的类BookingCarPreFilter,该类继承自ZuulFilter。在BookingCarPreFilter的实现中,要重写虚拟函数filterType, filterOrder, run,shouldFilter。

前置过滤器的filterType为PRE_TYPE,filterOrder本次演示使用DEBUG_FILTER_ORDER,在shouldFilter里要判断是否要进行过滤,本次演示直接返回true,要进行过滤。

在run函数里进行具体的过滤。本次演示主要对用户进行鉴权。Run函数的具体实现如下:

2)验证

继续使用“http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service“,我们发现响应已经变为:user id cann't be null。

在后面添加userid的参数,如http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service&userid=88,响应恢复为正常

2.4 拦截请求的实现

在routing过滤器里,实现对请求的拦截,并重导向到一个新的网站,比如:www.sina.com.cn

1)新增一个新的类BookingCarRoutingFilter,该类继承自ZuulFilter。在BookingCarRoutingFilter的实现中,要重写虚拟函数filterType, filterOrder, run,shouldFilter。

前置过滤器的filterType为ROUTE_TYPE,filterOrder本次演示使用DEBUG_FILTER_ORDER,在shouldFilter里要判断是否要进行过滤,本次演示直接返回true,要进行过滤。

在run函数里进行具体的过滤。本次演示主要对请求进行拦截,并导向到一个新的网站。Run函数的具体实现如下:

2) 验证,使用“http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service&userid=88“,页面跳转到外部网站,如下所示:

3. 总结

Zuul是智能网关,除了是外部请求的入口,更重要的是可以起到过滤作用。Netflix也在用Zuul实现A/B测试和金丝雀发布。

Zuul现在版本是2.0,基于Netty,对请求实现了异步处理与响应。

代码:https://github.com/shuxingliu/microservices

利用Spring Cloud实现微服务(七)- 内部调用

利用Spring Cloud实现微服务(五)- 负载均衡

利用Spring Cloud实现微服务(四)- 微服务实现与注册

利用Spring Cloud实现微服务(三)- 业务领域驱动微服务设计

利用Spring Cloud实现微服务(二)--领域驱动设计

利用Spring Cloud实现微服务(一):Eureka服务器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容