应用网关技术调研

背景

为什么需要一个网关:对外接入接口,API网关是唯一的入口,提供一个对外接口管理的入口。

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。

API网关封装了系统内部架构,为每个客户端提供一个定制的API。

它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。

API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

通常,网关也是提供REST/HTTP的访问API。

网关调研分析

1.API网关的用处

API网关一般用于三种场景:Open API,微服务网关,API服务管理平台,

应用网关技术调研_第1张图片

网关的功能:对内对外进行统一的服务调用及管理

2.API网关的竞争方案

service mesh:istio

Open APi:一般是微服务API网关

3.API网关解决方案

私有云开源解决方案如下:

  • Kong kong是基于Nginx+Lua进行二次开发的方案, https://konghq.com/
  • Netflix Zuul,zuul是spring cloud的一个推荐组件,https://github.com/Netflix/zuul
  • orange,这个开源程序是国人开发的, http://orange.sumory.com/
  • 小豹API网关,这个是作者参与研发的API网关,国内少有的基于java的api网关,小豹API网关

公有云解决方案:

  • Amazon API Gateway,https://aws.amazon.com/cn/api-gateway/
  • 阿里云API网关,https://www.aliyun.com/product/apigateway/
  • 腾讯云API网关, https://cloud.tencent.com/product/apigateway

自开发解决方案:

  • 基于Nginx+Lua+ OpenResty的方案,可以看到Kong,orange都是基于这个方案
  • 基于Netty、非阻塞IO模型。通过网上搜索可以看到国内的宜人贷等一些公司是基于这种方案,是一种成熟的方案。
  • 基于Node.js的方案。这种方案是应用了Node.js天生的非阻塞的特性。
  • 基于java Servlet的方案。zuul基于的就是这种方案,这种方案的效率不高,这也是zuul总是被诟病的原因。

4.企业如何选中API网关

思考

详细

1、性能与可用性
2、可扩展性、可维护性
3、需求匹配度
4、是否开源?公司是否有自开发的能力?
5、公有云还是私有云

5. 流向网关选型对比

目前,比较流行的网关有:Nginx 、 Kong 、Orange等等,还有微服务网关Zuul 、Spring CloudGateway等等
对于 API Gateway,常见的选型有基于 Openresty 的 Kong、基于 Go 的 Tyk 和基于 Java 的gateway,这三个选型本身没有什么明显的区别,主要还是看技术栈是否能满足快速应用和二次开发。
 

API网关方案对比,上诉API解决方案,典型的就是nginx+lua和微服务网关,对着两种常见的解决方案进行分析对比

nginx+lua

zuul

gateway

使用范围 全局网关,门户网关,处于最外层的 业务网关 业务网关,聚合业务,职责单一
性能/可用性 较高
可实现业务逻辑
扩展性 中:不易于扩展 高:易于扩展和维护,java生态
熔断,重试 不可 可以 可以
是否支持同步 仅支持同步 支持异步
是否支持流控,负载 无:需要结合hystrix支持 支持

在微服务架构,如果使用了Spring Cloud生态的基础组件,则Spring Cloud Gateway相比而言更加具备优势,单从流式编程+支持异步上就足以让开发者选择它了。
  对于小型微服务架构或是复杂架构(不仅包括微服务应用还有其他非Spring Cloud服务节点),zuul也是一个不错的选择。

二 gateway搭建

1. gateway搭建

spring cloud gateway的搭建很简单,创建一个spring boot的项目,然后依赖下面的两个jar包即可

    org.springframework.cloud

    spring-cloud-starter-gateway

    ${spring.cloud.alibaba.version}

    com.alibaba.cloud

    spring-cloud-starter-alibaba-nacos-discovery

    ${spring.cloud.alibaba.version}

若是不用动态路由,可以不用部署nacos,可以直接在application.yml上配置路由配置

application.yml参考如下

server:

  port: 8070

spring:

  application:

    name: api-gateway

  cloud:

    #gateway的配置

    gateway:

      discovery:

        locator:

          enabled: false  #若启用动态路由,将此值修改为true即可

      #路由配置 [路由 就是指定当请求满足什么条件的时候转到哪个微服务]

      routes:

        - id: demo-server #路由的唯一标识,路由到order

          uri: http://localhost:8080  # lb://order-service #需要转发的地址,lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略

          #断言规则,就是路由转发要满足的条件

          predicates:

            - Path=/demo-server/** #当请求路径满足Path指定的规则时,才进行路由转发

            # 当客户端访问http://localhost:8070/demo-server/order/add 会路由到↓

            #  http://localhost:8080/demo-server/order/add,这个无法访问,需要filters过滤下

          filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改

            - StripPrefix=1 # 转发之前去掉第一层路由

            # StripPrefix的操作会将上述http://localhost:8080/demo-server/order/add 路由到http://localhost:808/order/add

            #        - id: stock_route

    #配置nacos

    nacos:

      discovery:

        server-addr: nacos部署ip:8848

        username: nacos

        password: nacos

2.支持基础配置服务nacos,apollo

动态路由

集成nacos:上诉例子中已在pom和yml文件中配置了nacos,集成nacos的忽略,使用篇带补充

集成apollo

参考文档

应用网关分析

大公司为什么都有API网关?聊聊API网关的作用 - 知乎

kong

kong网关_fFee-ops的博客-CSDN博客_kong网关

zuul和gateway区别

Zuul和Gateway的区别_OoZzzy的博客-CSDN博客_zuul和gateway哪个好

动态路由

springgateway动态路由的四类实现方式_BUG弄潮儿的博客-CSDN博客

网关gateway搭建

教你如何使用Gateway搭建网关服务及实现动态路由_海·是倒过来的天的博客-CSDN博客_网关动态路由

2、gateway整合nacos使用_搞钱自律的博客-CSDN博客_gateway整合nacos

你可能感兴趣的:(java,spring,cloud)