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/ "马上体验云产品套餐,踏上云上探索之旅!")
本文为阿里云原创内容,未经允许不得转载。
