Scala 语言 实战 Akka HTTP gRPC 服务开发 定义.proto 文件 + 服务实现

Scala阿木 发布于 3 天前 5 次阅读


实战 Akka HTTP gRPC 服务开发:Scala 语言下的实践

随着微服务架构的流行,服务之间的通信变得越来越重要。gRPC 是一个高性能、跨语言的 RPC 框架,它使用 Protocol Buffers 作为接口定义语言。Akka HTTP 是 Akka 框架的一部分,它提供了构建 HTTP 服务的强大工具。本文将围绕 Scala 语言,结合 Akka HTTP 和 gRPC,展示如何开发一个简单的 gRPC 服务。

准备工作

在开始之前,请确保您已经安装了以下工具:

- Scala 2.13.x 或更高版本
- sbt 1.5.x 或更高版本
- Akka HTTP 10.2.x 或更高版本
- gRPC 1.38.x 或更高版本

定义 .proto 文件

我们需要定义 gRPC 服务接口。创建一个名为 `hello.proto` 的文件,并添加以下内容:

proto
syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloServiceProto";

package hello;

// 定义一个简单的 gRPC 服务
service HelloService {
// 定义一个名为 "sayHello" 的 RPC 方法
rpc sayHello (HelloRequest) returns (HelloResponse);
}

// 定义请求和响应消息
message HelloRequest {
string name = 1;
}

message HelloResponse {
string message = 1;
}

编译 .proto 文件

使用 gRPC 提供的编译器将 `.proto` 文件编译成 Scala 代码。打开终端,执行以下命令:

bash
protoc --proto_path=. --scala_out=. --grpc_java_out=. hello.proto

这将生成两个 Scala 文件:`HelloServiceProto.scala` 和 `HelloServiceProtoGrpc.scala`。

创建 Akka HTTP 服务

接下来,我们将创建一个 Akka HTTP 服务来实现 gRPC 服务。创建一个名为 `HelloServiceApp` 的 Scala 项目,并添加以下依赖项到 `build.sbt` 文件中:

scala
name := "HelloServiceApp"

version := "0.1"

scalaVersion := "2.13.x"

libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-http" % "10.2.x",
"com.typesafe.akka" %% "akka-stream" % "10.2.x",
"com.typesafe.akka" %% "akka-actor" % "10.2.x",
"io.grpc" % "grpc-netty-shaded" % "1.38.x",
"io.grpc" % "grpc-protobuf" % "1.38.x",
"io.grpc" % "grpc-stub" % "1.38.x"
)

然后,创建一个名为 `HelloServiceApp` 的 Scala 类,并添加以下内容:

```scala
import scala.concurrent.ExecutionContextExecutor
import scala.concurrent.duration._
import com.example.grpc.HelloServiceProto._
import com.example.grpc.HelloServiceProtoGrpc._
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.StreamObserver
import io.grpc.stub.Stream