<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>服务调用 on Leanku 的博客</title><link>https://www.leanku.com/tags/%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/</link><description>Recent content in 服务调用 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 15 Sep 2025 20:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>微服务治理-服务调用</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/</guid><description>&lt;h1 id="微服务治理-服务调用"&gt;微服务治理-服务调用&lt;/h1&gt;&#10;&lt;p&gt;微服务拆分之后，服务之间不再是进程内方法调用，而是通过网络进行通信。服务调用（Service Communication）就是研究不同服务之间如何安全、高效、可靠地进行数据交换。&lt;/p&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-为什么需要服务调用"&gt;1.1 为什么需要服务调用？&lt;/h3&gt;&#10;&lt;p&gt;在单体架构中：只掉调用方法，比如 &lt;code&gt;$user = $this-&amp;gt;userService-&amp;gt;getUser(1);&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;只是一次普通的方法调用（Method Call）。&lt;/p&gt;&#10;&lt;p&gt;没有网络、没有序列化、没有超时、没有连接&lt;/p&gt;&#10;&lt;p&gt;而微服务以后：&lt;/p&gt;&#10;&lt;p&gt;已经变成：HTTP、TCP、gRPC&lt;/p&gt;&#10;&lt;p&gt;所有调用都变成：网络通信（Network Communication）&lt;/p&gt;&#10;&lt;h3 id="12-微服务调用有哪些方式"&gt;1.2 微服务调用有哪些方式？&lt;/h3&gt;&#10;&lt;p&gt;主要有三种：&lt;/p&gt;&#10;&lt;h4 id="1-http-rest"&gt;1. HTTP REST&lt;/h4&gt;&#10;&lt;p&gt;优点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;简单&lt;/li&gt;&#10;&lt;li&gt;通用&lt;/li&gt;&#10;&lt;li&gt;调试方便&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缺点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;JSON 较大&lt;/li&gt;&#10;&lt;li&gt;序列化效率较低&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-rpc"&gt;2. RPC&lt;/h4&gt;&#10;&lt;p&gt;看起来像：本地方法。&lt;/p&gt;&#10;&lt;p&gt;实际上走的是网络。&lt;/p&gt;&#10;&lt;h4 id="3-grpc"&gt;3. gRPC&lt;/h4&gt;&#10;&lt;p&gt;底层：&lt;/p&gt;&#10;&lt;p&gt;HTTP/2。&lt;/p&gt;&#10;&lt;p&gt;Protobuf。&lt;/p&gt;&#10;&lt;p&gt;速度：非常快。&lt;/p&gt;&#10;&lt;h3 id="13-怎么选择调用方式"&gt;1.3 怎么选择调用方式？&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;推荐&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对外 API&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP REST&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内部服务调用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gRPC&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;旧系统兼容&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高频通信&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gRPC&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;即：&#10;外部使用 HTTP。&#10;内部使用 gRPC。&lt;/p&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-一次-http-调用发生了什么"&gt;2.1 一次 HTTP 调用发生了什么？&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;业务代码&#10; │&#10; ▼&#10;DNS / 服务发现&#10; │&#10; ▼&#10;TCP 建立连接&#10; │&#10; ▼&#10;发送 HTTP 请求&#10; │&#10; ▼&#10;User Service&#10; │&#10; ▼&#10;返回 JSON&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果没有连接池。&lt;/p&gt;</description></item></channel></rss>