Zuul 是Netflix开源的是一个网关服务,提供动态路由、监控、弹性、安全等功能。源码:https://github.com/Netflix/zuul
那么为什么需要网关呢? 举个简单的场景例子:我们现在都是前后端分离的,同时使用的是微服务构建系统,即每个服务都有一个路径,那么给前端的域名就会有多个(后面服务集群部署也会有问题),一旦服务多起来后就不方便管理了,此时若接入网关那么就只需要给前端一个域名路径,也方便前端管理,同时在网关中也可以对接口进行一些统一的处理,这就是为什么要引入网关。
我们下面将介绍Zuul中一些功能的使用,让你快速的入门。
说明
下面示例使用的Spring-Cloud的版本是Hoxton.SR12,Spring-Boot的版本是2.7.2.RELEASE。示例项目的源代码
添加maven依赖:
<!-- 网关zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
在启动类上添加 @EnableZuulProxy
注解。
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
这样一个基本的Zuul网关服务就搭建好了,接下来我们开始介绍它的一些功能使用。
常用功能示例
我们需要准备2个服务 server_a、server_b(都成功注册到eureka);其中server_a的端口号为8081;server_b端口号8082;它们共有如下3个路由接口:
server_a
http://127.0.0.1:8081?id=100
server_b
http://127.0.0.1:8082/query?id=10
http://127.0.0.1:8082/del?id=10
接入Eureka
我们使用spring cloud 全家桶时,通常会使用eureka作为服务注册中心,供各个服务间进行互相通信的需求。
注意若不使用eureka则不用引入eureka的依赖包
添加maven依赖
<!--eureka注册中心客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在application.yml中配置eureka的相关配置信息
# 注册中心eureka配置
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
配置路由转发
不使用eureka注册中心,直接配置地址
这种方式不用引入eureka;我们可以直接配置IP或域名
# 配置路由转发规则
zuul:
routes:
server_a:
# 匹配的路径
path: /store/**
# 转发到具体的服务,会将 /store 去掉
url: http://127.0.0.1:8081
server_b:
path: /user/**
url: http://127.0.0.1:8082
此时通过网关访问对应地址的转发关系如下:
网关:http://127.0.0.1:9000/store?id=100 转发到:http://127.0.0.1:8081?id=100
网关:http://127.0.0.1:9000/user/query?id=10 转发到:http://127.0.0.1:8082/query?id=10
网关:http://127.0.0.1:9000/user/del?id=10 转发到:http://127.0.0.1:8082/del?id=10
这种方式我们通常是让各个服务使用域名来访问,通过Nginx来做分发以此实现服务集群之间的访问。
使用注册中心eureka
需要引入注册中心相关的配置和依赖包,eureka配置参加上面。示例:
# 配置路由转发规则
zuul:
routes:
# 服务名,和eureka 中注册的名称保持一致
server_a:
# 匹配的路径
path: /store/**
server_b:
path: /user/**
通过网关访问的地址就变更为下面这样的:
网关:http://127.0.0.1:9000/store?id=100 转发到:http://server_a?id=100
网关:http://127.0.0.1:9000/user/query?id=10 转发到:http://server_b/query?id=10
网关:http://127.0.0.1:9000/user/del?id=10 转发到:http://server_b/del?id=10
上面的配置是一个简化的配置,完整的写法是这样的
zuul:
routes:
server_b:
path: /user/**
serviceId: server_b
屏蔽部分服务和路径
其实我们在上面是可以直接通过服务名来访问接口,如下:
网关:http://127.0.0.1:9000/server_a?id=100 转发到:http://server_a?id=100
网关:http://127.0.0.1:9000/server_b/query?id=10 转发到:http://server_b/query?id=10
网关:http://127.0.0.1:9000/server_b/del?id=10 转发到:http://server_b/del?id=10
可以通过添加如下配置来解决
zuul:
# 通过正则表达式匹配,来屏蔽服务的直接访问;这样就只能使用网关配置的路径访问
ignored-patterns: /server_*/**
如果某个服务只在内部访问,不需要网关代理出去,可以通过如下配置来屏蔽服务
zuul:
# 忽略某些服务不对外提供,多个使用英文逗号分割
ignored-services: server_a,server_b