Zuul 服务网关
前面学习了 SpringCloud 的 Eureka 注册中心,Fegin、Ribbon 可做服务间负载均衡调用,Hystrix 熔断器为系统提供保障,今天学习下 SpringCloud-Netflix 下 Zuul 的应用,在此之前先了解下服务网关的概念。
服务网关
服务网关具有过滤和对外部请求进行转发的功能。
当系统中有很多服务需要进行权限认证时,我们大部分的做法是把权限认证的功能单独抽出来作为一个服务,需要做权限认证的服务直接依赖这个权限认证服务调用其接口即可,虽然开发代码不冗余,但是这样做有缺点:
由于每个服务引入了这个公共服务,使得每个服务的jar包大小无故增加了一些,jar 越大部署越慢;
后续升级权限服务的时候可能会有问题,假设权限校验改变了校验方法入参,就需要将之前所有引用该服务的其他服务都重新修改代码、编译部署。
使用服务网关就可以解决这个问题,类似切面的思想,将权限认证、过滤的逻辑放到服务网关中,这样外部请求每次过来,由网关去进行校验,并将认证通过的请求转发至后台服务,这样服务 jar 包不会增加,而且将来网关服务升级只影响前端,对后台服务影响不大。
服务网关缺点:
成本增加、网关单点故障、性能略有下降
等知识准备充分后,打算自己建一个轻量级网关试试,使用 SpringBoot+Eureka+Zuul+SpringSecurity+ELK…等技术
Zuul
Zuul 可用来做服务网关,在微服务架构中是不可或缺的部分,通过 服务网关 可以统一对外提供 REST API,还可用于负载均衡、请求转发、权限、限流、API 日志记录等功能,为整个微服务系统提供了前置保护。
Zuul 是 SpringCloud-Netflix 下基于 JVM 的轻量级服务端负载均衡器和路由器。
代码示例
新建 SpringBoot 项目 zuul-test
引入依赖
1 | <dependency> |
配置文件
1 | spring: |
启动类
1 |
|
测试
启动 zuul-test 项目,访问 http://localhost:7777/gateway/2018/06/01/springcloud/load-balance/ ,页面显示:
说明网关生效。
给 zuul-test 项目添加eureka 依赖:
1 | <dependency> |
修改配置
1 | spring: |
serviceId 指定服务名 provider
启动eureka-server 注册中心和 eureka-provider 服务提供者,访问http://localhost:7777/hello/,页面显示:
hello! Yakai! from provider
这是因为,访问http://localhost:7777/hello/,zuul 根据配置去 Eureka 注册中心上找provider
服务,找到后请求provider
的/hello 接口,实际请求的是http://localhost:9000/hello 路径。
网关的默认路由规则
Spring cloud zuul
默认情况下,Zuul
会代理所有注册到Eureka Server
的微服务,并且Zuul
的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/serviceId/**
微服务在Eureka
上的serviceId/**
会被转发到serviceId
对应的微服务,而且这样的转发是负载均衡式的,这样当系统中服务越来越多的时候,不用去把每个 serviceId 配置上。
我们去掉 zuul-test 项目中关于路由的配置:
1 | spring: |
浏览器输入:http://localhost:7777/provider/hello,页面照样显示:
hello! Yakai! from provider
- Title: Zuul 服务网关
- Author: 薛定谔的汪
- Created at : 2018-06-10 18:20:16
- Updated at : 2023-11-17 19:37:36
- Link: https://www.zhengyk.cn/2018/06/10/springcloud/zuul-01/
- License: This work is licensed under CC BY-NC-SA 4.0.