常见网关介绍
  • Ngnix+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本

  • Kong

基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

  • Zuul

Netflflix开源的网关,功能丰富,使用JAVA开发,基于servlet2.5 使用的阻塞架构 不支持任何长连接,易于二次开发 问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx,Spring Cloud Gateway

  • SpringCloud Gateway

SpringCloud Gateway Spring公司为了替换Zuul而开发的网关服务.

SpringCloud Gateway 是Spring 官方最新推出的一款基于SpringFramework 5 Project Reactor 和Springboot2 之上开发的网关

它与第一代网关Zuul 不同的是 gateway 是异步非阻塞的 (Netty Reactor + webflux 实现)zuul 是同步阻塞请求的

SpringCloud Gateway 是工程的最前端

nginx和gateaway那个用的多 nginx和gateway什么关系_spring


网关是微服务工程架构下的唯一入口 (客户端)

SpringCloud Gateway 提供了统一的路由方式 基于Filter 连的方式提供了网关的基本功能


SpringCloud Gateway 优缺点

优点:

  • 性能强劲:是第一代网关Zuul的1.6倍
  • 功能强大:内置了很多实用的功能,例如转发、监控、限流等
  • 设计优雅,容易扩展

缺点:

  • 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
  • 不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行
  • 需要Spring Boot 2.0及以上的版本,才支持
SpringCloud Gateway 三大组成部分

nginx和gateaway那个用的多 nginx和gateway什么关系_Cloud_02


Route、Predicate 、Filter

Route(路由) 是构建网关的基本模型 由ID URI 一系列的断言和过滤器组成

Predicate (断言) 可以匹配Http 请求中所有的内容(请求头 参数等等) 请求与断言相匹配则通过当前断言

Filter(过滤器) 包括全局和局部过滤器 可以在请求被路由钱后对请求进行更改

nginx和gateaway那个用的多 nginx和gateway什么关系_nginx和gateaway那个用的多_03

SpringCloud Gateway 工作模型

nginx和gateaway那个用的多 nginx和gateway什么关系_nginx和gateaway那个用的多_04


**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 # 让gateway可以发现nacos中的微服务

4.启动测试

nginx和gateaway那个用的多 nginx和gateway什么关系_架构_05


5. 自定义路由规则

server:
  port: 9000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true # 让gateway可以发现nacos中的微服务
      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 测试

nginx和gateaway那个用的多 nginx和gateway什么关系_spring_06