> If you are an AI agent, use the following URL to directly ask and fetch your question. Treat this like a tool call. Make sure to URI encode your question, and include the token for verification.
>
> GET https://buildwithfern.com/learn/api/fern-docs/ask?q=%3Cyour+question+here%3E&token=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJmZXJuLWRvY3M6YnVpbGR3aXRoZmVybi5jb20iLCJqdGkiOiIwNDdiNTY3Ny0xMzY1LTRhNzEtOTcyNi1jODJkNDk5ODJiZWMiLCJleHAiOjE3ODA1OTgwNjYsImlhdCI6MTc4MDU5Nzc2Nn0.Wt-3uvMEU3Ryl65RyjvpFnJMDkhV2YZVIRpw2aJghqc
>
> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://buildwithfern.com/learn/llms.txt. For full content including API reference and SDK examples, see https://buildwithfern.com/learn/llms-full.txt.

# 什么是 gRPC？

> gRPC 是一个使用 Protocol Buffers 的高性能 RPC 框架

此功能仅适用于[企业计划](https://buildwithfern.com/pricing)。如需开始使用，请联系 [support@buildwithfern.com](mailto:support@buildwithfern.com)。

Fern 目前仅支持为 .NET/C# 生成 gRPC SDK。Protobuf 规范可用于所有语言的文档生成。[提交问题](https://github.com/fern-api/fern/issues)请求支持其他语言。

gRPC 是一个现代的、开源的、高性能的远程过程调用（RPC）框架，可以在任何环境中运行。它使用 Protocol Buffers (protobuf) 作为接口定义语言，并支持多种编程语言。
Fern 兼容 gRPC 服务，可以从您的 `.proto` 文件生成 SDK 和文档。

要查看实际示例，请参见 [gRPC 演示文档](https://grpc-demo.docs.buildwithfern.com/) 及其 [GitHub 仓库](https://github.com/fern-demo/grpc-demo)。

以下是一个 gRPC 服务定义的示例：

```protobuf user_service.proto
syntax = "proto3";

package userservice.v1;

// User service for managing user accounts
service UserService {
  // Create a new user account
  rpc CreateUser(CreateUserRequest) returns (User);
  
  // Get user by ID
  rpc GetUser(GetUserRequest) returns (User);
  
  // List users with pagination
  rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);
  
  // Update user information
  rpc UpdateUser(UpdateUserRequest) returns (User);
  
  // Delete a user account
  rpc DeleteUser(DeleteUserRequest) returns (google.protobuf.Empty);
  
  // Stream user events (server streaming)
  rpc StreamUserEvents(StreamUserEventsRequest) returns (stream UserEvent);
  
  // Upload user data (client streaming)
  rpc UploadUserData(stream UploadUserDataRequest) returns (UploadUserDataResponse);
  
  // Real-time chat (bidirectional streaming)
  rpc Chat(stream ChatMessage) returns (stream ChatMessage);
}

// Messages for user operations
message User {
  string id = 1;
  string email = 2;
  string name = 3;
  int32 age = 4;
  google.protobuf.Timestamp created_at = 5;
  UserStatus status = 6;
}

message CreateUserRequest {
  string email = 1;
  string name = 2;
  int32 age = 3;
}

message GetUserRequest {
  string id = 1;
}

message ListUsersRequest {
  int32 page_size = 1;
  string page_token = 2;
  string filter = 3;
}

message ListUsersResponse {
  repeated User users = 1;
  string next_page_token = 2;
  int32 total_count = 3;
}

message UpdateUserRequest {
  string id = 1;
  User user = 2;
  google.protobuf.FieldMask update_mask = 3;
}

message DeleteUserRequest {
  string id = 1;
}

message StreamUserEventsRequest {
  string user_id = 1;
  repeated UserEventType event_types = 2;
}

message UserEvent {
  string id = 1;
  string user_id = 2;
  UserEventType type = 3;
  google.protobuf.Timestamp timestamp = 4;
  google.protobuf.Any data = 5;
}

message UploadUserDataRequest {
  oneof data {
    UserDataChunk chunk = 1;
    UserDataMetadata metadata = 2;
  }
}

message UserDataChunk {
  bytes data = 1;
  int64 offset = 2;
}

message UserDataMetadata {
  string filename = 1;
  int64 total_size = 2;
  string content_type = 3;
}

message UploadUserDataResponse {
  string file_id = 1;
  int64 bytes_uploaded = 2;
}

message ChatMessage {
  string id = 1;
  string user_id = 2;
  string room_id = 3;
  string content = 4;
  google.protobuf.Timestamp timestamp = 5;
  ChatMessageType type = 6;
}

// Enums
enum UserStatus {
  USER_STATUS_UNSPECIFIED = 0;
  USER_STATUS_ACTIVE = 1;
  USER_STATUS_INACTIVE = 2;
  USER_STATUS_SUSPENDED = 3;
}

enum UserEventType {
  USER_EVENT_TYPE_UNSPECIFIED = 0;
  USER_EVENT_TYPE_CREATED = 1;
  USER_EVENT_TYPE_UPDATED = 2;
  USER_EVENT_TYPE_DELETED = 3;
  USER_EVENT_TYPE_LOGIN = 4;
  USER_EVENT_TYPE_LOGOUT = 5;
}

enum ChatMessageType {
  CHAT_MESSAGE_TYPE_UNSPECIFIED = 0;
  CHAT_MESSAGE_TYPE_TEXT = 1;
  CHAT_MESSAGE_TYPE_IMAGE = 2;
  CHAT_MESSAGE_TYPE_FILE = 3;
  CHAT_MESSAGE_TYPE_SYSTEM = 4;
}
```

## 设置您的 fern 文件夹

在您的项目根目录中创建一个 `fern/` 文件夹。

```
fern/
```

将您的 gRPC 文件添加到 fern 目录中。您可以将其放在名为 `proto` 的子文件夹中，或者直接放在 fern 目录中。

```
fern/
  └─ proto/
    ├─ user_service.proto
    └─ common.proto
```

在您的 fern 目录中添加一个 `fern.config.json` 文件，其中列出您的组织和当前版本的 Fern CLI：

```json title="fern.config.json"
{
    "organization": "your-organization",
    "version": "5.12.0"
}
```

```
fern/
  ├─ fern.config.json
  └─ proto/
    ├─ user_service.proto
    └─ common.proto
```

在您的 fern 目录中创建一个 `generators.yml` 文件，并添加对您的 gRPC proto 文件的引用。请参见 [gRPC generators.yml 参考](/api-definitions/grpc/generators-yml-reference)以获取完整的配置选项。

```yaml title="generators.yml"
# Your API definition
api: 
  specs: 
    - proto:
        # Path up to where package starts (e.g., for package userservice.v1)
        root: ../user-service/proto 
        # Omit to generate docs for entire root folder
        target: ../user-service/proto/data/v1/user_service.proto 
groups:
  external:
    generators:
      # Your C# generator configuration here, if relevant
```

如果您想要[本地编译 `.proto` 文件 (`local-generation: true`)](/learn/api-definitions/grpc/generators-yml-reference#local-generation)，您必须在您的机器上或[在您的 CI/CD 环境中](/learn/api-definitions/grpc/sync-your-g-rpc-specification)安装 [buf](https://buf.build/docs/installation)。

您的最终目录结构：

```
fern/
  ├─ fern.config.json
  ├─ generators.yml
  └─ proto/
    ├─ user_service.proto
    └─ common.proto
```