RPC远程过程调用,二进制封装,提供高吞吐低延迟的高性能RPC框架
大石头 authored at 2022-08-10 13:26:19
21.04 KiB
NewLife.Remoting
# NewLife.Remoting — Estrutura unificada de comunicação remota (RPC + HTTP + WebSocket + SRMP) ![GitHub License](https://img.shields.io/github/license/NewLifeX/NewLife.Remoting?logo=github) ![NuGet Downloads](https://img.shields.io/nuget/dt/NewLife.Remoting?logo=nuget) ![NuGet](https://img.shields.io/nuget/v/NewLife.Remoting?logo=nuget) ![NuGet prerelease](https://img.shields.io/nuget/vpre/NewLife.Remoting?label=dev%20nuget&logo=nuget) ![NuGet Downloads (Extensions)](https://img.shields.io/nuget/dt/NewLife.Remoting.Extensions?logo=nuget) ![NuGet (Extensions)](https://img.shields.io/nuget/v/NewLife.Remoting.Extensions?logo=nuget) ![NuGet prerelease (Extensions)](https://img.shields.io/nuget/vpre/NewLife.Remoting.Extensions?label=dev%20nuget&logo=nuget) [![NativeAOT](https://github.com/NewLifeX/NewLife.Remoting/actions/workflows/aot.yml/badge.svg?branch=master)](https://github.com/NewLifeX/NewLife.Remoting/actions/workflows/aot.yml) [![test](https://github.com/NewLifeX/NewLife.Remoting/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/NewLifeX/NewLife.Remoting/actions/workflows/test.yml) <!-- metrics:start --> [![AOT smoke](https://img.shields.io/badge/AOT%20smoke-23%2F23-brightgreen?logo=dotnet)](/NewLife/NewLife.Remoting/Blob/master/Doc/AOT兼容性分析.md) [![TFM](https://img.shields.io/badge/TFM-7%20%28net45%20%E2%86%92%20net10.0%29-512BD4?logo=dotnet)](https://www.nuget.org/packages/NewLife.Remoting) [![locales](https://img.shields.io/badge/locales-31-2ea44f?logo=dotnet)](/NewLife/NewLife.Remoting/Blob/master/Doc/多语言本地化接入.md) <!-- metrics:end --> ![platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS%20%7C%20Android%20%7C%20iOS-blue) ![arch](https://img.shields.io/badge/arch-x64%20%7C%20arm64%20%7C%20loongarch64%20%7C%20riscv64%20%7C%20s390x-orange) [![contributors](https://img.shields.io/github/contributors/NewLifeX/NewLife.Remoting?logo=github)](https://github.com/NewLifeX/NewLife.Remoting/graphs/contributors) <!-- lang:start --> 🌐 [English](/NewLife/NewLife.Remoting/Blob/master/README.md) | [简体中文](/NewLife/NewLife.Remoting/Blob/master/README.zh-CN.md) | [繁體中文](/NewLife/NewLife.Remoting/Blob/master/README.zh-TW.md) | [Español](/NewLife/NewLife.Remoting/Blob/master/README.es.md) | [Deutsch](/NewLife/NewLife.Remoting/Blob/master/README.de.md) | [日本語](/NewLife/NewLife.Remoting/Blob/master/README.ja.md) | [Français](/NewLife/NewLife.Remoting/Blob/master/README.fr.md) | [Русский](/NewLife/NewLife.Remoting/Blob/master/README.ru.md) | [한국어](/NewLife/NewLife.Remoting/Blob/master/README.ko.md) | [العربية](/NewLife/NewLife.Remoting/Blob/master/README.ar.md) <!-- lang:end --> NewLife.Remoting é a infraestrutura unificada de comunicação remota da pilha NewLife, distribuída em dois pacotes NuGet: | Pacote | Papel | Cobertura | |:---|:-----|:------| | **NewLife.Remoting** | Biblioteca de comunicação principal | Cliente/servidor RPC, codecs de protocolo, gerenciamento de conexões, chamadas em streaming, classes base de cliente, pipeline de comandos, atualização automática | | **NewLife.Remoting.Extensions** | Biblioteca de extensões | Classes base de controllers de servidor, host Minimal API, serviços de dispositivos, autenticação por token, barramento de respostas de comandos | Código-fonte: https://github.com/NewLifeX/NewLife.Remoting > NuGet: `NewLife.Remoting` / `NewLife.Remoting.Extensions` > ⚠️ Esta tradução pode ficar desatualizada; a versão autorizada é o [README em inglês](/NewLife/NewLife.Remoting/Blob/master/README.md). ## Índice de documentação | Documento | Descrição | |------|------| | [Doc/需求文档.md](/NewLife/NewLife.Remoting/Blob/master/Doc/需求文档.md) | Requisitos: visão, objetivos, requisitos funcionais (RPC/STRM/CLNT/UPGD/SRV/CMD/AOT/L10N/EXT) | | [Doc/架构设计.md](/NewLife/NewLife.Remoting/Blob/master/Doc/架构设计.md) | Arquitetura: camadas, módulos principais, gerenciamento de memória, estratégia de testes, decisões de projeto | | [Doc/SRV-服务端架构.md](/NewLife/NewLife.Remoting/Blob/master/Doc/SRV-服务端架构.md) | Arquitetura do servidor: camada de serviço, fluxos principais (login/registro/logout/heartbeat/atualização/eventos/comandos), ciclo de vida das sessões e cluster | | [Doc/功能清单.md](/NewLife/NewLife.Remoting/Blob/master/Doc/功能清单.md) | Acompanhamento de funcionalidades: status, itens em andamento e backlog | | [Doc/竞品分析.md](/NewLife/NewLife.Remoting/Blob/master/Doc/竞品分析.md) | Análise competitiva: frameworks RPC e envio de comandos IoT | | [Doc/SRMP.MD](/NewLife/NewLife.Remoting/Blob/master/Doc/SRMP.MD) | Especificação do protocolo SRMP | | [Doc/RPC内存管理设计.md](/NewLife/NewLife.Remoting/Blob/master/Doc/RPC内存管理设计.md) | Gerenciamento de memória sem cópia | | [Doc/自动更新机制.md](/NewLife/NewLife.Remoting/Blob/master/Doc/自动更新机制.md) | Projeto completo da atualização automática | | [Doc/重试策略.md](/NewLife/NewLife.Remoting/Blob/master/Doc/重试策略.md) | Política de retentativa: `IRetryPolicy` e backoff exponencial | | [Doc/AOT兼容性分析.md](/NewLife/NewLife.Remoting/Blob/master/Doc/AOT兼容性分析.md) | Escopo do NativeAOT, <!--aot-scenarios:start-->23<!--aot-scenarios:end--> cenários verificados (smoke <!--aot-smoke:start-->23/23<!--aot-smoke:end-->), orientação e limites conhecidos | | [Doc/多语言本地化接入.md](/NewLife/NewLife.Remoting/Blob/master/Doc/多语言本地化接入.md) | Mensagens em inglês, tabelas `Locales/*.yml` e guia de `L.T` | | [Doc/README多语言规范.md](/NewLife/NewLife.Remoting/Blob/master/Doc/README多语言规范.md) | Regras de ordenação, scripts e gate de CI para os 11 idiomas do README | --- ## Destaques | Capacidade | Descrição | |:---------|------| | **Núcleo RPC** | Protocolo SRMP, codecs JSON/binário, pipeline de requisições, cliente/servidor, gerenciamento de cluster, metadados, retentativas, servidor totalmente assíncrono, rastreamento por TraceId | | **STRM streaming** | Server-Streaming: `IAsyncEnumerable<T>` enviado item a item por SRMP e SSE | | **CLNT cliente base** | Login/heartbeat/atualização/comandos/eventos em um só lugar, alternância automática WS/SSE | | **UPGD atualização** | Detectar → baixar → verificar → extrair → sobrescrever → reiniciar | | **SRV base do servidor** | ApiController/BaseController/BaseDeviceController, TokenService, IDeviceService; o mesmo endpoint é exposto em MVC e em Minimal API (implementações espelhadas validadas por testes) | | **CMD comandos** | SessionManager + broadcast por barramento de eventos + canais WS/SSE/Ping | | **L10N localização** | As mensagens usam inglês como texto de origem; `Locales/*.yml` fornecem 31 idiomas integrados (incluindo chinês simplificado e tradicional), com fallback para inglês; sem ResourceManager nem assemblies satélite | | **Suporte AOT** | Análise AOT permanente a partir do net8.0 (0 avisos na biblioteca principal e no Extensions) + gerador de código próprio (tabela de despacho, bombas de streaming, preservação de assinaturas); NativeAOT validado em <!--aot-scenarios:start-->23<!--aot-scenarios:end--> cenários, 11 do host Minimal API e 6 da cadeia de dispositivos XCode (ver doc AOT §8) | ## Início rápido **Cinco linhas no servidor, cinco no cliente e o RPC funciona:** ```csharp // === Servidor === var server = new ApiServer(12345); server.Register<MyController>(); server.Start(); public class MyController : ApiController { public String Ping(String name) => $"Hello {name}, {DateTime.Now:HH:mm:ss}"; // Streaming: retornar IAsyncEnumerable<T> envia item a item public async IAsyncEnumerable<String> StreamLogs(Int32 count) { for (var i = 0; i < count; i++) { await Task.Delay(100); yield return $"Log #{i}: {DateTime.Now:HH:mm:ss}"; } } } // === Cliente === var client = new ApiClient("tcp://127.0.0.1:12345"); client.Open(); // Chamada normal var rs = await client.InvokeAsync<String>("My/Ping", new { name = "dev" }); // Chamada em streaming — recebe cada envio do servidor await foreach (var log in client.InvokeStreamAsync<String>("My/StreamLogs", new { count = 10 })) Console.WriteLine(log); // Metadados (TraceId é injetado automaticamente) client.Headers["TenantId"] = "tenant-01"; ``` ## Desempenho | Métrica | Típico | Pico em laboratório | |:----|:------:|:--------:| | Conexões TCP longas | 10.000 | 4.000.000 | | Throughput RPC | 100.000 TPS | 455.000 msg/s | | Latência por RPC | ~41 μs | — | | Frameworks | net45 / net461 / netstandard2.0 / netstandard2.1 / net6.0 / net8.0 / net10.0 (alinhado ao NewLife.Core v12; NativeAOT a partir do net8.0) | ## Atualização para v4 O v4 alinha-se ao NewLife.Core v12 e altera a camada de rede. Antes de atualizar: - **Duas portas**: a porta principal atende apenas SRMP; defina `HttpPort` explicitamente para habilitar HTTP (desativado por padrão). - **Sem SRMP sobre WebSocket**: endereços `ws://`/`wss://` agora lançam `NotSupportedException`; use `tcp://`/`udp://` para SRMP e `http(s)://` para chamadas HTTP. - **Tipos de codec removidos**: `WsClient`, `HttpCodec`, `WebSocketClientCodec`, `WebSocketServerCodec` e os métodos de quadro de `HttpMessage` foram removidos; o HTTP é tratado pelo `HttpServer` do Core, e o enquadramento personalizado deve implementar `IMessageCodec`. - **Chaves de mensagens em inglês**: mensagens de runtime usam o texto inglês como chave; compare `ApiCode` ou códigos de erro em vez do texto localizado. - **Frameworks de destino**: os ativos net5.0/net7.0/net9.0 não são mais distribuídos; o NuGet recorre automaticamente ao framework compatível mais próximo. Consulte [ChangeLog.md](/NewLife/NewLife.Remoting/Blob/master/ChangeLog.md) para a lista completa. --- ## Cooperação com outros componentes NewLife | Componente | Valor | | ---- | -------- | | NewLife.Core | Log, configuração, serialização, localização, pool de objetos, TimerX, rastreamento | | NewLife.Net | Pilha de rede de alto desempenho, WebSocket/codecs, reutilização de portas | | NewLife.Redis | Cache distribuído / fila de mensagens para sessões compartilhadas ou fan-out | | Stardust | Registro de nós, central de configuração, APM, central de releases | | AntJob | Agendamento de tarefas e computação distribuída via ClientBase | | NewLife.MQTT / Modbus / IoT | Coleta de protocolos de dispositivos e envio ascendente via Remoting | ## Contribuições e feedback Bem-vindos: relatos de bugs, PRs de desempenho, novos codecs, exemplos de controllers, documentação e novas traduções. Em issues, informe: ambiente, framework de destino, reprodução mínima e trecho de log. --- ## Mapa do ecossistema NewLife é um ecossistema em camadas de projetos open source versionados de forma independente. O mapa abaixo é compartilhado literalmente por todos os repositórios NewLife; cada projeto tem links para o seu repositório e para o seu pacote principal no NuGet. | Projeto | O que faz | Downloads | | --- | --- | --- | | **Base** | | | | [NewLife.Core](https://github.com/NewLifeX/X) | Log, configuração, cache, rede, serialização, agendamento e rastreamento APM. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Core?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Core) | | [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode) | Middleware de dados: tabelas únicas na escala de dezenas de bilhões de linhas, particionamento automático, separação de leitura e escrita, mais de 10 bancos de dados. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.XCode?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.XCode) | | [NewLife.Net](https://github.com/NewLifeX/NewLife.Net) | Biblioteca de rede de alto desempenho: 1,77M pps / 14,5 Gbps em uma máquina (TCP 1KB, 2026-10), 4M de conexões TCP persistentes. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Net?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Net) | | [NewLife.Remoting](https://github.com/NewLifeX/NewLife.Remoting) | Framework de comunicação por protocolo e RPC para aplicações cliente/servidor e dispositivos IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Remoting?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Remoting) | | [NewLife.Agent](https://github.com/NewLifeX/NewLife.Agent) | Instala aplicações .NET como daemons do sistema operacional: serviços do Windows e systemd do Linux. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Agent?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Agent) | | [NewLife.Templates](https://github.com/NewLifeX/NewLife.Zero) | Modelos de projeto `dotnet new` para console, web, API, serviço, dados e IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Templates?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Templates) | | **Dados e mensagens** | | | | [NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis) | Cliente Redis com latência em microssegundos, milhões de operações por segundo e filas de mensagens integradas. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Redis?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Redis) | | [NewLife.RocketMQ](https://github.com/NewLifeX/NewLife.RocketMQ) | Cliente RocketMQ totalmente gerenciado para Apache RocketMQ e Alibaba Cloud Message Queue. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.RocketMQ?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.RocketMQ) | | [NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT) | Cliente e servidor MQTT, incluindo conectividade com o Alibaba Cloud IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.MQTT?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.MQTT) | | [NewLife.NovaDb](https://github.com/NewLifeX/NewLife.NovaDb) | Banco de dados híbrido em C#: embarcado ou em rede, relacional, séries temporais, fila de mensagens e KV em um só. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.NovaDb?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.NovaDb) | | [NewLife.MySql](https://github.com/NewLifeX/NewLife.MySql) | Driver MySql e camada auxiliar construídos sobre a pilha de dados NewLife. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.MySql?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.MySql) | | **Web, IA e distribuído** | | | | [NewLife.Cube](https://github.com/NewLifeX/NewLife.Cube) | Framework de plataforma administrativa rápida: permissões, SSO, servidor OAuth e scaffolding CRUD. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Cube?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Cube) | | [Stardust](https://github.com/NewLifeX/Stardust) | Plataforma de serviços distribuídos: gestão de nós, APM, centro de configuração, registro e centro de publicação. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Stardust?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Stardust) | | [AntJob](https://github.com/NewLifeX/AntJob) | Plataforma distribuída de tarefas e agendamento de dados em tempo real, com particionamento, repetição e reprocessamento. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.AntJob?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.AntJob) | | [NewLife.AI](https://github.com/NewLifeX/NewLife.AI) | Cliente unificado para 46 provedores de LLM, além do ChatAI, uma aplicação web de chat pronta para uso. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.AI?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.AI) | | **Industrial e IoT** | | | | [NewLife.IoT](https://github.com/NewLifeX/NewLife.IoT) | Biblioteca padrão de IoT que define contratos de protocolo e abstrações de dispositivos. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.IoT?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.IoT) | | [NewLife.Modbus](https://github.com/NewLifeX/NewLife.Modbus) | Implementação Modbus TCP/RTU/ASCII sobre NewLife.IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Modbus?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Modbus) | | [NewLife.Siemens](https://github.com/NewLifeX/NewLife.Siemens) | Protocolo Siemens PLC sobre NewLife.IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Siemens?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Siemens) | | [NewLife.Omron](https://github.com/NewLifeX/NewLife.Omron) | Protocolo Omron PLC sobre NewLife.IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Omron?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Omron) | | [NewLife.Melsec](https://github.com/NewLifeX/NewLife.Melsec) | Protocolo Mitsubishi Melsec PLC sobre NewLife.IoT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Melsec?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Melsec) | | [NewLife.OPC](https://github.com/NewLifeX/NewLife.OPC) | Cliente OPC para acesso a dados industriais. | — | | [NewLife.BACnet](https://github.com/NewLifeX/NewLife.BACnet) | Pilha do protocolo de automação predial BACnet. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.BACnet?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.BACnet) | | [ZeroIoT](https://github.com/NewLifeX/ZeroIoT) | Plataforma IoT de código aberto leve, com gestão de gateways e dispositivos. | — | | **Telemática veicular** | | | | [NewLife.JT808](https://github.com/NewLifeX/NewLife.JT808) | Protocolo de posicionamento veicular JT/T 808: mais de 70 corpos de mensagem, 2011/2013/2019. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.JT808?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.JT808) | | [NewLife.JT809](https://github.com/NewLifeX/NewLife.JT809) | Protocolo plataforma-a-plataforma JT/T 809 para autoridades de transporte. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.JT809?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.JT809) | | [NewLife.JT1078](https://github.com/NewLifeX/NewLife.JT1078) | Vídeo veicular JT/T 1078: análise RTP, remux para FLV/fMP4 e transmissão ao vivo. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.JT1078?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.JT1078) | | **Componentes de domínio** | | | | [NewLife.Office](https://github.com/NewLifeX/NewLife.Office) | Um pacote para Excel, Word, PPT, PDF e mais de 15 formatos de documento. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Office?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Office) | | [NewLife.Audio](https://github.com/NewLifeX/NewLife.Audio) | Áudio multiplataforma: codecs, E/S de dispositivos, DSP, contêineres e streaming. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Audio?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Audio) | | [NewLife.Video](https://github.com/NewLifeX/NewLife.Video) | Codecs de vídeo, formatos de contêiner, processamento de frames e streaming. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Video?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Video) | | [NewLife.Map](https://github.com/NewLifeX/NewLife.Map) | Interface unificada sobre Baidu, AMap, Tencent e Tianditu, com geocodificação e conversão de coordenadas. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.Map?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.Map) | | [NewLife.IP](https://github.com/NewLifeX/NewLife.IP) | Geolocalização IPv4 com banco de dados offline mapeado em memória e API online como alternativa. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.IP?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.IP) | | **Ferramentas e produtos** | | | | [CrazyCoder](https://github.com/NewLifeX/XCoder) | Caixa de ferramentas do desenvolvedor: rede, porta serial, criptografia, regex, Modbus e MQTT. | [![NuGet](https://img.shields.io/nuget/dt/NewLife.XCoder?style=flat-square&logo=nuget&label=downloads)](https://www.nuget.org/packages/NewLife.XCoder) | | [GitCandy](https://github.com/NewLifeX/GitCandy) | Sistema auto-hospedado de gerenciamento de código-fonte Git. | — | | [LuckyClover](https://github.com/NewLifeX/LuckyClover) | Instala automaticamente o runtime .NET correspondente quando iniciado em um host mais antigo. | — | > Os badges mostram o pacote principal de cada projeto; pacotes de tema, extensão e satélites estão listados nas respectivas páginas do NuGet.Os mais de 30 pacotes não listados aqui (FTP, LoRa, extensões do Office, drivers de protocolo e outros) estão disponíveis na [organização NewLifeX](https://github.com/NewLifeX) e em [newlifex.com](https://newlifex.com). --- ## Equipe <img src="https://newlifex.com/logo.png" width="48" align="right" alt="NewLife" /> Fundada em 2002, a equipe NewLife dedica-se há mais de duas décadas ao ecossistema .NET e de IoT, mantém cerca de 100 projetos de código aberto (34 deles principais) e oferece soluções integradas de software e hardware para os setores de energia, logística, saúde, controle industrial e internet. Seguimos o lema "não há hierarquia no aprendizado — o domínio conquista o respeito". Os componentes de código aberto já foram baixados <!--nuget-total:start-->6.48M<!--nuget-total:end--> vezes no NuGet (todo o ecossistema, até 2026-10). Website: https://newlifex.com · Organização de código aberto: https://github.com/NewLifeX <details> <summary>Conta oficial no WeChat: 智能大石头 (escaneie para seguir)</summary> ![智能大石头](https://newlifex.com/stone.jpg) </details> --- ## Licença MIT © NewLife. Uso comercial e desenvolvimento derivado são bem-vindos.