<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python SDK 手册 on Apache Dubbo</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/</link><description>Recent content in Python SDK 手册 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/index.xml" rel="self" type="application/rss+xml"/><item><title>快速开始</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/quick-start/</guid><description>&lt;p>本指南将通过一个简单的工作示例帮助您开始使用 Python 中的 Dubbo，在此查看完整&lt;a href="https://github.com/apache/dubbo-python/tree/main/samples/helloworld">示例&lt;/a>。&lt;/p>
&lt;h2 id="1-前置条件">1 前置条件&lt;/h2>
&lt;ul>
&lt;li>Python 3.11 或更高版本&lt;/li>
&lt;li>合适的&lt;code>pip&lt;/code> 版本&lt;/li>
&lt;/ul>
&lt;h2 id="2-安装dubbo-python">2 安装Dubbo-python&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>直接安装&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>pip install apache-dubbo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>从源码安装&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>git clone https://github.com/apache/dubbo-python.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">cd&lt;/span> dubbo-python &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> pip install .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="3-构建dubbo服务">3 构建Dubbo服务&lt;/h2>
&lt;p>构建Dubbo Server&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">import&lt;/span> dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">from&lt;/span> dubbo.configs &lt;span style="color:#719e07">import&lt;/span> ServiceConfig
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">from&lt;/span> dubbo.proxy.handlers &lt;span style="color:#719e07">import&lt;/span> RpcMethodHandler, RpcServiceHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">class&lt;/span> &lt;span style="color:#268bd2">UnaryServiceServicer&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">def&lt;/span> &lt;span style="color:#268bd2">say_hello&lt;/span>(&lt;span style="color:#268bd2">self&lt;/span>, message: &lt;span style="color:#b58900">bytes&lt;/span>) &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#b58900">bytes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#b58900">print&lt;/span>(&lt;span style="color:#2aa198">f&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Received message from client: &lt;/span>&lt;span style="color:#2aa198">{&lt;/span>message&lt;span style="color:#2aa198">}&lt;/span>&lt;span style="color:#2aa198">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">b&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Hello from server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">def&lt;/span> &lt;span style="color:#268bd2">build_service_handler&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75"># build a method handler&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> method_handler &lt;span style="color:#719e07">=&lt;/span> RpcMethodHandler&lt;span style="color:#719e07">.&lt;/span>unary(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> method&lt;span style="color:#719e07">=&lt;/span>UnaryServiceServicer()&lt;span style="color:#719e07">.&lt;/span>say_hello, method_name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;unary&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75"># build a service handler&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service_handler &lt;span style="color:#719e07">=&lt;/span> RpcServiceHandler(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service_name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.samples.HelloWorld&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> method_handlers&lt;span style="color:#719e07">=&lt;/span>[method_handler],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> service_handler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">if&lt;/span> __name__ &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#2aa198">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75"># build service config&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service_handler &lt;span style="color:#719e07">=&lt;/span> build_service_handler()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service_config &lt;span style="color:#719e07">=&lt;/span> ServiceConfig(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service_handler&lt;span style="color:#719e07">=&lt;/span>service_handler, host&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;127.0.0.1&amp;#34;&lt;/span>, port&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">50051&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75"># start the server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server &lt;span style="color:#719e07">=&lt;/span> dubbo&lt;span style="color:#719e07">.&lt;/span>Server(service_config)&lt;span style="color:#719e07">.&lt;/span>start()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#b58900">input&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;Press Enter to stop the server...&lt;/span>&lt;span style="color:#cb4b16">\n&lt;/span>&lt;span style="color:#2aa198">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>构建Dubbo Client&lt;/p></description></item><item><title>自定义序列化</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/custom-serialization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/custom-serialization/</guid><description>&lt;p>在此查看完整&lt;a href="https://github.com/apache/dubbo-python/tree/main/samples/serialization">示例&lt;/a>。&lt;/p>
&lt;p>Python 是一种动态语言，其灵活性使得在其他语言中设计通用的序列化层具有挑战性。因此，我们移除了框架级别的序列化层，而是提供接口，允许用户根据需求自行实现（因为用户更了解他们要传输的数据格式）。&lt;/p>
&lt;p>序列化通常分为两个部分：序列化和反序列化。我们为这些函数定义了类型，自定义的序列化/反序列化函数必须遵循这些 &amp;ldquo;格式&amp;rdquo;。&lt;/p>
&lt;p>对于序列化函数，我们规定：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># A function that takes any number of arguments and returns data of type bytes&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SerializingFunction &lt;span style="color:#719e07">=&lt;/span> Callable[&lt;span style="color:#719e07">...&lt;/span>, &lt;span style="color:#b58900">bytes&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于反序列化函数，我们规定：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># A function that takes an argument of type bytes and returns data of any type&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DeserializingFunction &lt;span style="color:#719e07">=&lt;/span> Callable[[&lt;span style="color:#b58900">bytes&lt;/span>], Any]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面，我将演示如何使用 &lt;code>protobuf&lt;/code> 和 &lt;code>json&lt;/code> 进行序列化。&lt;/p>
&lt;h2 id="protobuf">protobuf&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>有关定义和编译 &lt;code>protobuf&lt;/code> 文件的详细说明，请参阅 &lt;a href="https://protobuf.dev/getting-started/pythontutorial/">protobuf tutorial&lt;/a>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在Client的&lt;code>unary&lt;/code>、&lt;code>client_stream&lt;/code>、&lt;code>server_stream&lt;/code> 和 &lt;code>bi_stream&lt;/code> 方法中通过设置&lt;code>request_serializer&lt;/code> 和 &lt;code>response_deserializer&lt;/code> 设置对应的序列化和反序列化函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">class&lt;/span> &lt;span style="color:#268bd2">GreeterServiceStub&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">def&lt;/span> __init__(&lt;span style="color:#268bd2">self&lt;/span>, client: dubbo&lt;span style="color:#719e07">.&lt;/span>Client):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">self&lt;/span>&lt;span style="color:#719e07">.&lt;/span>unary &lt;span style="color:#719e07">=&lt;/span> client&lt;span style="color:#719e07">.&lt;/span>unary(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> method_name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;sayHello&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> request_serializer&lt;span style="color:#719e07">=&lt;/span>greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest&lt;span style="color:#719e07">.&lt;/span>SerializeToString,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response_deserializer&lt;span style="color:#719e07">=&lt;/span>greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterReply&lt;span style="color:#719e07">.&lt;/span>FromString,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">def&lt;/span> &lt;span style="color:#268bd2">say_hello&lt;/span>(&lt;span style="color:#268bd2">self&lt;/span>, request):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#268bd2">self&lt;/span>&lt;span style="color:#719e07">.&lt;/span>unary(request)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">if&lt;/span> __name__ &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#2aa198">&amp;#34;__main__&amp;#34;&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reference_config &lt;span style="color:#719e07">=&lt;/span> ReferenceConfig&lt;span style="color:#719e07">.&lt;/span>from_url(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#2aa198">&amp;#34;tri://127.0.0.1:50051/org.apache.dubbo.samples.data.Greeter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dubbo_client &lt;span style="color:#719e07">=&lt;/span> dubbo&lt;span style="color:#719e07">.&lt;/span>Client(reference_config)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> stub &lt;span style="color:#719e07">=&lt;/span> GreeterServiceStub(dubbo_client)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#719e07">=&lt;/span> stub&lt;span style="color:#719e07">.&lt;/span>say_hello(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Dubbo-python&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#b58900">print&lt;/span>(&lt;span style="color:#2aa198">f&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Received reply: &lt;/span>&lt;span style="color:#2aa198">{&lt;/span>result&lt;span style="color:#719e07">.&lt;/span>message&lt;span style="color:#2aa198">}&lt;/span>&lt;span style="color:#2aa198">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>同理在Server中设置对应的序列化和反序列化函数。&lt;/p></description></item><item><title>Streaming 通信模型</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/streaming/</guid><description>&lt;p>在此查看完整&lt;a href="https://github.com/apache/dubbo-python/tree/main/samples/stream">示例&lt;/a>。&lt;/p>
&lt;p>Dubbo-Python 支持流式调用，包括 &lt;code>ClientStream&lt;/code>、&lt;code>ServerStream&lt;/code> 和 &lt;code>BidirectionalStream&lt;/code> 三种模式。&lt;/p>
&lt;p>在流式调用中，操作可以分为写入流和读取流两部分。对于 &lt;code>ClientStream&lt;/code>，是多次写入、单次读取；对于 &lt;code>ServerStream&lt;/code>，是单次写入、多次读取；而 &lt;code>BidirectionalStream&lt;/code> 支持多次写入和多次读取。&lt;/p>
&lt;h3 id="写入流">写入流&lt;/h3>
&lt;p>流式调用的写入操作分为单次写入（&lt;code>ServerStream&lt;/code>）和多次写入（&lt;code>ClientStream&lt;/code> 和 &lt;code>BidirectionalStream&lt;/code>）。&lt;/p>
&lt;h3 id="单次写入">单次写入&lt;/h3>
&lt;p>单次写入流的调用方式与 unary 模式类似。例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>stub&lt;span style="color:#719e07">.&lt;/span>server_stream(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;hello world from dubbo-python&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="多次写入">多次写入&lt;/h3>
&lt;p>对于多次写入流，用户可以通过迭代器或 &lt;code>writeStream&lt;/code> 方式写入数据（两者只能选其一）。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>迭代器写入&lt;/strong>：写入方式类似于 unary 模式，唯一的区别是传入的是迭代器。例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Use an iterator to send multiple requests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">def&lt;/span> &lt;span style="color:#268bd2">request_generator&lt;/span>():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">for&lt;/span> i &lt;span style="color:#719e07">in&lt;/span> [&lt;span style="color:#2aa198">&amp;#34;hello&amp;#34;&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;world&amp;#34;&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;from&amp;#34;&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;dubbo-python&amp;#34;&lt;/span>]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">yield&lt;/span> greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">str&lt;/span>(i))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Call the remote method and return a read_stream&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream &lt;span style="color:#719e07">=&lt;/span> stub&lt;span style="color:#719e07">.&lt;/span>client_stream(request_generator())
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用 &lt;code>writeStream&lt;/code> 写入&lt;/strong>：此方法不传入参数，使用空参调用，然后通过 &lt;code>write&lt;/code> 方法逐条写入数据，写入完成后调用 &lt;code>done_writing&lt;/code> 方法结束流。例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>stream &lt;span style="color:#719e07">=&lt;/span> stub&lt;span style="color:#719e07">.&lt;/span>bi_stream()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Use the write method to send messages&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream&lt;span style="color:#719e07">.&lt;/span>write(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;jock&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream&lt;span style="color:#719e07">.&lt;/span>write(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;jane&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream&lt;span style="color:#719e07">.&lt;/span>write(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;alice&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream&lt;span style="color:#719e07">.&lt;/span>write(greeter_pb2&lt;span style="color:#719e07">.&lt;/span>GreeterRequest(name&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dave&amp;#34;&lt;/span>))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Call done_writing to notify the server that the client has finished writing&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>stream&lt;span style="color:#719e07">.&lt;/span>done_writing()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="读取流">读取流&lt;/h3>
&lt;p>流式调用的读取操作分为单次读取（&lt;code>ClientStream&lt;/code>）和多次读取（&lt;code>ServerStream&lt;/code> 和 &lt;code>BidirectionalStream&lt;/code>）。在流式调用中，无论是哪种模式，返回的都是一个 &lt;code>ReadStream&lt;/code>。我们可以使用 &lt;code>read&lt;/code> 方法或迭代器读取数据，针对 &lt;code>read&lt;/code> 方法，需要注意以下几点：&lt;/p></description></item><item><title>服务发现</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/service-discovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/python-sdk/service-discovery/</guid><description>&lt;p>在此查看完整&lt;a href="https://github.com/apache/dubbo-python/tree/main/samples/registry">示例&lt;/a>。&lt;/p>
&lt;p>使用服务注册和发现非常简单。事实上，与点对点调用相比，它只需要增加两行代码。在使用该功能之前，我们需要安装相关的注册客户端。目前，Dubbo-python 只支持 Zookeeper，因此下面的演示将使用 Zookeeper。与之前类似，我们需要克隆 Dubbo-python 源代码并安装它。不过，在这种情况下，我们还需要安装 Zookeeper 客户端。命令如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone https://github.com/apache/dubbo-python.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">cd&lt;/span> dubbo-python &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> pip install .&lt;span style="color:#719e07">[&lt;/span>zookeeper&lt;span style="color:#719e07">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而后，只需启动 &lt;code>Zookeeper&lt;/code> 并在现有示例中插入以下代码即可：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Configure the Zookeeper registry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>registry_config &lt;span style="color:#719e07">=&lt;/span> RegistryConfig&lt;span style="color:#719e07">.&lt;/span>from_url(&lt;span style="color:#2aa198">&amp;#34;zookeeper://127.0.0.1:2181&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bootstrap &lt;span style="color:#719e07">=&lt;/span> Dubbo(registry_config&lt;span style="color:#719e07">=&lt;/span>registry_config)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Create the client&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>client &lt;span style="color:#719e07">=&lt;/span> bootstrap&lt;span style="color:#719e07">.&lt;/span>create_client(reference_config)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Create and start the server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bootstrap&lt;span style="color:#719e07">.&lt;/span>create_server(service_config)&lt;span style="color:#719e07">.&lt;/span>start()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>