前文回顾:
Spring Cloud(一)Eureka Server-单体及集群搭建
Spring Cloud(二) 配置Eureka Client
一.API网关
API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。
API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及相应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。
API网关常用于以下场景:
-
黑白名单:实现通过IP地址控制禁止访问网关功能
-
日志:实现访问日志的记录,可用于分析访问,处理性能指标,同时将分析结果支持其它模块功能应用
-
协议适配:实现通信协议校验、适配转换的功能
-
身份认证:负责网关访问身份认证验证
-
计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则
-
路由:是API网关很核心的模块功能,此模块实现根据请求锁定目标微服务,并将请求进行转发
API网关所带来的好处:
-
避免将内部信息泄露给外部
-
为微服务添加额外的安全层
-
支持混合通信协议
-
降低构建微服务的复杂性
-
微服务模拟与虚拟化
二.Zuul
Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
-
验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
-
审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
-
动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
-
压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
-
负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
-
静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
-
多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
三.代码示例
1.pom中添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
2.Application启动类中添加注解
-
@EnableZuulProxy:支持网关路由
@SpringBootApplication
@EnableZuulProxy
public class Study05Application {
public static void main(String[] args) {
SpringApplication.run(Study05Application.class, args);
}
}
3.配置文件
spring.application.name=gateway-service-zuul
server.port=8888
zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
4.测试
依次启动 spring-cloud-eureka
、 spring-cloud-producer
、gateway-service-zuul-eureka
,访问:http://localhost:8888/producer/hello?name=yfy
返回:hello yfy,welcome to Spring Cloud
测试集群,修改端口号,启动spring-cloud-producer
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index(@RequestParam String name) {
return "hello " + name + ",welcome to Spring Cloud:product2";
}
}
修改完成后启动spring-cloud-producer-2
,重启gateway-service-zuul-eureka
。测试多次访问http://localhost:8888/producer/hello?name=yfy
,依次返回:
hello yfy,welcome to Spring Cloud
hello yfy,welcome to Spring Cloud:product2
hello yfy,welcome to Spring Cloud
hello yfy,welcome to Spring Cloud:product2
...
说明通过zuul成功调用了producer服务并且做了均衡负载。
5.网关的默认路由规则
如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,spring cloud zuul已经帮我们做了默认配置。默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:
http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**
会被转发到serviceId对应的微服务。
我们注销掉gateway-service-zuul-eureka
项目中关于路由的配置:
#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer
重新启动后,访问http://localhost:8888/spring-cloud-producer/hello?name=yfy
,测试返回结果和上述示例相同,说明Spring cloud zuul默认已经提供了转发功能。