微服务

微服务是一种分布式系统解决方案。

分布式系统

什么是分布式系统
  分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。

  首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。

复杂性

流量管理(Traffic management):超时、重试、负载均衡;

安全性(Security):终端用户的认证和授权;

可观察性(Observability):跟踪、监控和日志。

私有数据的所有权

当多个服务直接读写数据库中同一张表时,对这些表做任何改动都需要协调这些相关服务的部署。这一点违背了服务相互独立这一原则。共享的数据存储很容易不经意间造成耦合。每个服务需要有自己的私有数据。

私有数据还能提供另一个优势:根据服务的具体用例选择最适合的数据库技术。

每个服务都要有自己的数据服务器吗?

不一定。每个服务需要自己的数据库,但这些数据库可共置在一台共享的数据服务器上。重点在于不应让服务知道其他服务底层数据库的存在。这样即可用一台共享数据服务器先开始开发,以后只要更改配置即可将不同服务的数据库隔离起来。

然而共享的数据服务器也可能造成一些问题。首先会形成单点故障,进而导致一大批服务同时故障,这一点绝不能掉以轻心。其次很可能因为一个服务占用太多资源而无意中对其他服务造成影响。

确定服务的边界

这个问题很复杂。每个服务应该是一种能提供某些业务能力的自治单位。

服务应当弱耦合在一起,对其他服务的依赖应尽可能低。一个服务与其他服务的任何通信都应通过公开暴露的接口(API、事件等)实现,这些接口需要妥善设计以隐藏内部细节。

服务应具备高内聚力。密切相关的多个功能应尽量包含在同一个服务中,这样可将服务之间的干扰降至最低。

服务应包含单一的界限上下文。界限上下文(Bounded context)可将某一领域的内部细节,包括该领域特定的模块封装在一起。

理想情况下,必须对自己的产品和业务有足够的了解才能确定最自然的服务边界。就算一开始确定的边界是错误的,服务之间的弱耦合也可以让你在未来轻松重构(例如合并、拆分、重组)。

 

无状态的服务实例

无状态(Stateless)服务实例不存储与上一个请求有关的任何信息,传入请求可发送至服务的任何实例。这种做法的主要收益在于可简化运维和伸缩工作。可以在后台服务之前增加一个简单的负载均衡器,随后即可根据请求数量的变化轻松地增加或删除实例,同时故障实例的替换过程也更为简单。

幂等性

上文提到过作业运行失败后可重试。自动重试失败作业的做法会遇到一个挑战:可能会无法知道失败的作业在失败前是否完成了自己的工作。为确保相关操作足够简单,必须让作业具备幂等性(Idempotent)。在这个语境下,幂等性意味着多次运行同一个作业不会产生任何消极影响。无论作业运行一次或多次,最终结果必须相同。

负载均衡器

无状态服务的优势之一在于可同时为服务运行多个实例。由于每个实例都是无状态的,可由任何实例处理任何请求。这一特性与负载均衡器非常相符,借此可对服务进行更简单的伸缩。同时几乎所有云平台都提供了负载均衡器功能。

服务注册表

服务注册表可以作为信息的权威来源。其中包含有关可用服务的信息,以及服务网络位置。考虑到该服务本身的一些关键特质(是一种单一故障点),该服务必须具备极高容错能力。

可通过两种方式将服务注册至服务注册表:

自注册:服务可在启动过程中自行注册,并在生命周期的不同阶段(初始化、正在接受请求、正在关闭等)过程中发送状态信息。此外服务还要定期向注册表发送心跳信号,以便让注册表知道自己处于活跃状态。如果无法收到心跳信号,注册表会将服务标记为已关闭。这种方式最适合包含在服务模板中。

外部监控:可通过外部服务监控服务运行状况并酌情更新注册表。很多微服务平台使用这种方法,通常还会用这种外部服务负责服务的整个生命周期管理。

 

https://www.zybuluo.com/liuhui0803/note/490701
http://www.infoq.com/cn/articles/best-practice-of-constructing-micro-service-system
https://www.cnblogs.com/xybaby/p/7787034.html