Zuul 是 Netflix 开源的微服务网关,可以和 Eureka、Ribbon、Hystrix 等组件配合使用。API网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面。提供动态路由,监控,弹性,负载均衡、校验过滤、服务容错等功能。
Spring Cloud Zuul 主要应用场景:
- 动态路由:APP、web 网站通过 zuul 来访问不同的服务提供方,且与 ribbon 结合,还可以负载均衡的路由到同一个应用不同的实例中。
- 安全认证:zuul 作为互联网服务架构中的网关,可以用来校验非法访问、授予 token、校验 token 等。
- 限流:zuul 通过记录每种请求的类型来达到限制访问过多导致服务 down 掉的目的。
- 静态响应处理:直接在 zuul 就处理一些请求,返回响应内容,不转发到微服务内部。
- 区域弹性:主要是针对 AWS 上的应用做一些弹性扩展。
一、准备工作
1.1、创建启动一个注册中心,二个服务提供者。
请参考:SpringCloud Eureka 服务注册中心1:服务的注册与发现
- piao-server:注册中心服务端,端口2000。
- piao-client:客户端服务提供者,端口2010。
- piao-client2:客户服务端提供者,端口2011。
如果不想创建多个项目,可以请考这篇文章:IDEA 启动多个SpringBoot项目不同端口
启动成功如下:
二、创建第一代网关 Zuul
2.1、创建 piao-zuul 项目。
我们这里使用IDEA创建,文件-》新建-》项目-》下一步到如下的页面:
然后在点下一步,直到完成。
3.2、修改依赖
这里我们 SpringCloud 使用的 Hoxton.SR6 的版本,SpringBoot 使用的 2.3.5.RELEASE 版本。当然大家也可以用IEDA默认创建的版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.piao</groupId>
<artifactId>piao-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>piao-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</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.3、添加配置
编辑项目的 application.properites 文件,添加如下相关配置:
#服务注册中心端口号
server.port=2050
#指定服务名称
spring.application.name=piao-zuul
#指定服务注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:2000/eureka/
在启动类上添加 @EnableZuulProxy 注解。
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class PiaoZuulApplication {
public static void main(String[] args) {
SpringApplication.run(PiaoZuulApplication.class, args);
}
}
3.4、启动访问注册中心
三、配置传统路由规则
传统路由是没有加入注册中心的,所以需要单独配置路由规则。
3.1、单实例路由
单实例的路由转发通过 zuul.routes.<route>.path 与 zuul.routes.<route>.url 参数对的方式进行配置。
我们通过修改 application.properites 文件添加路由规则,把 /piaoClient/** 的所有请求转发到 piao-client 服务上面去。
#路由规则
zuul.routes.piao-client.path=/piaoClinet/**
zuul.routes.piao-client.url=http://localhost:2010
我们访问地址:http://127.0.0.1:2050/piaoClinet/client
我们访问路由到了piao-client服务接口上去了。
3.2、多实例路由
多实例的路由转发通过 zuul.routes.<route>.path 与 zuul.routes.<route>.service-id 参数对的方式进行配置,其中 service-id 是由用户手工命名的服务名称,配合 ribbon.listOfServers 参数实现服务与实例的维护:
#路由规则
zuul.routes.piao-client.id=piao-client
zuul.routes.piao-client.path=/piaoClinet/**
piao-client.ribbon.listOfServers=http://localhost:2010/,http://localhost:2011/
我们访问地址:http://127.0.0.1:2050/piaoClinet/client
第一次访问:
第二次访问:
四、配置服务路由规则
4.1、默认路由规则
Spring Cloud Zuul 实现了与 Spring Cloud Eureka 的无缝整合,有了默认的路由规则,无需运维人员维护 path 和 url。我们可以让路由的 path 不是映射具体的 url ,而是映射到某个具体的服务,而具体的 url 则交给 Eureka 的服务发现机制去自动维护。
默认路由规则使用服务名作为 path 请求前缀。我们删除 zuul.routes.<route>.path 与 zuul.routes.<route>.url 配置信息。
访问地址:http://127.0.0.1:2050/piao-client/client
该规则自定实现了负载的功能,会轮训到http://localhost:2010/, http://localhost:2011/ 服务上面。
4.2、关闭默认路由规则
我们可以关闭指定的服务默认规则。多个微服务通过逗号隔开。
zuul.ignored-services=piao-client
也可以关闭所有默认规则:
zuul.ignored-services=*
4.3、手动配置服务
我们关闭了默认路由规则,需要手动去配置路由规则,如果没有关闭,也会有限使用手动的路由规则。
#zuul.routes.piao-client.id=piao-client
#zuul.routes.piao-client.path=/piaoClinet/**
简介写法:
zuul.routes.piao-client=/piaoClient/**