尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

flatend核心概念详解:一文搞懂Node、Service、Provider与Stream

flatend核心概念详解:一文搞懂Node、Service、Provider与Stream flatend核心概念详解一文搞懂Node、Service、Provider与Stream【免费下载链接】flatendQuickly build microservices using p2p networking in NodeJS/Go.项目地址: https://gitcode.com/gh_mirrors/fl/flatendflatend 是一个基于 p2p 网络点对点网络快速构建微服务的实验性框架同时提供 NodeJS 与 Go 两种参考实现。与传统的微服务架构不同flatend 不需要中心化的服务注册中心、负载均衡器或 API 网关而是通过 Kademlia 分布式哈希表实现服务发现通过全加密的双向流式 RPC 完成数据交互。想要真正用好 flatend关键在于理解它的四个核心概念Node、Service、Provider 与 Stream。这篇文章将用最通俗的语言带你一次搞懂它们的定义、分工与协作方式。为什么先搞懂这四个核心概念flatend 的整个架构可以浓缩成一句话多个 Node 组成网络Node 通过 Provider 连接彼此Service 定义了能干什么事Stream 则承载了这件事的全部数据。这四个概念环环相扣没有 Node网络就不存在没有 Service请求就没有去处没有 Provider服务就无法被发现没有 Stream数据就无法流动。理解了它们再看 flatend 的源码例如根目录下的node.go、provider.go、packet.go就会豁然开朗。flatend的Node节点网络的每一个成员 ️Node 是什么Node节点是 flatend 网络中的基本单元可以理解为一个运行中的微服务进程。每个 Node 拥有一个基于 Ed25519 算法的密钥对作为身份标识SecretKey并且可以绑定一个或多个端口BindAddrs来监听其他节点的连接。在 Go 中Node 由node.go中的Node结构体定义关键字段包括SecretKey32 字节的 Ed25519 私钥用于身份认证与通信加密PublicAddr对外可达的公开地址供其他节点连接BindAddrs监听地址列表Services服务名到处理函数的映射表Node 的完整生命周期由Start()、Probe()、Bootstrap()、Shutdown()等方法驱动。Start()启动监听并连接引导节点Bootstrap()则通过 Kademlia 协议主动发现网络中的其他节点。一个 Node 的生命周期启动生成或加载密钥绑定端口开始监听握手与已知节点引导节点建立连接交换各自提供的服务列表引导通过 Kademlia 路由表发现更多节点逐渐融入整个网络服务接收并处理来自其他节点的服务请求关闭优雅退出断开所有连接在 NodeJS 中对应的实现位于nodejs/src/node.tsAPI 风格类似通过Node.start()一键启动。flatend Service给微服务起个名字 ️Service 是什么Service服务是 flatend 中服务的逻辑名称本质上是服务名 → 处理函数的映射关系。一个 Node 可以同时注册多个 Service例如一个节点既能处理hello_world也能处理user_login。在 Go 中注册一个 Service 非常简单node : flatend.Node{ Services: map[string]flatend.Handler{ hello_world: helloWorld, }, }在 NodeJS 中写法类似通过services选项传入即可。服务注册与发现机制 Service 的发现完全依托于 p2p 握手协议。当两个节点建立连接时双方会在握手包HandshakePacket中互相通告自己提供的服务列表核心逻辑位于node.go的createHandshakePacket()与handleMessage()中。这样带来的好处非常明显去中心化没有注册中心没有单点故障自动感知新节点上线即可被其他节点发现零配置不需要手动维护服务地址清单flatend Provider提供服务的能力来源 ⚙️Provider 是什么Provider提供者代表一个提供服务的对等连接。每当一个节点向你通告它提供的服务时你就在本地为其注册一个 Provider 实例。Provider 内部维护了该连接提供的服务集合、以及所有活跃的 Stream 实例。在源码provider.go中Providers注册表使用两级映射管理所有提供者先按服务名找到连接再通过连接找到对应的 Provider。Provider 如何实现微服务负载均衡 ⚖️flatend 的负载均衡策略非常朴素但有效。当你调用Node.Push()推送一个服务请求时见node.go中的Push()方法根据请求的服务名在 Provider 注册表中找到所有能处理该服务的 Provider随机打乱Provider 列表rand.Shuffle依次尝试推送直到某个 Provider 成功处理为止这意味着当一个 Service 被多个节点同时提供时flatend 会自动把请求分散到不同的节点上天然实现了服务冗余与负载均衡。某个节点挂掉后请求会自动落到其他提供者上配合自动重连机制服务可用性大大提升。flatend Stream一次完整的数据交互 Stream 是什么Stream流是 flatend 中一次服务请求/响应的完整通道。它支持双向、全加密、分块的数据传输可以流式地传递任意大小的数据——从几百字节的 JSON 到几个 GB 的文件都不在话下。Stream 结构体定义于provider.go包含三个核心成员ID流的唯一标识Header服务响应头包含是否被处理、元数据等Reader/Writer基于内存管道io.Pipe的双向读写端数据包类型与传输协议 flatend 的通信基于五种操作码Opcode定义在packet.go中操作码数据包作用0HandshakePacket节点握手交换身份与服务列表1ServiceRequestPacket发起服务请求2ServiceResponsePacket返回服务响应头3DataPacket传输流式数据块4/5FindNode 请求/响应Kademlia 节点发现一个有趣的细节是Stream ID 的奇偶性代表了方向。客户端发起的流使用奇数 ID1、3、5…服务端接受的流使用偶数 ID0、2、4…这在node.go的注释中有明确说明。数据以固定大小的块ChunkSize被拆分成多个 DataPacket 发送最后一个空数据包表示流结束。双向流的魔力 ✨因为 Stream 是双向的所以它不仅能承载请求和响应还能实现代理、管道等高级用法。例如在flathttp/service.go中API 网关收到 HTTP 请求后把 HTTP 头、查询参数、路由参数打包进请求头然后把请求体作为流推送给微服务节点最后把响应流原样写回 HTTP 响应——整个过程中数据像水管一样持续流动。四个核心概念如何协同工作让我们用一次真实的请求来串联这四大概念浏览器向 flatend 网关发起GET /hello请求网关作为Node之一通过Node.Push()查找提供hello_world服务的Provider网关随机选择一个可用的Provider通过Stream发送 ServiceRequestPacket提供方Node收到请求找到注册表里名为hello_world的Service处理函数处理结果通过同一个Stream分块流式返回网关把流式响应转写为 HTTP 响应返回给浏览器整个过程完全去中心化、端到端加密任何一个节点宕机都不会导致整个系统瘫痪。flatend核心概念快速上手示例 体验这套概念最直接的方式是跑通官方示例。以hello_world为例在 Go 中只需在main.go里注册Services映射然后调用node.Start(127.0.0.1:9000)连接网关即可NodeJS 版本见examples/nodejs/hello_world/目录。项目还提供了counter、file、pipe、todo等多个示例对应examples/go/与examples/nodejs/目录从简单到复杂循序渐进地展示 Node、Service、Provider 与 Stream 的配合方式。如果想要从源码构建可以克隆仓库后运行go build ./cmd/flatend构建网关二进制。总结 Node是网络的成员承载身份与连接Service是服务的名字定义能力边界Provider是服务的提供者实现发现与负载均衡Stream是数据的通道支撑双向流式通信这四个核心概念构成了 flatend 简洁而强大的 p2p 微服务架构。无论你是准备用 Go 快速原型还是用 NodeJS 快速迭代业务逻辑先在心里搭好这张概念地图后面的学习曲线就会平缓很多。现在打开官方示例动手跑起第一个 flatend 微服务吧【免费下载链接】flatendQuickly build microservices using p2p networking in NodeJS/Go.项目地址: https://gitcode.com/gh_mirrors/fl/flatend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表