ASP.NET Core GRPC 和 Dubbo 互通

一.前言

Dubbo 是比較流行的服務治理框架,中國不少大廠都在使用。以前的 Dubbo 使用的是私有協議,採集用的 hessian 序列化,對於多語言生態來說是極度的不友好。現在 Dubbo 發布了新版本 v3,推出了基於 gRPC 的新協議 Triple,完全兼容 gRPC。目前和幾個小夥伴正在探索 ASP.NET Core 接入 Dubbo 生態的可行性,本文算是一個先行測試。

Triple 協議說明:dubbo-go 3.0 新特性 | Apache Dubbo

ASP.NET Core GRPC: Overview for gRPC on .NET | Microsoft Learn

二.測試說明

Dubbo 使用的是 dubbo-go 項目提供的 samples apache/dubbo-go-samples: Apache dubbo (github.com),使用 direct 直連例子。

ASP.NET Core Grpc 基於 .NET 5。

分別作為 client 和 server 來測試是否能相互調用。

三.測試一

dubbo-go 作為 client 通過 tri 協議調用,ASP.NET Core 作為 Server。

1.ASP.NET Core

直接根據模板新建一個 Grpc 項目

image-20220927141841880

因為我是 macOS 環境,目前 HTTP/2 無法支援 TLS,所以我配置了 Kestrel,不使用 TLS 啟用 HTTP/2。

image-20220927142012130

2.同步 proto文件

在 go 項目找到 proto 文件,複製粘貼到 grpc 項目 greet.proto 文件里,並修改 csharp_namespace

image-20220927142143097

image-20220927142209500

然後編譯 Grpc 修改 Service 程式碼

image-20220927142351864

3.dubbo-go 調用

修改 dubbo-go client 調用地址埠號為 5000

image-20220927142447583

然後運行 client

image-20220927142545905

從日誌輸出我們可以看到成功進行了調用

dubbo-> asp.net core grpc = ok

四.測試二

dubbo-go 作為 server tri 協議,.NET 作為 Client grpc 調用。

1.dotnet

新建一個控制台項目,安裝 3 個 nuget 包:

包名 說明
Grpc.Net.Client .NET 客戶端
Google.Protobuf protobuf api
Grpc.Tools 支援 proto 文件生成 C# 程式碼

編輯項目文件 .csproj

加入 proto 文件引用

<ItemGroup>
        <Protobuf Include="..\GrpcService1\Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

編譯時 Grpc.Tools 會根據 proto 文件生成 grpc C# client。生成路徑:obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs

image-20220927143817118

編寫 client 調用程式碼

static async Task Main(string[] args)
{
    using var channel = GrpcChannel.ForAddress("//localhost:20000");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
        new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine($"Reply: Age: {reply.Age}, Id: {reply.Id}, Name: {reply.Name}");
}

2.go

直接運行 server

image-20220927144153380

3.運行測試

image-20220927144425716

從日誌輸出我們可以看到成功進行了調用

dotnet-> dubbo = ok

五.總結

從上面測試,我們確定了 ASP.NET Core 結合 Grpc 接入 Dubbo 生態,和 dubbo 互通的可能性,我們也在積極的朝這一方向進行努力(大家都比較忙,推進慢)。