Advertisement

Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布

阅读量:

Apache Dubbo3 是一款高性能的 Web 和 RPC 框架,支持构建企业级微服务,具备企业级功能如企业发现、流量治理、可观测、认证鉴权等。经过几年的发展,Dubbo3 已在阿里巴巴集团各条业务线实现全面推广,取代了运行多年的 HFSQL 框架。基于 Dubbo3 定义的 Triple 协议,开发者可以轻松编写浏览器、移动端、gRPC 兼容的 RPC 服务,并支持在 HTTP/1 和 HTTP/2 上运行。Dubbo Node.js SDK 支持使用 IDL 或编程语言方式定义服务,并提供轻量的 API 进行发布或调用。Dubbo3 的多语言体系涵盖 Java、Go、JavaScript、Rust 等语言。Node.js 版本已发布支持 Dubbo3 协议的首个 alpha 版本,基于 TypeScript 实现,提供了 Web 和 Node.js 两种发布包。未来,社区将继续完善地址发现、负载均衡等服务治理能力。

关于Apache Dubbo3

Apache Dubbo是一款易于使用且性能卓越的WEB和RPC框架,同时为构建企业级微服务提供了服务发现、流量治理、可观测、认证鉴权等功能、工具与最佳实践。经过几年的发展历程,Dubbo3已在阿里巴巴集团的各条业务线实现广泛推广,成功替代了运行多年的HSF框架。同时,Dubbo3的多语言体系也实现了快速扩展,目前涵盖的多语言体系包括

  • 项目1(Java):Apache Dubbo( Dubbo**[1]**)是一个基于服务定位协议的Java服务发现与注册框架。
  • 项目2(Go):Apache Dubbo-Go( Dubbo-go**[2]**)是针对Go语言的扩展,旨在为开发者提供更高效的跨平台服务发现与注册解决方案。
  • 项目3(JavaScript):Apache Dubbo-JavaScript( Dubbo-js**[3]**)是一个针对JavaScript环境的扩展,支持Web和Node.js平台的高可用性和高性能服务发现与注册功能。
  • 项目4(Rust):Apache Dubbo-Rust( Dubbo-rust**[4]**)是针对Rust语言的扩展,旨在为开发者提供高性能、可扩展的服务发现与注册框架。

遵循 Dubbo3 定义的 Triple 协议,你将能够方便地开发支持浏览器、移动端及 gRPC 兼容的 RPC 服务,并使这些服务同时运行在 HTTP/1 和 HTTP/2 环境中。Dubbo 的 Node.js SDK 包含支持使用 IDL 或编程语言特有的方式定义服务,并提供一套高效轻量的 API 来发布或调用这些服务。

关于 Dubbo3 Node.js 首个发布版

Dubbo-js项目于9月刚刚发布了支持Dubbo3协议的首个Alpha版本,这一版本基于TypeScript实现,提供了Web和Node.js两种发布包。其中,Web框架允许开发者直接在浏览器页面访问后端服务,而Node.js版本则进一步丰富了后端微服务技术架构的选择。目前,Node.js版本已经实现了Triple协议的全面支持,未来版本中,社区将继续完善地址发现、负载均衡等服务治理能力。

Node.js 微服务开发完整示例

本示例利用了最新Node.js版本,展示了基于Triple协议的RPC通信模式。该示例通过规范定义RPC服务,并展示了代码编译、服务部署以及服务连接的过程。

前置条件

由于Protocol Buffer的使用,我们需要安装相关的代码生成工具,包括es版本的Protobuf代码生成工具、标准版的Protobuf代码生成工具、Apache Dubois的es版本Protobuf代码生成工具以及Apache Dubois的标准版Protobuf代码生成工具。

复制代码
    npm install @bufbuild/protoc-gen-es @bufbuild/protobuf @apachedubbo/protoc-gen-apache-dubbo-es @apachedubbo/dubbo

定义服务

现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。

创建目录,并生成文件:

复制代码
    mkdir -p proto && touch proto/example.proto

写入内容:

复制代码
 syntax = "proto3";

    
  
    
 package apache.dubbo.demo.example.v1;
    
  
    
 message SayRequest {
    
   string sentence = 1;
    
 }
    
  
    
 message SayResponse {
    
   string sentence = 1;
    
 }
    
  
    
 service ExampleService {
    
   rpc Say(SayRequest) returns (SayResponse) {}
    
 }

该文件定义了一个名为ExampleService的服务,并为该服务提供了Say方法,同时设置了其请求参数为SayRequest及其返回值SayResponse。

生成代码

创建 gen 目录,做为生成文件放置的目标目录。

复制代码
    mkdir -p gen

运行以下命令,在 gen 目录下生成代码文件:

复制代码
 PATH=$PATH:$(pwd)/node_modules/.bin \

    
   protoc -I proto \
    
   --es_out gen \
    
   --es_opt target=ts \
    
   --apache-dubbo-es_out gen \
    
   --apache-dubbo-es_opt target=ts \
    
   example.proto

运行命令后,应该可以在目标目录中看到以下生成的文件:

复制代码
 ├── gen

    
 │   ├── example_dubbo.ts
    
 │   └── example_pb.ts
    
 ├── proto
    
 │   └── example.proto

实现服务

接下来,我们需要为该系统添加业务逻辑。然后,我们将实现一个名为ExampleService的实例,并将其注册到DubboRouter中。

创建 dubbo.ts 文件:

复制代码
 import { DubboRouter } from "@apachedubbo/dubbo";

    
 import { ExampleService } from "./gen/example_dubbo";
    
  
    
 export default (router: DubboRouter) =>
    
   // registers apache.dubbo.demo.example.v1
    
   router.service(ExampleService, {
    
     // implements rpc Say
    
     async say(req) {
    
       return {
    
     sentence: `You said: ${req.sentence}`,
    
       };
    
     },
    
   }, { serviceGroup: 'dubbo', serviceVersion: '1.0.0' });

启动 Server

Dubbo服务能够集成到普通的Node.js服务器、Next.js、Express或Fastify中。因此,我们需要安装Fastify及其专门为此服务编写的插件。

复制代码
    npm install fastify @apachedubbo/dubbo-fastify

生成一个名为 server.ts 的文件,新增一个 Server 类,并将上一步中实现的 ExampleService 注册到该 Server 对象中。

接下来就可以直接初始化和启动 Server 了,它将在指定的端口接收请求。

复制代码
 import { fastify } from "fastify";

    
 import { fastifyDubboPlugin } from "@apachedubbo/dubbo-fastify";
    
 import routes from "./dubbo";
    
  
    
 async function main() {
    
   const server = fastify();
    
   await server.register(fastifyDubboPlugin, {
    
     routes,
    
   });
    
   server.get("/", (_, reply) => {
    
     reply.type("text/plain");
    
     reply.send("Hello World!");
    
   });
    
   await server.listen({ host: "localhost", port: 8080 });
    
   console.log("server is listening at", server.addresses());
    
 }
    
  
    
 void main();

最后,运行代码启动服务。

复制代码
    npx tsx server.ts

访问服务

最简单的操作是通过 HTTP/1.1 POST 请求访问服务,参数则采用标准 JSON 格式作为 HTTP 载体传输。以下展示了通过 cURL 命令进行访问的示例:

复制代码
 curl \

    
  --header 'Content-Type: application/json' \
    
  --header 'TRI-Service-Version: 1.0.0' \
    
  --header 'TRI-Service-group: dubbo' \
    
  --data '{"sentence": "Hello World"}' \
    
  http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say

除了标准的 Dubbo 客户端之外,我们还可以通过源代码即 dubbo-node 包获取服务代理。为了实现这一目标,首先需要从该源代码中获取服务代理,然后为它配置服务器地址并进行初始化。这样可以方便地发起 RPC 调用。

创建 client.ts 文件。

复制代码
 import { createPromiseClient } from "@apachedubbo/dubbo";

    
 import { ExampleService } from "./gen/example_dubbo";
    
 import { createDubboTransport } from "@apachedubbo/dubbo-node";
    
  
    
 const transport = createDubboTransport({
    
   baseUrl: "http://localhost:8080",
    
   httpVersion: "1.1",
    
 });
    
  
    
 async function main() {
    
   const client = createPromiseClient(ExampleService, transport, { serviceVersion: '1.0.0', serviceGroup: 'dubbo' });
    
   const res = await client.say({ sentence: "Hello World" });
    
   console.log(res);
    
 }
    
 void main();

运行客户端:

复制代码
    npx tsx client.ts

总结

当前 Node.js 版本主要支持了 Triple 协议的完整实现,未来版本中,社区将致力于提升多个服务治理能力。

相关链接:

[1] apache/dubbo

{https://github.com/apache/dubbo}作为Apache Dubbo的官方GitHub存储。

{https://github.com/apache/dubbo}作为Apache Dubbo的官方GitHub存储。

[2] apache/dubbo-go

https://github.com/apache/dubbo-go

[3] apache/dubbo-js

https://github.com/apache/dubbo-js

[4] apache/dubbo-rust

https://github.com/apache/dubbo-rust

作者:蔡建怿

马上体验云产品套餐,开启您的云上探索之旅!](https://click.aliyun.com/m/1000373503/ "马上体验云产品套餐,踏上云上探索之旅!")

原文链接

本文为阿里云原创内容,未经允许不得转载。

全部评论 (0)

还没有任何评论哟~