update content

This commit is contained in:
oopsguy 2017-09-03 02:01:41 +08:00
parent b6d4b15eb9
commit 56aa43c2e7
4 changed files with 66 additions and 7 deletions

View File

@ -83,4 +83,63 @@
[Netflix Hystrix](https://github.com/Netflix/Hystrix) 是一个实现上述和其他模式的开源库。如果您正在使用 JVM那么您一定要考虑使用 Hystrix。如果您在非 JVM 环境中运行,则应使用相等作用的库。
## 3.6、IPC 技术
有很多不同的 IPC 技术可供选择。服务可以使用基于同步请求/响应的通信机制,比如基于 HTTP 的 REST 或 Thrift。或者可以使用异步、基于消息的通信机制如 AMQP 或 STOMP。
还有各种不同的消息格式。服务可以使用人类可读的、基于文本的格式,如 JSON 或 XML。或者可以使用如 Avro 或 Protocol Buffers 等二进制格式(更加有效)。稍后我们将讨论同步 IPC 机制,但首先让我们来讨论一下异步 IPC 机制。
## 3.7、异步、基于消息的通信
当使用消息传递时,进程通过异步交换消息进行通信。客户端通过发送消息向服务发出请求。如果服务需要回复,则通过向客户端发送一条单独的消息来实现。由于通信是异步的,因此客户端不会阻塞等待回复。相反,客户端被假定不会立即收到回复。
一条[消息](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Message.html)由头部(如发件人之类的元数据)和消息体组成。消息通过[通道](http://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageChannel.html)进行交换。任何数量的生产者都可以向通道发送消息。类似地,任何数量的消费者都可以从通道接收消息。有两种通道,[点对点](http://www.enterpriseintegrationpatterns.com/patterns/messaging/PointToPointChannel.html)pointtopoint和[发布订阅](http://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html)publishsubscribe
- **点对点通道**发送一条消息给一个切确的、正在从通道读取消息的消费者。服务使用点对点通道,就是上述的一对一交互方式。
- **发布订阅通道**将每条消息传递给所有订阅的消费者。服务使用发布订阅通道,就是上述的一对多交互方式。
图 3-4 展示了打车应用程序如何使用发布订阅通道。
![使用了发布-订阅通道的打车应用]()
Trip Management 服务通过向发布订阅通道写入 Trip Created 消息来通知已订阅的服务,如 Dispatcher。 Dispatcher 找到可用的司机并通过向发布订阅通道写入 Driver Proposed 消息来通知其他服务。
有许多信息系统可供选择。您应该选择一个支持多种编程语言的。
一些消息系统支持标准协议,如 AMQP 和 STOMP。其他消息系统有专有的但为文档化的协议。
有大量的开源消息系统可供选择,包括 [RabbitMQ](http://www.rabbitmq.com/)、[Apache Kafka](http://kafka.apache.org/)、[Apache ActiveMQ](http://activemq.apache.org/) 和 [NSQ](https://github.com/bitly/nsq)。在高层上,他们都支持某种形式的消息和通道。他们都力求做到可靠、高性能和可扩展。然而,每个代理的消息传递模型细节上都存在着很大差异。
使用消息传递有很多优点:
- **将客户端与服务分离** - 客户端通过向相应的通道发送一条消息来简单地发出一个请求。服务实例对客户端而言是透明的。客户端不需要使用发现机制来确定服务实例的位置。
- **消息缓冲** - 使用如 HTTP 的同步请求/响应协议,客户端和服务在交换期间必须可用。相比之下,消息代理会将消息写入通道入队,直到消费者处理它们。这意味着,例如,即使订单执行系统出现缓慢或不可用的情况,在线商店还是可以接受客户的订单。订单消息只需要简单地排队。
- **灵活的客户端-服务交互** - 消息传递支持前面提到的所有交互方式。
- **毫无隐瞒的进程间通信** - 基于 RPC 的机制试图使调用远程服务看起来与调用本地服务相同。然而,由于物理因素和局部故障的可能性,他们实际上是完全不同的。消息传递使这些差异变得非常明显,所以开发人员不会被这些虚假的安全感所欺骗。
然而,消息传递也存在一些缺点:
- **额外的复杂操作** - 消息传递系统是一个需要安装、配置和操作的系统组件。消息代理程序必须高度可用,否则系统的可靠性将受到影响。
- **实施基于请求/响应的交互的复杂性** - 请求/响应式交互需要做些工作来实现。每个请求消息必须包含应答通道标识符和相关标识符。该服务将包含相关 ID 的响应消息写入应答信道。客户端使用相关 ID 将响应与请求相匹配。通常使用直接支持请求/响应的 IPC 机制更加容易。
现在我们已经了解了使用基于消息的 IPC让我们来看看请求/响应的 IPC。
## 3.8、同步的请求/响应 IPC
当使用基于同步、基于请求/响应的 IPC 机制时,客户端向服务器发送请求。该服务处理该请求并返回响应。
在许多客户端中,请求的线程在等待响应时被阻塞。其他客户端可能会使用异步、事件驱动的客户端代码,这些代码可能是由 [Futures](http://docs.scala-lang.org/overviews/core/futures.html) 或 [Rx Observables](http://reactivex.io/documentation/observable.html) 封装的。然而,与使用消息传递不同,客户端假定响应能及时到达。
有许多协议可供选择。有两种流行协议分别是 REST 和 Thrift。我们先来看一下 REST。
### 3.8.1、REST
如今,开发 [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer) 风格的 API 是很流行的。REST 是一种使用了 HTTP (几乎总是)的 IPC 机制。
REST 中的一个关键概念是资源它通常表示业务对象如客户或产品或这些业务对象的集合。REST 使用 HTTP 动词(谓词)来操纵资源,这些资源通过 URL 引用。例如GET 请求返回一个资源的表示形式,可能是 XML 文档或 JSON 对象形式。POST 请求创建一个新资源PUT 请求更新一个资源。
引用 REST 的创建者 Roy Fielding
> “REST 提供了一套架构约束,当作为整体应用时,其强调组件交互的可扩展性、接口的通用性、组件的独立部署以及中间组件,以减少交互延迟、实施安全性和封装传统系统。” - Roy Fielding[《架构风格与基于网络的软件架构设计》](http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)
图 3-5 显示了打车应用程序可能使用 REST 的方式之一。
![使用了 RESTful 交互的打车应用]()
**待续……**

View File

@ -36,13 +36,13 @@
- [3.3、定义 API](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#33定义api)
- [3.4、演化 API](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#34演化api)
- [3.5、处理局部故障](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#35处理局部故障)
- 3.6、IPC 技术
- 3.7、异步,基于消息通信
- 3.8、同步,请求/响应 IPC
- 3.9、REST
- 3.10、Thrift
- 3.11、消息格式
- 3.12、总结
- [3.6、IPC 技术](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#36ipc技术)
- [3.7、异步、基于消息的通信](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#37异步、基于消息的通信)
- [3.8、同步的请求/响应 IPC](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#38同步的请求响应ipc)
- [3.8.1、REST](https://github.com/oopsguy/microservices-from-design-to-deployment-chinese/blob/master/3-inter-process-communication.md#381rest)
- [3.8.2、Thrift]
- 3.9、消息格式
- 3.10、总结
- 微服务实战NGINX 和应用架构
### 4、服务发现

BIN
resources/3-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
resources/3-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB