[转帖]api网关介绍

api,网关,介绍 · 浏览次数 : 0

小编点评

**网关API简介** 网关API是您的系统唯一的入口,是众多分布式服务唯一的一个出口。它可以做物理隔离,内网服务只有通过网关才能暴露到外网被别人访问。 **功能** *身份验证(oauth2/jwt)权限安全(黑白名单/爬虫控制)流量控制(请求大小/速率)数据转换(公共请求request/response)监控/metrics跨域问题(前后端分离)灰度发布(金丝雀发布/一部分去老客户端/一部分去新客户端) **开源网关** * OpenRestykongSpring Cloud Zuul/GatewayZuul2:可扩展强,易配置,易维护性高 * Zuul:可扩展弱,易配置,易维护性中等 * GatewaysZuul:可扩展弱,易配置,易维护性较差 **如何创建网关** 1. 在 pom.xml 中添加依赖项。 2. 配置 Spring Boot Starter Actuator。 3. 在 endpoint 的 `yml` 文件中添加配置。 4. 启动网关 API。 **配置** ```yml endpoints: web: exposure: include: "*" ``` **使用** 您可以通过代理服务器或其他网络代理工具访问网关 API。例如,您可以使用 `curl` 或 `Postman` 等工具访问 `localhost:9002/actuator/gateway/routes` endpoint。

正文

https://www.cnblogs.com/jackssybin/p/16282788.html

 

1.什么是网关

API网关是一个系统的唯一入口。
是众多分布式服务唯一的一个出口。
它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问。
简而言之:网关就是你家的大门

2.提供了哪些功能

  1. 身份认证(oauth2/jwt)
  2. 权限安全(黑白名单/爬虫控制)
  3. 流量控制(请求大小/速率)
  4. 数据转换(公共请求request/response)
  5. 监控/metrics
  6. 跨域问题(前后端分离)
  7. 灰度发布(金丝雀发布/一部分去老客户端/一部分去新客户端)

3.市面上有哪些比较好的开源网关

  1. OpenResty
  2. kong
  3. Spring Cloud Zuul/Gateway
  4. Zuul2
网关限流鉴权监控易用性可维护性成熟度
Spring Cloud Gateway 可以通过IP,用户,集群限流,提供了相应的接口进行扩展 普通鉴权、auth2.0 Gateway Metrics Filter 简单易用 spring系列可扩展强,易配置 可维护性好 spring社区成熟,但gateway资源较少
Zuul2 可以通过配置文件配置集群限流和单服务器限流亦可通过filter实现限流扩展 filter中实现 filter中实现 参考资料较少 可维护性较差 开源不久,资料少
OpenResty 需要lua开发 需要lua开发 需要开发 简单易用,但是需要进行的lua开发很多 可维护性较差,将来需要维护大量lua脚本 很成熟资料很多
Kong 根据秒,分,时,天,月,年,根据用户进行限流。可在原码的基础上进行开发 普通鉴权,Key Auth鉴权,HMAC,auth2.0 可上报datadog,记录请求数量,请求数据量,应答数据量,接收于发送的时间间隔,状态码数量,kong内运行时间 简单易用,api转发通过管理员接口配置,开发需要lua脚本 "可维护性较差,将来需要维护大量lua库 相对成熟,用户问题汇总,社区,插件开源

4.如何做一款网关(Spring Cloud Gateway)

  1. 第一个网关
    pom.xml
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Application.java

@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
    
    // 等同于在yml文件中的配置
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes().route(r -> r.path("/test/aa")
                .uri("http://www.baidu.com"))
                .route(r -> r.path("/baidu")
                        .uri("http://www.baidu.com"))
                .route(r -> r.path("/testa/**")
                        .uri("lb://servicea"))
                .build();
    }
}

启动参数 支持的路由方式

Loaded RoutePredicateFactory [After]
2020-06-12 11:39:21.811  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
2020-06-12 11:39:21.811  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
2020-06-12 11:39:21.811  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
2020-06-12 11:39:21.811  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
2020-06-12 11:39:21.812  INFO 3680 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]

路由方式

开启端点检查

访问url:
http://localhost:9002/actuator/gateway/routes

pom.xml添加

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

yml 添加配置 端点打开

management:
  endpoints:
    web:
      exposure:
        include: "*"

参考

代码位置:
https://github.com/jackssybin/springclouditems.git

与[转帖]api网关介绍相似的内容:

[转帖]api网关介绍

https://www.cnblogs.com/jackssybin/p/16282788.html 1.什么是网关 API网关是一个系统的唯一入口。是众多分布式服务唯一的一个出口。它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问。简而言之:网关就是你家的大门 2.提供了哪些功能 身份

[转帖]Nginx Ingress 高并发实践

概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分发挥出高性能的优势。之前我们在 Nginx Ingress on TKE 部署最佳实践 一文中讲了

[转帖]TCP的半关闭、半连接、半打开

参考:《UNIX 网络编程 · 卷1 : 套接字联网API》 TCP 半关闭 如果将客户端与服务器之间的网络作为全双工管道来考虑,请求是从客户端向服务器发送,应答是从服务器向客户端发送,其如下图所示: 上图假设 RTT 为 8,且服务器没有处理时间且请求大小与应答大小相同。既然从管道发出到管道的另一

[转帖]网络编程 Epoll原理和底层机制分析

https://zhuanlan.zhihu.com/p/579839553 同 I/O 多路复用和信号驱动 I/O 一样,Linux 的 epoll(event poll)API 可以检查多个文件 描述符上的 I/O 就绪状态。epoll 是 Linux 下多路复用IO接口 select/poll

[转帖]新建k8s nginx容器(需要外网访问)

https://www.cnblogs.com/fengzi7314/p/16337852.html 第一步,创建deploy apiVersion: extensions/v1beta1 #k8s版本不同,api可能也不同 kind: Deployment metadata: name: myng

[转帖]API架构风格对比:SOAP vs REST vs GraphQL vs RPC

https://www.cnblogs.com/charlieroro/p/14570214.html 最近一段时间关于GraphQL的讨论很多,一些项目中也相继用到了这种风格,但使用是否合理,是否存在杀鸡用牛刀这样的问题,还有待商榷。 译自:Comparing API Architectural

[转帖]API架构风格对比:SOAP vs REST vs GraphQL vs RPC

https://www.cnblogs.com/charlieroro/p/14570214.html 最近一段时间关于GraphQL的讨论很多,一些项目中也相继用到了这种风格,但使用是否合理,是否存在杀鸡用牛刀这样的问题,还有待商榷。 译自:Comparing API Architectural

[转帖]configure 各种配置

https://api.dandelioncloud.cn/article/details/1487329970564485121 —build=编译该软件所使用的平台 —host=该软件将运行的平台 —target=该软件所处理的目标平台 具体到不同的交叉编译器 —build —host —tar

[转帖]Jmeter常用配置元件(二):“HTTP Cookie管理器”登录状态保持

在API接口测试过程中,我们需要传递cookie值作为连接状态的保持,例如登录后状态信息。通过使用Jmeter提供的“HTTP Cookie管理器”来实现。 一般情况下不需要输入什么值,就这样即可,如何想手动传递cookie值。可以请参考“渗透测试:通过Jmeter实现CSRF(Cross-site

[转帖]graphql 介绍

https://www.jianshu.com/p/da1260b95faf Graphql 介绍 graphql 是一种用于 API 的查询语言,对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,减少数据的冗余。 example 声明类型 type Pro