dart grpc 试用

发布时间 2023-10-20 11:03:28作者: 荣锋亮

主要是体验下dart grpc 的集成试用,grpc 对于dart 的支持也是基于了插件生成代码,然后我们可以基于生成的代码创建实现,client 进行调用

参考项目

代码来自官方示例

  • proto 定义
syntax = "proto3";
 
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
 
package helloworld;
 
// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
 
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
 
// The response message containing the greetings
message HelloReply {
  string message = 1;
} 
  • 生成代码
    注意需要安装protoc 以及 dart grpc 扩展dart pub global activate protoc_plugin
 
protoc --dart_out=grpc:lib/src/generated -Iprotos protos/helloworld.proto
  • 效果

 

  • server 实现
    server.dart
 
import 'package:grpc/grpc.dart';
import 'package:helloworld/src/generated/helloworld.pbgrpc.dart';
 
// 实现
class GreeterService extends GreeterServiceBase {
  @override
  Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
    return HelloReply()..message = 'Hello, ${request.name}!';
  }
}
// 服务启动
Future<void> main(List<String> args) async {
  final server = Server.create(
    services: [GreeterService()],
    codecRegistry: CodecRegistry(codecs: const [GzipCodec(), IdentityCodec()]),
  );
  await server.serve(port: 50051);
  print('Server listening on port ${server.port}...');
}
  • client 实现
    client.dart
 
import 'package:grpc/grpc.dart';
import 'package:helloworld/src/generated/helloworld.pbgrpc.dart';
 
Future<void> main(List<String> args) async {
  // channel  创建
  final channel = ClientChannel(
    'localhost',
    port: 50051,
    options: ChannelOptions(
      credentials: ChannelCredentials.insecure(),
      codecRegistry:
          CodecRegistry(codecs: const [GzipCodec(), IdentityCodec()]),
    ),
  );
  // client stub
  final stub = GreeterClient(channel);
 
  final name = args.isNotEmpty ? args[0] : 'world';
 
  try {
    final response = await stub.sayHello(
      HelloRequest()..name = name,
      options: CallOptions(compression: const GzipCodec()),
    );
    print('Greeter client received: ${response.message}');
  } catch (e) {
    print('Caught error: $e');
  }
  await channel.shutdown();
}

说明

对于一些业务系统(比如基于flutter 开发的桌面应用基于dart grpc 进行数据通信也是一个不错的选择),当然buf 基于protobuf 的connect
协议也是一个不错的选择

参考资料

https://connectrpc.com/
https://github.com/grpc/grpc-dart
https://pub.dev/packages/grpc/install
https://buf.build/
https://grpc.io/docs/languages/dart/quickstart/
https://github.com/grpc/grpc-web