当前位置: 首页 > 科技观察

偷偷告诉你,互联网公司理想的技术架构!

时间:2023-03-15 14:39:22 科技观察

图片来自PexelsApp整体架构,PC端,第三方调用者通过传统的域名解析服务LocalDNS获取负载均衡器的IP,App可以使用HttpDNS实现更实时,灵活准确的域名解析服务。通过负载均衡器到达统一接入层,统一接入层维护长连接。API网关作为微服务的入口,负责协议转换、请求路由、认证鉴权、流量控制、数据缓存等,业务服务器使用PUSH推送系统实现对端的实时推送,如如即时通讯、通知等功能。业务服务器之间通过私有的RPC协议相互调用,通过NAT网关调用外部第三方服务。域名解析传统DNSDNS(DomainNameSystem)域名系统,一种分布式网络目录服务,用于域名和IP地址之间的转换,可以让人们更方便的上网,而无需记住IP地址机器的。DNS解析过程如下:客户端递归查询LocalDNS(通常是ISP互联网服务商提供的边缘DNS服务器)获取IP。LocalDNS迭代查询获取IP,即不断获取域名服务器地址进行查询。HttpDNS移动解析(HttpDNS)基于Http协议向DNS服务器发送域名解析请求,替代了传统的基于DNS协议向运营商LocalDNS发起解析请求的方式。可以避免LocalDNS带来的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。以腾讯云HttpDNS为参考,相比传统LocalDNS的优势:负载均衡为了解决单机的性能问题和单点问题,需要通过负载均衡横向扩展多台机器,将请求流量分发到在服务器上不同。客户端的流量首先会到达负载均衡服务器,负载均衡服务器通过一定的调度算法将流量分发到不同的应用服务器。同时,负载均衡服务器也会定期对应用服务器进行健康检查。当发现故障节点时,会动态将该节点从应用服务器集群中移除,以保证应用的高可用性。网络负载均衡的实现方式主要有两种:硬件和软件。主流的负载均衡方案中,硬件厂商以F5为代表,软件主要有LVS、NGINX、HAProxy等。技术原理分为L4四层负载均衡和L7七层负载均衡。L4vsL7L4四层负载均衡工作在OSI模型的传输层,主要工作是转发。客户端收到消息后,需要了解传输层的协议内容,根据预先设置的转发方式和调度算法将消息转发给应用服务器。以TCP为例,当一个TCP连接的初始SYN报文到达时,调度器选择一个服务器并将报文转发给它。之后通过检查报文的IP和TCP头地址,保证本次连接的后续报文都转发给服务器。L7七层负载均衡工作在OSI模型的应用层,其主要工作是充当代理。七层负载均衡会与客户端建立一个完整的连接,分析应用层的请求,然后根据调度算法选择一个应用服务器,再与该应用服务器建立连接,将请求发送到那里。LVS转发模式LVS(IP负载均衡技术)工作在L4第4层以下,转发模式包括:DR模式NAT模式TUNNEL模式FULLNAT模式真实服务器,而真实服务器直接将响应返回给客户端。要求调度器和realserver都有网卡连接在同一个物理网段,realserver需要配置VIP。②NAT模式(NetworkAddressTranslation)调度器改写请求报文的目标地址,根据预设的调度算法将请求分配给后端真实服务器;当真实服务器的响应报文经过调度器时,报文的源地址被改写,然后返回给客户端,完成整个负载调度过程。要求负载均衡需要以网关的形式存在于网络中。③TUNNEL模式的调度器通过IP隧道将请求报文转发给真实服务器,真实服务器直接返回响应给客户端,所以调度器只处理请求报文。需要真实服务器支持隧道协议并配置VIP。④FULLNAT模式是在NAT模式的基础上进行源地址转换(SNAT)。做SNAT的好处是响应流量可以通过正常的三层路由返回到负载均衡器,这样负载均衡器就不需要做网关的形式了。存在于网络中。性能不如NAT模式,其中真实服务器丢失客户端的真实IP地址。调度算法①轮询将外部请求轮流分发给集群中的真实服务器,它对每台服务器都一视同仁,不考虑服务器的实际连接数和系统负载。②加权轮询权重越大,分配的访问概率就越高,主要用于在各后端服务器性能不平衡时,实现主机资源的合理有效利用。③最少连接向建立连接数最少的服务器发送网络请求。如果集群系统的真实服务器具有相似的系统性能,“最小连接”调度算法可以更好地平衡负载。④Hash将指定Key的哈希值与服务器数量进行模运算,得到所需服务器序号的一致性哈希。考虑到分布式系统中每个节点都可能出现故障,并且可能会动态添加新节点,一致性哈希可以保证在系统中节点数量发生变化时访问节点的移动最小。API网关API网关(APIGateway)是服务器集群的唯一对外入口。从面向对象设计的角度来看,它类似于Facade模式。API网关封装了系统内部架构,对外提供REST/HTTP访问API。它还具有其他与业务无关的职责,如认证、监控、负载均衡、缓存、流量控制等。API管理API网关的核心功能是API管理。提供完整的API生命周期管理,包括创建、维护、发布、运行、下线等基础功能;提供测试、预发布、发布等环境;提供版本管理和版本回滚。API配置包括前端配置和后端配置:前端配置是指Http相关的配置,比如HTTP方法、URL路径、请求参数等,后端配置是指微服务的相关配置,比如service名称,服务参数等。这样,通过API配置,就完成了从前端Http到后端微服务的转换。全异步由于API网关主要处理网络I/O,通过非阻塞I/O和I/O复用,可以用少量线程承载海量并发处理,避免线程上下文切换,大大增加系统吞吐量,降低机器成本。常见的方案有Tomcat/Jetty+NIO+Servlet3.1和Netty+NIO。这里推荐Netty+NIO,可以达到更高的吞吐量。Spring5.0推出的WebFlux反应式编程模型具有异步、事件驱动、非阻塞等特点。内部基于Netty+NIO或Servlet3.1Non-BlockingIO容器实现。ChainedprocessingChainedprocessing通过责任链模型提供基于Filter链的网关的基本功能,如:路由、协议转换、缓存、限流、监控、日志等。也可以根据实际业务需要进行扩展,但注意不要做耗时的操作。SpringCloudGateway(基于SpringWebFlux)的工作机制大致如下:网关接收客户端请求。客户端请求与路由信息进行匹配,只有匹配成功的才能发送给相应的下游服务。请求经过Filter过滤链执行预处理逻辑,比如修改请求头信息。请求被转发到下游服务并返回响应。响应通过Filter过滤器链并执行后处理逻辑。以确认回应客户。请求限速请求限速是防止系统在未知流量面前不堪重负的最后一道有效防线。可以针对集群、业务系统和特定API维度限制流量。具体实现分为集群版和单机版。不同的是,集群版使用Redis等后端统一缓存来存储数据,但有一定的性能损失;单机版将数据存储在本地内存中(推荐)。常用限流算法:counterleakybuckettokenbucket(推荐)熔断降级①服务熔断当下游服务由于某种原因突然不可用或响应太慢时,上游服务不再继续调用目标服务,直接返回,并快速释放资源。如果目标服务更好,则恢复呼叫。熔断是为了解决服务雪崩,尤其是在微服务系统中,通常在框架层面处理。内部机制采用断路器模式,其内部状态转换图如下:②服务降级当负载超过系统整体负载能力时,为保证核心服务的可用性,通常可以将非核心服务降级降级。如果返回或者直接返回缓存的内容,服务降级的粒度可以是API维度,功能维度,甚至是系统维度,但是需要提前梳理和定义服务等级。在实际场景中,通常是在服务器负载超过阈值告警后,管理员才决定扩容还是降级。业务隔离API网关统一了非业务层面的处理,但如果有业务处理逻辑,不同业务可能会相互影响。隔离业务系统,通常可以使用线程池隔离和集群隔离,但是对于Java来说,线程是比较重的资源,建议使用集群隔离。PUSHpush消息推送系统针对不同场景推出多种推送类型,满足用户个性化推送需求,并集成了苹果、华为、小米、FCM等厂商渠道的推送功能。在提供控制台快速推送能力的同时,还提供了服务器接入方案,方便用户快速集成移动端推送功能,保持与用户的互动,有效提高用户留存率和用户体验。①设备连接建立、注册、用户绑定过程②消息推送过程在很多业务场景中,业务发生时用户可能不在线或者没有网络。因此,所有消息都持久化在MPS中。当有业务发生时,MPS会尝试进行推送(第三方渠道推送或自建TCP连接推送)。在自建通道中,会通过查询缓存判断用户终端是否有TCP连接,存在则推送。客户端收到推送消息后,会向服务器发送回执,服务器可以更新消息状态。如果推送失败或者回执丢失,用户会在下次连接建立时再次收到消息通知,客户端会进行逻辑去重。微服务系统TODO再写一篇介绍,期待!