Zuul 服务网关

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
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
spring:
application:
name: zuul-test
server:
port: 7777
zuul:
routes:
gateway:
#这里的配置表示,访问/gateway/** 直接重定向到link: http://zhengyk.cn/**
#如 访问/gateway/a,自动请求到 http://www.zhengyk.cn/a
path: /gateway/**
url: http://www.zhengyk.cn/

启动类

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableZuulProxy //支持网关路由
public class ZuulTestApplication {

public static void main(String[] args) {
SpringApplication.run(ZuulTestApplication.class, args);
}
}

测试

启动 zuul-test 项目,访问 http://localhost:7777/gateway/2018/06/01/springcloud/load-balance/ ,页面显示:

说明网关生效。

给 zuul-test 项目添加eureka 依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
application:
name: zuul-test
server:
port: 7777
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
zuul:
routes:
gateway:
path: /**
serviceId: provider

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
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
application:
name: zuul-test
server:
port: 7777
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
#zuul:
# routes:
# gateway:
# path: /**
# serviceId: provider

浏览器输入: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.
On this page
Zuul 服务网关