大家好,我是苏三。
API网段是服务器,是系统的唯一入口。 从面向对象设计的角度来看,它与外观模式类似。
API部分封装了系统的内部架构,并为每个客户端提供定制的API。 它还可能具有其他职责,例如身份验证、监控、负载平衡、缓存、协议转换、限流和断路以及静态响应处理。
API网段方式的核心点是所有客户端和消费者都通过统一网段访问微服务,并在网段层处理所有非业务功能。 一般该网段也提供REST/HTTP访问API。
1.2 网段主要功能
微服务网段作为微服务前端服务的统一入口,可以协调前端服务的管理,主要分为数据平面和控制平面:
Nginx 是一个高性能的 HTTP 和反向代理服务器。 Nginx一方面可以用作反向代理php网关,另一方面可以用作静态资源服务器。 socket使用Lua动态语言完成灵活的定制功能。
Nginx启动后,会有一个Master进程和多个Worker进程。 Master进程和Worker进程通过进程间通信进行交互,如图所示。 Worker进程的阻塞点是在select()、epoll_wait()等I/O复用函数调用处,等待数据读/写。 Nginx 使用异步非阻塞的方式来处理请求php网关,这意味着 Nginx 可以同时处理数千个请求。
祖尔
Zuul是Netflix的开源API网段组件。 它可以与Eureka、Ribbon、Hystrix等组件一起使用。 社区活跃并融入完整的 Spring Cloud 生态系统。 是微服务系统中建立后端网段服务的最佳选择之一。
Zuul目前有两个主要版本:Zuul1和Zuul2
Zuul1是基于Servlet框架构建的。 如图所示,它采用阻塞、多线程的方式,即一个线程处理一个连接请求。 这些方法将导致存活连接的增加以及严重的内部延迟和设备故障。 发生线程降级。
Netflix 发布的 Zuul2 有重大更新。 它在异步和非阻塞框架上运行,每个 CPU 核心有一个线程,处理所有请求和响应。 请求和响应的生命周期是通过波次和反弹来处理的。 这些方法减少了线程数量,因此开销更小。
SpringCloudGetWay
SpringCloudGateway是SpringCloud全新的API网段项目。 目的是替代Zuul1。 它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能Reactor模式响应式通信框架Netty,异步非阻塞模型)等技术开发,性能高于Zuul,官方测试,SpringCloudGateWay的1.6倍Zuul,为微服务架构提供了简单有效的统一API路由管理方法。
SpringCloudGateway可以与SpringCloudDiscoveryClient(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重绘、日志监控等功能。不过Gateway还有一个外接的限流过滤器实现 提供限流功能。
孔
Kong是Mashape基于OpenResty(Nginx+Lua模块)编译的一个高可用、易扩展的开源APIGateway项目。 Kong 构建于 NGINX 和 Apache Cassandra 或 PostgreSQL 之上。 它可以提供易于使用的RESTful API来操作和配置API管理系统,因此可以水平扩展多个Kong服务器,并通过负载均衡后的配置将请求均匀分配到每个服务器。 ,处理大量的网络请求。
Kong具有三个主要组成部分:
Kong采用插件机制进行功能定制。 插件集(可以是0或N)在API请求响应周期的生命周期内执行。 该插件使用Lua编译,目前有几个基本功能:HTTP基本认证、密钥认证、CORS(Cross-Origin ResourceSharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发和Nginx监控。
Kong网段具有以下特点:
特拉菲克
Træfɪk 是一个现代的 HTTP 反向代理和负载均衡工具,其诞生是为了让部署微服务更加方便。 它支持多个后端(Docker、Swarm、Kubernetes、Marathon、Mesos、Consul、Etcd、Zookeeper、BoltDB、RestAPI、file...)来手动和动态应用其配置文件设置。
重要特点:
2.2 API网段对比
有网段对比截图。 如果你比较懒,可以重点关注Kong、Traefik和Zuul:
3 基于Traefik自研的微服务网段
这是我公司基于Traefik开发的自主微服务网段。 下面对技术选型、网关框架、网关后端、协议转换进行说明。 绝对有用!
3.1 技术栈选择
3.3 网段框架
整个网段框架分为3块:
3.4 网段背景
它主要由3大模块组成:
一个应用程序只能绑定一个服务,可以绑定多个插件。 通过后台完成网段配置后,将此配置信息生成为Config文件并发布到ETCD。 配置文件需要遵守严格的数据格式。 例如,Traefix配置需要符合官方的文件配置格式,并且能够被Traefik识别。
3.5 合约转换模块
hal-proxy模块是整个微服务网段中最复杂、技术最密集的模块,所以我给大家详细讲解一下。
在讲这个模块之前,我们先看以下几个问题:
实现原理
我们先来看看hal-proxy内部都有哪些模块。 第一个是解析器模块。 这个模块的功能是什么? 这里我简单介绍一下。 目前公司内部通过服务获取机器列表的方式有很多种,比如MIS平台、服务树等,即有的通过平台配置,有的直接挂在服务树下。 无论哪种方法,我们都是通过服务名称和某种方法来查找该服务下的所有主机。
因此,Resolver模块的作用就是通过服务名找到该服务下所有机器的IP和服务端口,然后持久化到显存中并定期更新。
合约模块支持不同的合约转换。 每个合约类型转换都需要单独实现。 这个合约转换无非就是通过机器IP和端口初始化Client,然后转换数据直接发送给下游。 机器。
最后就是连接池。 虽然之前我们使用了Go自带的pool,并且在更新pool数据时需要加锁,所以性能依然无法提升。 后来改成环形队列,然后更新数据。 所有操作均通过原子操作方式完成,从而实现无锁操作,大大提高并发性能。 环形队列的代码也已经为您安排好了。 您可以直接阅读这篇文章。
这是hal-proxy的逻辑实现图。 画了2天。 它包含了所有核心对象的交互方法。 我这里就不详细说了。 你能理解多少取决于你自己。 如果有疑问(或者看不清图片)),可以关注我的公众号,在陌陌上加我交流。
星球中有很多独家的干货内容,比如:Java后端学习路线,分享实战项目,源码分析,百万级系统设计,系统上线的一些坑,MQ专题,真实面试题,每天都会回答大家提出的问题。