This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory-site.git
The following commit(s) were added to refs/heads/main by this push:
new d47d97f160 Clarify Python gRPC channel configuration (#471)
d47d97f160 is described below
commit d47d97f16055e47021f517bca194d04975a914bc
Author: Shawn Yang <[email protected]>
AuthorDate: Tue Jun 16 21:22:16 2026 +0530
Clarify Python gRPC channel configuration (#471)
---
docs/guide/python/grpc-support.md | 37 +++++++++++------
.../current/guide/go/grpc-support.md | 10 ++---
.../current/guide/java/grpc-support.md | 16 ++++----
.../current/guide/javascript/grpc-support.md | 12 +++---
.../current/guide/kotlin/grpc-support.md | 14 +++----
.../current/guide/python/grpc-support.md | 46 ++++++++++++++--------
.../current/guide/rust/grpc-support.md | 10 ++---
.../version-1.2.0/guide/go/grpc-support.md | 10 ++---
.../version-1.2.0/guide/java/grpc-support.md | 16 ++++----
.../version-1.2.0/guide/javascript/grpc-support.md | 12 +++---
.../version-1.2.0/guide/kotlin/grpc-support.md | 14 +++----
.../version-1.2.0/guide/python/grpc-support.md | 46 ++++++++++++++--------
.../version-1.2.0/guide/rust/grpc-support.md | 10 ++---
.../version-1.2.0/guide/python/grpc-support.md | 37 +++++++++++------
14 files changed, 172 insertions(+), 118 deletions(-)
diff --git a/docs/guide/python/grpc-support.md
b/docs/guide/python/grpc-support.md
index 946602be30..cdcff92243 100644
--- a/docs/guide/python/grpc-support.md
+++ b/docs/guide/python/grpc-support.md
@@ -29,11 +29,13 @@ encoding. Use standard protobuf gRPC code generation when
clients or tools must
consume protobuf message bytes directly.
Generated Python companions currently target the synchronous `grpcio` API. Use
-regular `def` servicer methods, `grpc.server(...)`,
`grpc.insecure_channel(...)`,
-and Python iterators or generators for streaming RPCs. The compiler does not
+regular `def` servicer methods, `grpc.server(...)`, standard `grpc.Channel`
+instances, and Python iterators or generators for streaming RPCs. The generated
+stub accepts any channel configured by your application. The compiler does not
generate `grpc.aio` stubs or service bases, so do not implement generated
servicer methods as `async def` unless you add a custom adapter outside the
-generated companion.
+generated companion. Python gRPC async support based on `grpc.aio` will be
+available in the next Fory release.
## Install Dependencies
@@ -119,7 +121,8 @@ so service implementations do not perform manual Fory
registration.
## Create a Client
-Use the generated stub with a normal `grpcio` channel:
+Use the generated stub with a normal `grpcio` channel. Production clients
+usually pass a TLS/auth-configured channel:
```python
import grpc
@@ -129,7 +132,8 @@ import demo_greeter_grpc
def main():
- with grpc.insecure_channel("localhost:50051") as channel:
+ credentials = grpc.ssl_channel_credentials()
+ with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
reply = stub.say_hello(demo_greeter.HelloRequest(name="Fory"))
print(reply.reply)
@@ -139,6 +143,14 @@ if __name__ == "__main__":
main()
```
+For local tests and development, an insecure channel can be used explicitly:
+
+```python
+# Test-only channel. Use a TLS/auth-configured grpc.Channel in production.
+with grpc.insecure_channel("localhost:50051") as channel:
+ stub = demo_greeter_grpc.GreeterStub(channel)
+```
+
`grpcio` still owns channel options, credentials, deadlines, metadata, retries,
and interceptors.
@@ -158,12 +170,12 @@ service Greeter {
Generated Python code follows `grpcio` conventions:
-| IDL shape | Servicer method shape
| Stub method shape |
-| ----------------------------------------- |
------------------------------------------- |
---------------------------------- |
-| `rpc A (Req) returns (Res)` | returns one response object
| returns one response object |
-| `rpc A (Req) returns (stream Res)` | yields response objects
| returns an iterator of responses |
-| `rpc A (stream Req) returns (Res)` | consumes an iterator and returns
a response | accepts an iterator of requests |
-| `rpc A (stream Req) returns (stream Res)` | consumes and yields iterators
| accepts and returns iterators |
+| IDL shape | Servicer method shape
| Stub method shape |
+| ----------------------------------------- |
------------------------------------------- | -------------------------------- |
+| `rpc A (Req) returns (Res)` | returns one response object
| returns one response object |
+| `rpc A (Req) returns (stream Res)` | yields response objects
| returns an iterator of responses |
+| `rpc A (stream Req) returns (Res)` | consumes an iterator and returns
a response | accepts an iterator of requests |
+| `rpc A (stream Req) returns (stream Res)` | consumes and yields iterators
| accepts and returns iterators |
Servicer methods use snake_case names, while generated descriptors preserve the
exact IDL service and method names for the gRPC path.
@@ -188,7 +200,8 @@ class Greeter(demo_greeter_grpc.GreeterServicer):
Generated clients use the standard `grpcio` streaming call shapes:
```python
-with grpc.insecure_channel("localhost:50051") as channel:
+credentials = grpc.ssl_channel_credentials()
+with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
for reply in stub.lots_of_replies(
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/go/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/go/grpc-support.md
index 16a4422639..d8cdd580bb 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/go/grpc-support.md
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/go/grpc-support.md
@@ -68,9 +68,9 @@ foryc service.fdl --go_out=./generated/go --grpc
输出包含:
-| 文件 | 用途 |
-| ------------------------------ | ------------------------------------ |
-| `greeter/demo_greeter.go` | Fory model 类型和注册辅助逻辑 |
+| 文件 | 用途 |
+| ------------------------------ | ----------------------------------------- |
+| `greeter/demo_greeter.go` | Fory model 类型和注册辅助逻辑 |
| `greeter/demo_greeter_grpc.go` | grpc-go client、server interface 和 codec |
生成的 Go 方法使用导出的 PascalCase 名称,例如 `SayHello`。底层 gRPC method path 保留
@@ -175,10 +175,10 @@ Fory service 支持 unary、server-streaming、client-streaming 和
bidirectiona
- Bidirectional streaming 使用生成的 stream client/server interface。
- 每个 message frame 都使用生成 codec。
-## 运维语义
+## Service 行为
生成的 service companion 只提供 Fory 序列化。deadline、取消、TLS、credential、unary/stream
-interceptor、status code、metadata、名称解析、负载均衡、连接生命周期和 backoff 都保持标准 grpc-go 行为。
+interceptor、status code、metadata、名称解析、负载均衡、连接生命周期和 backoff 等 Service 行为都遵循标准
grpc-go。
## 故障排查
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/java/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/java/grpc-support.md
index 77ac4ff649..23ede2278f 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/java/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/java/grpc-support.md
@@ -190,12 +190,12 @@ service Greeter {
生成 Java service 方法遵循 grpc-java 约定:
-| IDL shape | Server 方法形态
| Client 方法形态 |
-| ----------------------------------------- |
------------------------------------------------------- |
---------------------------------- |
-| `rpc A (Req) returns (Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking、async、future unary stub |
-| `rpc A (Req) returns (stream Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking iterator 或 async observer |
-| `rpc A (stream Req) returns (Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
-| `rpc A (stream Req) returns (stream Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
+| IDL shape | Server 方法形态
| Client 方法形态 |
+| ----------------------------------------- |
------------------------------------------------------ |
----------------------------------- |
+| `rpc A (Req) returns (Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking、async、future unary stub |
+| `rpc A (Req) returns (stream Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking iterator 或 async observer |
+| `rpc A (stream Req) returns (Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
+| `rpc A (stream Req) returns (stream Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
Server 可以直接实现生成的 streaming 方法:
@@ -354,9 +354,9 @@ final class StreamingClient {
生成 descriptor 会保留 IDL 中的 service 和 method 名称作为 gRPC path。
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 grpc-java 提供:
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 grpc-java 提供:
- Deadline 和取消
- TLS 和认证
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/javascript/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/javascript/grpc-support.md
index 261f310900..f0cde1f61c 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/javascript/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/javascript/grpc-support.md
@@ -88,11 +88,11 @@ foryc service.fdl --javascript_out=./generated/javascript
--grpc --grpc-web
输出包含:
-| 文件 | 用途 |
-| --------------------- | ------------------------------------- |
+| 文件 | 用途 |
+| --------------------- | --------------------------------------- |
| `service.ts` | interface、enum、union 和 schema helper |
-| `service_grpc.ts` | Node.js `@grpc/grpc-js` server/client |
-| `service_grpc_web.ts` | 浏览器 `grpc-web` client |
+| `service_grpc.ts` | Node.js `@grpc/grpc-js` server/client |
+| `service_grpc_web.ts` | 浏览器 `grpc-web` client |
## 实现 Node.js Server
@@ -278,9 +278,9 @@ stream.on("end", () => {
});
```
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 transport package
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 transport
package
提供:
- TLS 和 credential
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/kotlin/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/kotlin/grpc-support.md
index d2e81792d3..89cc9893f2 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/kotlin/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/kotlin/grpc-support.md
@@ -151,12 +151,12 @@ service Greeter {
Streaming RPC 使用 `kotlinx.coroutines.flow.Flow`。
-| IDL shape | Server 方法
| Client 方法 |
-| ----------------------------------------- |
---------------------------------------- |
---------------------------------------- |
-| `rpc A (Req) returns (Res)` | `suspend fun a(request: Req):
Res` | `suspend fun a(request: Req): Res` |
-| `rpc A (Req) returns (stream Res)` | `fun a(request: Req): Flow<Res>`
| `fun a(request: Req): Flow<Res>` |
+| IDL shape | Server 方法
| Client 方法 |
+| ----------------------------------------- |
----------------------------------------- |
----------------------------------------- |
+| `rpc A (Req) returns (Res)` | `suspend fun a(request: Req):
Res` | `suspend fun a(request: Req): Res` |
+| `rpc A (Req) returns (stream Res)` | `fun a(request: Req): Flow<Res>`
| `fun a(request: Req): Flow<Res>` |
| `rpc A (stream Req) returns (Res)` | `suspend fun a(requests:
Flow<Req>): Res` | `suspend fun a(requests: Flow<Req>): Res` |
-| `rpc A (stream Req) returns (stream Res)` | `fun a(requests: Flow<Req>):
Flow<Res>` | `fun a(requests: Flow<Req>): Flow<Res>` |
+| `rpc A (stream Req) returns (stream Res)` | `fun a(requests: Flow<Req>):
Flow<Res>` | `fun a(requests: Flow<Req>): Flow<Res>` |
生成 method path 保留 schema 中的 service 和 method 名称,例如
`/demo.greeter.Greeter/SayHello`。
@@ -219,9 +219,9 @@ stub.chat(
}
```
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 grpc-java 和
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 grpc-java 和
grpc-kotlin 提供:
- Deadline 和取消
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/python/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/python/grpc-support.md
index a144babf3f..0ee9beb11e 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/python/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/python/grpc-support.md
@@ -27,9 +27,10 @@ Fory 可以为包含 service 定义的 schema 生成 Python gRPC companion modul
message bytes,请使用标准 protobuf gRPC 代码生成。
当前生成的 Python companion 面向同步 `grpcio` API。请使用普通 `def` servicer 方法、
-`grpc.server(...)`、`grpc.insecure_channel(...)`,并用 Python iterator/generator 处理
-streaming RPC。Compiler 不会生成 `grpc.aio` stub 或 service base,因此不要把生成 servicer
-方法实现成 `async def`,除非你在生成 companion 外自行封装 adapter。
+`grpc.server(...)`、标准 `grpc.Channel` 实例,并用 Python iterator/generator 处理
streaming RPC。
+生成的 stub 可以接收应用自行配置的任意 channel。Compiler 不会生成 `grpc.aio` stub 或 service
+base,因此不要把生成 servicer 方法实现成 `async def`,除非你在生成 companion 外自行封装 adapter。
+基于 `grpc.aio` 的 Python gRPC async 支持将在下一个 Fory 版本提供。
## 添加依赖
@@ -66,9 +67,9 @@ foryc service.fdl --python_out=./generated/python --grpc
该 schema 会生成:
-| 文件 | 用途 |
-| ---------------------- | --------------------------------- |
-| `demo_greeter.py` | Fory dataclass 和注册辅助逻辑 |
+| 文件 | 用途 |
+| ---------------------- | --------------------------------------- |
+| `demo_greeter.py` | Fory dataclass 和注册辅助逻辑 |
| `demo_greeter_grpc.py` | `grpcio` stub、servicer base 和注册函数 |
Module 名称来自 Fory package,点号会替换成下划线;没有 package 的 schema 使用 `generated.py` 和
@@ -104,6 +105,8 @@ if __name__ == "__main__":
## 创建 Client
+使用生成的 stub 和普通 `grpcio` channel。生产 client 通常传入配置了 TLS/认证的 channel:
+
```python
import grpc
@@ -112,7 +115,8 @@ import demo_greeter_grpc
def main():
- with grpc.insecure_channel("localhost:50051") as channel:
+ credentials = grpc.ssl_channel_credentials()
+ with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
reply = stub.say_hello(demo_greeter.HelloRequest(name="Fory"))
print(reply.reply)
@@ -122,6 +126,15 @@ if __name__ == "__main__":
main()
```
+本地测试和开发可以显式使用 insecure channel:
+
+```python
+# 仅用于本地测试和开发。
+# 生产环境请使用配置了 TLS/认证的 grpc.Channel。
+with grpc.insecure_channel("localhost:50051") as channel:
+ stub = demo_greeter_grpc.GreeterStub(channel)
+```
+
Channel、credential、deadline、metadata、interceptor、retry 和 server lifecycle 都保持
`grpcio`
行为。
@@ -140,12 +153,12 @@ service Greeter {
生成 Python companion 遵循 `grpcio` 的 iterator/generator 约定:
-| IDL shape | Servicer 方法形态
| Stub 方法形态 |
-| ----------------------------------------- |
----------------------------------------- | ------------------------- |
-| `rpc A (Req) returns (Res)` | 返回一个 response 对象
| 返回一个 response 对象 |
-| `rpc A (Req) returns (stream Res)` | yield 多个 response 对象
| 返回 response iterator |
-| `rpc A (stream Req) returns (Res)` | 消费 request iterator 并返回一个
response | 接收 request iterator |
-| `rpc A (stream Req) returns (stream Res)` | 消费 request iterator 并 yield
response | 接收并返回 iterator |
+| IDL shape | Servicer 方法形态
| Stub 方法形态 |
+| ----------------------------------------- |
----------------------------------------- | ---------------------- |
+| `rpc A (Req) returns (Res)` | 返回一个 response 对象
| 返回一个 response 对象 |
+| `rpc A (Req) returns (stream Res)` | yield 多个 response 对象
| 返回 response iterator |
+| `rpc A (stream Req) returns (Res)` | 消费 request iterator 并返回一个
response | 接收 request iterator |
+| `rpc A (stream Req) returns (stream Res)` | 消费 request iterator 并 yield
response | 接收并返回 iterator |
Servicer 方法使用 snake_case 名称;生成 descriptor 会保留 IDL 中的 service 和 method 名称作为
gRPC path。每个 message frame 都通过 Fory serializer/deserializer 编码。
@@ -170,7 +183,8 @@ class Greeter(demo_greeter_grpc.GreeterServicer):
生成的 client 使用标准 `grpcio` streaming 调用形态:
```python
-with grpc.insecure_channel("localhost:50051") as channel:
+credentials = grpc.ssl_channel_credentials()
+with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
for reply in stub.lots_of_replies(
@@ -193,9 +207,9 @@ with grpc.insecure_channel("localhost:50051") as channel:
print(reply.reply)
```
-## 运维语义
+## Service 行为
-生成的 service companion 只提供 Fory serialization callback。运维行为仍遵循标准 `grpcio`:
+生成的 service companion 只提供 Fory serialization callback。Service 行为仍遵循标准 `grpcio`:
- Deadline 和取消
- TLS 和认证 credential
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/rust/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/rust/grpc-support.md
index b6c603b61f..de234fbd4a 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/rust/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/rust/grpc-support.md
@@ -71,10 +71,10 @@ foryc service.fdl --rust_out=./generated/rust --grpc
该 schema 会生成:
-| 文件 | 用途 |
-| ------------------------------ | ----------------------------------- |
-| `demo_greeter.rs` | Fory model 类型和注册辅助逻辑 |
-| `demo_greeter_service.rs` | 异步 service trait 与 gRPC path 常量 |
+| 文件 | 用途 |
+| ------------------------------ | ------------------------------------------ |
+| `demo_greeter.rs` | Fory model 类型和注册辅助逻辑 |
+| `demo_greeter_service.rs` | 异步 service trait 与 gRPC path 常量 |
| `demo_greeter_service_grpc.rs` | tonic client、server wrapper 和 Fory codec |
将生成文件加入 crate root:
@@ -283,7 +283,7 @@ while let Some(reply) = chat.message().await? {
Rust gRPC payload 必须满足 `Send + 'static`,这样 tonic 才能在线程间移动 request/response。
如果 request 或 response schema 使用非线程安全的引用元信息,Rust gRPC 生成会拒绝该 service。
-## 运维语义
+## Service 行为
生成的 service companion 只提供 Fory 序列化和 tonic binding。deadline、取消、TLS、认证、
Tower middleware、interceptor、status code、metadata、channel/server 生命周期和
backpressure
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/go/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/go/grpc-support.md
index 16a4422639..d8cdd580bb 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/go/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/go/grpc-support.md
@@ -68,9 +68,9 @@ foryc service.fdl --go_out=./generated/go --grpc
输出包含:
-| 文件 | 用途 |
-| ------------------------------ | ------------------------------------ |
-| `greeter/demo_greeter.go` | Fory model 类型和注册辅助逻辑 |
+| 文件 | 用途 |
+| ------------------------------ | ----------------------------------------- |
+| `greeter/demo_greeter.go` | Fory model 类型和注册辅助逻辑 |
| `greeter/demo_greeter_grpc.go` | grpc-go client、server interface 和 codec |
生成的 Go 方法使用导出的 PascalCase 名称,例如 `SayHello`。底层 gRPC method path 保留
@@ -175,10 +175,10 @@ Fory service 支持 unary、server-streaming、client-streaming 和
bidirectiona
- Bidirectional streaming 使用生成的 stream client/server interface。
- 每个 message frame 都使用生成 codec。
-## 运维语义
+## Service 行为
生成的 service companion 只提供 Fory 序列化。deadline、取消、TLS、credential、unary/stream
-interceptor、status code、metadata、名称解析、负载均衡、连接生命周期和 backoff 都保持标准 grpc-go 行为。
+interceptor、status code、metadata、名称解析、负载均衡、连接生命周期和 backoff 等 Service 行为都遵循标准
grpc-go。
## 故障排查
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/java/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/java/grpc-support.md
index 77ac4ff649..23ede2278f 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/java/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/java/grpc-support.md
@@ -190,12 +190,12 @@ service Greeter {
生成 Java service 方法遵循 grpc-java 约定:
-| IDL shape | Server 方法形态
| Client 方法形态 |
-| ----------------------------------------- |
------------------------------------------------------- |
---------------------------------- |
-| `rpc A (Req) returns (Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking、async、future unary stub |
-| `rpc A (Req) returns (stream Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking iterator 或 async observer |
-| `rpc A (stream Req) returns (Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
-| `rpc A (stream Req) returns (stream Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
+| IDL shape | Server 方法形态
| Client 方法形态 |
+| ----------------------------------------- |
------------------------------------------------------ |
----------------------------------- |
+| `rpc A (Req) returns (Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking、async、future unary stub |
+| `rpc A (Req) returns (stream Res)` | `void a(Req request,
StreamObserver<Res> responses)` | blocking iterator 或 async observer |
+| `rpc A (stream Req) returns (Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
+| `rpc A (stream Req) returns (stream Res)` | `StreamObserver<Req>
a(StreamObserver<Res> responses)` | async request observer |
Server 可以直接实现生成的 streaming 方法:
@@ -354,9 +354,9 @@ final class StreamingClient {
生成 descriptor 会保留 IDL 中的 service 和 method 名称作为 gRPC path。
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 grpc-java 提供:
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 grpc-java 提供:
- Deadline 和取消
- TLS 和认证
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/javascript/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/javascript/grpc-support.md
index 261f310900..f0cde1f61c 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/javascript/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/javascript/grpc-support.md
@@ -88,11 +88,11 @@ foryc service.fdl --javascript_out=./generated/javascript
--grpc --grpc-web
输出包含:
-| 文件 | 用途 |
-| --------------------- | ------------------------------------- |
+| 文件 | 用途 |
+| --------------------- | --------------------------------------- |
| `service.ts` | interface、enum、union 和 schema helper |
-| `service_grpc.ts` | Node.js `@grpc/grpc-js` server/client |
-| `service_grpc_web.ts` | 浏览器 `grpc-web` client |
+| `service_grpc.ts` | Node.js `@grpc/grpc-js` server/client |
+| `service_grpc_web.ts` | 浏览器 `grpc-web` client |
## 实现 Node.js Server
@@ -278,9 +278,9 @@ stream.on("end", () => {
});
```
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 transport package
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 transport
package
提供:
- TLS 和 credential
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/kotlin/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/kotlin/grpc-support.md
index d2e81792d3..89cc9893f2 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/kotlin/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/kotlin/grpc-support.md
@@ -151,12 +151,12 @@ service Greeter {
Streaming RPC 使用 `kotlinx.coroutines.flow.Flow`。
-| IDL shape | Server 方法
| Client 方法 |
-| ----------------------------------------- |
---------------------------------------- |
---------------------------------------- |
-| `rpc A (Req) returns (Res)` | `suspend fun a(request: Req):
Res` | `suspend fun a(request: Req): Res` |
-| `rpc A (Req) returns (stream Res)` | `fun a(request: Req): Flow<Res>`
| `fun a(request: Req): Flow<Res>` |
+| IDL shape | Server 方法
| Client 方法 |
+| ----------------------------------------- |
----------------------------------------- |
----------------------------------------- |
+| `rpc A (Req) returns (Res)` | `suspend fun a(request: Req):
Res` | `suspend fun a(request: Req): Res` |
+| `rpc A (Req) returns (stream Res)` | `fun a(request: Req): Flow<Res>`
| `fun a(request: Req): Flow<Res>` |
| `rpc A (stream Req) returns (Res)` | `suspend fun a(requests:
Flow<Req>): Res` | `suspend fun a(requests: Flow<Req>): Res` |
-| `rpc A (stream Req) returns (stream Res)` | `fun a(requests: Flow<Req>):
Flow<Res>` | `fun a(requests: Flow<Req>): Flow<Res>` |
+| `rpc A (stream Req) returns (stream Res)` | `fun a(requests: Flow<Req>):
Flow<Res>` | `fun a(requests: Flow<Req>): Flow<Res>` |
生成 method path 保留 schema 中的 service 和 method 名称,例如
`/demo.greeter.Greeter/SayHello`。
@@ -219,9 +219,9 @@ stub.chat(
}
```
-## 运维语义
+## Service 行为
-生成的 service code 只替换 request/response 序列化。常规 gRPC 运维能力仍由 grpc-java 和
+生成的 service code 只替换 request/response 序列化。常规 gRPC service 行为仍由 grpc-java 和
grpc-kotlin 提供:
- Deadline 和取消
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/python/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/python/grpc-support.md
index a144babf3f..0ee9beb11e 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/python/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/python/grpc-support.md
@@ -27,9 +27,10 @@ Fory 可以为包含 service 定义的 schema 生成 Python gRPC companion modul
message bytes,请使用标准 protobuf gRPC 代码生成。
当前生成的 Python companion 面向同步 `grpcio` API。请使用普通 `def` servicer 方法、
-`grpc.server(...)`、`grpc.insecure_channel(...)`,并用 Python iterator/generator 处理
-streaming RPC。Compiler 不会生成 `grpc.aio` stub 或 service base,因此不要把生成 servicer
-方法实现成 `async def`,除非你在生成 companion 外自行封装 adapter。
+`grpc.server(...)`、标准 `grpc.Channel` 实例,并用 Python iterator/generator 处理
streaming RPC。
+生成的 stub 可以接收应用自行配置的任意 channel。Compiler 不会生成 `grpc.aio` stub 或 service
+base,因此不要把生成 servicer 方法实现成 `async def`,除非你在生成 companion 外自行封装 adapter。
+基于 `grpc.aio` 的 Python gRPC async 支持将在下一个 Fory 版本提供。
## 添加依赖
@@ -66,9 +67,9 @@ foryc service.fdl --python_out=./generated/python --grpc
该 schema 会生成:
-| 文件 | 用途 |
-| ---------------------- | --------------------------------- |
-| `demo_greeter.py` | Fory dataclass 和注册辅助逻辑 |
+| 文件 | 用途 |
+| ---------------------- | --------------------------------------- |
+| `demo_greeter.py` | Fory dataclass 和注册辅助逻辑 |
| `demo_greeter_grpc.py` | `grpcio` stub、servicer base 和注册函数 |
Module 名称来自 Fory package,点号会替换成下划线;没有 package 的 schema 使用 `generated.py` 和
@@ -104,6 +105,8 @@ if __name__ == "__main__":
## 创建 Client
+使用生成的 stub 和普通 `grpcio` channel。生产 client 通常传入配置了 TLS/认证的 channel:
+
```python
import grpc
@@ -112,7 +115,8 @@ import demo_greeter_grpc
def main():
- with grpc.insecure_channel("localhost:50051") as channel:
+ credentials = grpc.ssl_channel_credentials()
+ with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
reply = stub.say_hello(demo_greeter.HelloRequest(name="Fory"))
print(reply.reply)
@@ -122,6 +126,15 @@ if __name__ == "__main__":
main()
```
+本地测试和开发可以显式使用 insecure channel:
+
+```python
+# 仅用于本地测试和开发。
+# 生产环境请使用配置了 TLS/认证的 grpc.Channel。
+with grpc.insecure_channel("localhost:50051") as channel:
+ stub = demo_greeter_grpc.GreeterStub(channel)
+```
+
Channel、credential、deadline、metadata、interceptor、retry 和 server lifecycle 都保持
`grpcio`
行为。
@@ -140,12 +153,12 @@ service Greeter {
生成 Python companion 遵循 `grpcio` 的 iterator/generator 约定:
-| IDL shape | Servicer 方法形态
| Stub 方法形态 |
-| ----------------------------------------- |
----------------------------------------- | ------------------------- |
-| `rpc A (Req) returns (Res)` | 返回一个 response 对象
| 返回一个 response 对象 |
-| `rpc A (Req) returns (stream Res)` | yield 多个 response 对象
| 返回 response iterator |
-| `rpc A (stream Req) returns (Res)` | 消费 request iterator 并返回一个
response | 接收 request iterator |
-| `rpc A (stream Req) returns (stream Res)` | 消费 request iterator 并 yield
response | 接收并返回 iterator |
+| IDL shape | Servicer 方法形态
| Stub 方法形态 |
+| ----------------------------------------- |
----------------------------------------- | ---------------------- |
+| `rpc A (Req) returns (Res)` | 返回一个 response 对象
| 返回一个 response 对象 |
+| `rpc A (Req) returns (stream Res)` | yield 多个 response 对象
| 返回 response iterator |
+| `rpc A (stream Req) returns (Res)` | 消费 request iterator 并返回一个
response | 接收 request iterator |
+| `rpc A (stream Req) returns (stream Res)` | 消费 request iterator 并 yield
response | 接收并返回 iterator |
Servicer 方法使用 snake_case 名称;生成 descriptor 会保留 IDL 中的 service 和 method 名称作为
gRPC path。每个 message frame 都通过 Fory serializer/deserializer 编码。
@@ -170,7 +183,8 @@ class Greeter(demo_greeter_grpc.GreeterServicer):
生成的 client 使用标准 `grpcio` streaming 调用形态:
```python
-with grpc.insecure_channel("localhost:50051") as channel:
+credentials = grpc.ssl_channel_credentials()
+with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
for reply in stub.lots_of_replies(
@@ -193,9 +207,9 @@ with grpc.insecure_channel("localhost:50051") as channel:
print(reply.reply)
```
-## 运维语义
+## Service 行为
-生成的 service companion 只提供 Fory serialization callback。运维行为仍遵循标准 `grpcio`:
+生成的 service companion 只提供 Fory serialization callback。Service 行为仍遵循标准 `grpcio`:
- Deadline 和取消
- TLS 和认证 credential
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/rust/grpc-support.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/rust/grpc-support.md
index b6c603b61f..de234fbd4a 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/rust/grpc-support.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.2.0/guide/rust/grpc-support.md
@@ -71,10 +71,10 @@ foryc service.fdl --rust_out=./generated/rust --grpc
该 schema 会生成:
-| 文件 | 用途 |
-| ------------------------------ | ----------------------------------- |
-| `demo_greeter.rs` | Fory model 类型和注册辅助逻辑 |
-| `demo_greeter_service.rs` | 异步 service trait 与 gRPC path 常量 |
+| 文件 | 用途 |
+| ------------------------------ | ------------------------------------------ |
+| `demo_greeter.rs` | Fory model 类型和注册辅助逻辑 |
+| `demo_greeter_service.rs` | 异步 service trait 与 gRPC path 常量 |
| `demo_greeter_service_grpc.rs` | tonic client、server wrapper 和 Fory codec |
将生成文件加入 crate root:
@@ -283,7 +283,7 @@ while let Some(reply) = chat.message().await? {
Rust gRPC payload 必须满足 `Send + 'static`,这样 tonic 才能在线程间移动 request/response。
如果 request 或 response schema 使用非线程安全的引用元信息,Rust gRPC 生成会拒绝该 service。
-## 运维语义
+## Service 行为
生成的 service companion 只提供 Fory 序列化和 tonic binding。deadline、取消、TLS、认证、
Tower middleware、interceptor、status code、metadata、channel/server 生命周期和
backpressure
diff --git a/versioned_docs/version-1.2.0/guide/python/grpc-support.md
b/versioned_docs/version-1.2.0/guide/python/grpc-support.md
index 946602be30..cdcff92243 100644
--- a/versioned_docs/version-1.2.0/guide/python/grpc-support.md
+++ b/versioned_docs/version-1.2.0/guide/python/grpc-support.md
@@ -29,11 +29,13 @@ encoding. Use standard protobuf gRPC code generation when
clients or tools must
consume protobuf message bytes directly.
Generated Python companions currently target the synchronous `grpcio` API. Use
-regular `def` servicer methods, `grpc.server(...)`,
`grpc.insecure_channel(...)`,
-and Python iterators or generators for streaming RPCs. The compiler does not
+regular `def` servicer methods, `grpc.server(...)`, standard `grpc.Channel`
+instances, and Python iterators or generators for streaming RPCs. The generated
+stub accepts any channel configured by your application. The compiler does not
generate `grpc.aio` stubs or service bases, so do not implement generated
servicer methods as `async def` unless you add a custom adapter outside the
-generated companion.
+generated companion. Python gRPC async support based on `grpc.aio` will be
+available in the next Fory release.
## Install Dependencies
@@ -119,7 +121,8 @@ so service implementations do not perform manual Fory
registration.
## Create a Client
-Use the generated stub with a normal `grpcio` channel:
+Use the generated stub with a normal `grpcio` channel. Production clients
+usually pass a TLS/auth-configured channel:
```python
import grpc
@@ -129,7 +132,8 @@ import demo_greeter_grpc
def main():
- with grpc.insecure_channel("localhost:50051") as channel:
+ credentials = grpc.ssl_channel_credentials()
+ with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
reply = stub.say_hello(demo_greeter.HelloRequest(name="Fory"))
print(reply.reply)
@@ -139,6 +143,14 @@ if __name__ == "__main__":
main()
```
+For local tests and development, an insecure channel can be used explicitly:
+
+```python
+# Test-only channel. Use a TLS/auth-configured grpc.Channel in production.
+with grpc.insecure_channel("localhost:50051") as channel:
+ stub = demo_greeter_grpc.GreeterStub(channel)
+```
+
`grpcio` still owns channel options, credentials, deadlines, metadata, retries,
and interceptors.
@@ -158,12 +170,12 @@ service Greeter {
Generated Python code follows `grpcio` conventions:
-| IDL shape | Servicer method shape
| Stub method shape |
-| ----------------------------------------- |
------------------------------------------- |
---------------------------------- |
-| `rpc A (Req) returns (Res)` | returns one response object
| returns one response object |
-| `rpc A (Req) returns (stream Res)` | yields response objects
| returns an iterator of responses |
-| `rpc A (stream Req) returns (Res)` | consumes an iterator and returns
a response | accepts an iterator of requests |
-| `rpc A (stream Req) returns (stream Res)` | consumes and yields iterators
| accepts and returns iterators |
+| IDL shape | Servicer method shape
| Stub method shape |
+| ----------------------------------------- |
------------------------------------------- | -------------------------------- |
+| `rpc A (Req) returns (Res)` | returns one response object
| returns one response object |
+| `rpc A (Req) returns (stream Res)` | yields response objects
| returns an iterator of responses |
+| `rpc A (stream Req) returns (Res)` | consumes an iterator and returns
a response | accepts an iterator of requests |
+| `rpc A (stream Req) returns (stream Res)` | consumes and yields iterators
| accepts and returns iterators |
Servicer methods use snake_case names, while generated descriptors preserve the
exact IDL service and method names for the gRPC path.
@@ -188,7 +200,8 @@ class Greeter(demo_greeter_grpc.GreeterServicer):
Generated clients use the standard `grpcio` streaming call shapes:
```python
-with grpc.insecure_channel("localhost:50051") as channel:
+credentials = grpc.ssl_channel_credentials()
+with grpc.secure_channel("api.example.com:443", credentials) as channel:
stub = demo_greeter_grpc.GreeterStub(channel)
for reply in stub.lots_of_replies(
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]