一. API网关简介
网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。它还可以做负载均衡,统一鉴权,协议转换,监控监测等一系列功能。
二. Zuul简介
Zuul是Spring Cloud全家桶中的微服务API网关。
所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
-
认证和安全:识别每一个资源的验证要求,并拒绝那些不符的请求
-
性能监测:在服务边界追踪并统计数据,提供精确的生产视图
-
动态路由:动态将请求路由到不同后端集群
-
压力测试:逐渐增加指向集群的流量,以了解性能
-
负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
-
静态响应处理:边缘位置进行响应,避免转发到内部集群
-
多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化
Spring Cloud对Zuul进行了整合和增强。目前,Zuul使用的默认是Apache的HTTP Client,也可以使用Rest Client,可以设置ribbon.restclient.enabled=true.
2.1 高可用
对于网关来说所面对的请求大部分来自于外部(客户端未注册到Eureka Server),要实现网关的高可用可以在在网关前面再架一个前置代理(如Nginx)。如果客户端注册在Eureka Server上那么客户端可以从Eureka Server处获取Zuul网关地址实现客户端负载均衡。
客户端未注册到Eureka Server上(比如手机App端等):
客户端注册在Eureka Server上(比如:MVC App, SPA 等):
2.2 Zuul聚合微服务
一个外部请求,可能会通过Zuul查询多个微服务,如果让其一个个请求,就算Zuul转发,网络开销、流量耗费、时长都不是很理想。
我们可以使用Zuul聚合微服务请求,即应用系统只发送一个请求给Zuul,由Zuul请求不同的微服务,并把数据返给应用系统。
三. 示例
3.1 代码地址
3.2 pom.xml
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter