springcloud 组件之集成 Zuul 实现服务网关
一、Zuul 是什么?
Zuul 是 netflix 开源的一个 API Gateway 服务器, 本质上是一个 web servlet 应用。
Zuul 的核心是一系列的 filters, 其作用可以类比 Servlet 框架的 Filter,或者AOP。
Zuul 可以通过加载动态过滤机制,从而实现以下各项功能:
验证与安全保障:
识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
审查与监控:
在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
动态路由:
以动态方式根据需要将请求路由至不同后端集群处。
压力测试:
逐渐增加指向集群的负载流量,从而计算性能水平。
负载分配:
为每一种负载类型分配对应容量,并弃用超出限定值的请求。
静态响应处理:
在边缘位置直接建立部分响应,从而避免其流入内部集群。
多区域弹性:
跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
二、创建项目实现服务网关
(一)项目说明
本项目在 springcloud组件之集成Feign实现负载均衡 文中创建的项目 feign 的基础上进行修改。
原项目下已有 3 个 module:eureka-server、provider、consumer。
本文再新建一个 module:zuul-proxy,实现服务网关。
项目目录结构:
(二)创建模块 zuul-proxy
1.添加依赖
添加依赖,如果已按截图操作,还需再 pom.xml 文件中添加 zuul 依赖,完整的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chaoyue</groupId>
<artifactId>zuul-proxy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul-proxy</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.添加配置
application.yml 文件中添加如下配置:
server:
port: 8085 #服务端口
eureka:
client:
serviceUrl: #注册中心注册地址
defaultZone: http://127.0.0.1:8080/eureka/
spring:
application:
name: zuul-proxy #服务名称
3.启动类添加注解
启动类添加注解 @EnableEurekaClient 和 @EnableZuulProxy
package com.chaoyue.zuulproxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulProxyApplication.class, args);
}
}
4.启动服务
启动 eureka-server、provider、consumer、zuul-proxy 服务,浏览器输入:http://localhost:8080/
(三)功能实例
1.配置路由规则
(1)添加配置
application.yml 中添加配置,将 /provider/** 请求路由到 server-provider 服务,将 /consumer/** 请求路由到 servie-consumer 服务
zuul:
routes: #配置服务路由
service-provider:
path: /provider/**
service-consumer:
path: /consumer/**
(2)运行测试
启动后访问 http://localhost:8085/provider/sayHi 和 http://localhost:8085/consumer/sayHi
2.默认路由规则
Zuul 和 Eureka 结合使用可以实现路由自动配置,不需要在配置文件添加配置,自动配置的路由以服务名称为匹配路径,输入 http://localhost:8085/service-provider/sayHi 和 http://localhost:8085/service-consumer/sayHi 即可访问:
3.负载均衡
启动 2 个provider 服务(服务端口 8081 和 8083),多次调用 http://localhost:8085/service-provider/sayHi ,可发现显示信息在 8081 和 8083 之间切换。
4.配置访问前缀
application.yml 中添加 prefix 配置:
zuul:
routes: #配置服务路由
service-provider:
path: /provider/**
service-consumer:
path: /consumer/**
prefix: /proxy #网关路由前缀
由于添加了前缀 /proxy,访问时需带上前缀:
http://localhost:8085/proxy/service-provider/sayHi
5.过滤敏感头信息
application.yml 中添加 sensitive-headers 配置:
zuul:
sensitive-headers: Cookie,Set-Cookie,Authorization #过滤敏感请求头信息
6.添加host头信息
application.yml 中添加 add-host-header 配置:
zuul:
add-host-header: true #添加host头信息
7.查看路由信息
(1)添加依赖
pom.xml 文件中添加 spring-boot-starter-actuator 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)添加配置
application.yml 文件中添加配置,开启查看路由的端点:
management:
endpoints:
web:
exposure:
include: routes
(3)查看基本路由信息
访问:http://localhost:8085/actuator/routes
(4)查看详细路由信息
访问:http://localhost:8085/actuator/routes/details
8.过滤器
待续,详见后续博文。