常见网关介绍
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本
基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。
Netflflix开源的网关,功能丰富,使用JAVA开发,基于servlet2.5 使用的阻塞架构 不支持任何长连接,易于二次开发 问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx,Spring Cloud Gateway
SpringCloud Gateway Spring公司为了替换Zuul而开发的网关服务.
SpringCloud Gateway 是Spring 官方最新推出的一款基于SpringFramework 5 Project Reactor 和Springboot2 之上开发的网关
它与第一代网关Zuul 不同的是 gateway 是异步非阻塞的 (Netty Reactor + webflux 实现)zuul 是同步阻塞请求的
SpringCloud Gateway 是工程的最前端
网关是微服务工程架构下的唯一入口 (客户端)
SpringCloud Gateway 提供了统一的路由方式 基于Filter 连的方式提供了网关的基本功能
SpringCloud Gateway 优缺点
优点:
缺点:
- 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
- 不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行
- 需要Spring Boot 2.0及以上的版本,才支持
SpringCloud Gateway 三大组成部分
Route、Predicate 、Filter
? Route(路由) 是构建网关的基本模型 由ID URI 一系列的断言和过滤器组成
? Predicate (断言) 可以匹配Http 请求中所有的内容(请求头 参数等等) 请求与断言相匹配则通过当前断言
? Filter(过滤器) 包括全局和局部过滤器 可以在请求被路由钱后对请求进行更改
SpringCloud Gateway 工作模型
? **1. 请求发送到网关,经由分发器将请求匹配到相应的 HandlerMapping **
? 2. 请求和处理器之间有一个映射,路由到网关处理程序 即Web Handler
? 3. 执行特定的请求过滤器链
? **4. 最终到达代理的微服务 **
SpringCloud Gateway 代码实现
三板斧操作 1.加入依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shop-parent</artifactId>
<groupId>com.itzhouwei</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api-gateway</artifactId>
<dependencies>
<!--gateway网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 网关集成Sentinel -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
</dependencies>
</project>
2.编写启动类
package com.itzhouwei.api.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ApiGatewayServer {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayServer.class,args);
}
}
3.编写配置文件
server:
port: 9000
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true
4.启动测试 5. 自定义路由规则
server:
port: 9000
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true
routes:
- id: product_route
uri: lb://product-service
predicates:
- Path=/product-serv/**
filters:
- StripPrefix=1
- id: order_route
uri: lb://order-service
predicates:
- Path=/order-serv/**
filters:
- StripPrefix=1
- Time=true
6 测试
|