【微服务】
微服务（Microservices）是一种软体架构风格，它是以专注於单一责任与功能的小型功能区块 (Small Building Blocks) 为基础，利用模组化的方式组合出复杂的大型应用程式，各功能区块使用与语言无关 (Language-Independent/Language agnostic）的API集相互通讯。
微服务的起源是由 Peter Rodgers 博士于 2005 年度云端运算博览会提出的微 Web 服务（Micro-Web-Service）开始，Juval Löwy 则是与他有类似的前导想法，将类别变成细粒服务（granular services），以作为微软下一阶段的软体架构，其核心想法是让服务是由类似 Unix 管道的存取方式使用，而且复杂的服务背后是使用简单 URI 来开放介面，任何服务，任何细粒都能被开放（exposed）。这个设计在 HP 的实验室被实现，具有改变复杂软体系统的强大力量。
2014年，Martin Fowler 与 James Lewis 共同提出了微服务的概念，定义了微服务是由以单一应用程式构成的小服务，自己拥有自己的进程与轻量化处理，服务依业务功能设计，以全自动的方式部署，与其他服务使用HTTP API通讯。同时服务会使用最小的规模的集中管理 (例如 Docker) 能力，服务可以用不同的程式语言与资料库等元件实作。
== 概念 ==
微服务是一种以业务功能为主的服务设计概念，每一个服务都具有自主运行的业务功能，对外开放不受语言限制的 API (最常用的是 HTTP)，应用程式则是由一个或多个微服务组成。
微服务的另一个对比是单体式应用程式。单体式应用表示一个应用程式内包含了所有需要的业务功能，并且使用像主从式架构（Client/Server）或是多层次架构（N-tier）实作，虽然它也是能以分散式应用程式来实作，但是在单体式应用内，每一个业务功能是不可分割的。若要对单体式应用进行扩展则必须将整个应用程式都放到新的运算资源（如：虚拟机器） 内，但事实上应用程式中最吃耗费资源、需要运算资源的仅有某个业务部份（例如跑分析报表或是数学演算法分析），但因为单体式应用无法分割该部份，因此无形中会有大量的资源浪费的现象。
微服务运用了以业务功能的设计概念，应用程式在设计时就能先以业务功能或流程设计先行分割，将各个业务功能都独立实作成一个能自主执行的个体服务，然后再利用相同的协定将所有应用程式需要的服务都组合起来，形成一个应用程式。若需要针对特定业务功能进行扩充时，只要对该业务功能的服务进行扩展就好，不需要整个应用程式都扩展，同时，由于微服务是以业务功能导向的实作，因此不会受到应用程式的干扰，微服务的管理员可以视运算资源的需要来配置微服务到不同的运算资源内，或是布建新的运算资源并将它配置进去。
虽然使用一般的伺服器虚拟化技术就能应用于微服务的管理，但容器技术 (Container Technology) 如 Docker 会更加地适合发展微服务的运算资源管理技术。
== 规划 ==
微服务中每个服务都能够有自己的资料库。
微服务的规划与单体式应用程式十分不同，微服务中每个服务都需要避免与其他服务有所牵连，且都要能够自主，并在其他服务发生错误时不受干扰。如果资料库都是分开的，那么新服务上线时就会遇到资料库为空的窘境。我们并不能从另一个服务复制资料过来，因为我们无法确定该服务拥有最新的资料。
此时应该从事件存储中心重播所有事件，如此一来就可以找回先前的所有、最新的资料。
=== 资料库 ===
微服务理念中有数个资料库的规划方式。
* 每个服务都各有一个资料库，同属性的服务可共享同个资料库。
* 所有服务都共享同个资料库，但是不同表格，并且不会跨域存取。
* 每个服务都有自己的资料库，就算是同属性的服务也是，资料库并不会共享。
资料库并不会只存放该服务的资料，而是「该服务所会用到的所有资料」。更深层一点的举例：假设有个文章服务，而这个服务可能会需要判断使用者的帐号⋯⋯等。那么文章服务的资料库就可以放入使用者的部分资料。此举是为了避免服务之间的相依性，避免文章服务呼叫使用者服务。
==== 资料库的可弃性 ====
实践微服务有许多的做法，但其中一种做法是将资料库作为短期的储存空间而不是储存长期的资料。这意味著资料库可以在离线时被清空。因为它们可以在上线时从事件存储中心恢复，因此也能以记忆体快取（如：Redis） 作为资料库伺服器。但这种做法需要将每个请求当作事件来进行广播。如此一来就可以从事件存储中心重播所有的事件来找回所有的资料。
=== 沟通与事件广播 ===
NSQ 是一个讯息伫列系统、平台。在微服务中所扮演的角色是将讯息、资料传递到其他服务。
此举是异步执行，所以不需要等到其他服务接收到讯息就能够执行下一步。这种方式能够避免服务之间有所牵连、呼叫。
微服务中最重要的就是每个服务的独立与自主，因此服务与服务之间也不应该有所沟通。倘若真有沟通，也应采用异步沟通的方式来避免紧密的相依性问题。要达到此目的，则可用下列两种方式：
==== 事件存储中心（Event Store） ====
这可以让你在服务丛集中广播事件，并且在每个服务中监听这些事件并作处理，这令服务之间没有紧密的相依性，而这些发生的事件都会被保存在事件存储中心里。这意味著当微服务重新上线、部署时可以重播（Replay）所有的事件。这也造就了微服务的资料库随时都可以被删除、摧毁，且不需要从其他服务中取得资料。
==== 讯息伫列（Message Queue） ====
这令你能够在服务丛集中广播消息，并传递到每个服务中。具有这个功能的像是 NSQ 或是 RabbitMQ。你能够在 A 服务上广播一个「建立新使用者」的事件，这个事件可以顺便带有新使用者的资料。而 B 服务可以监听这个事件并在接收到之后有所处理。这些过程都是异步处理的，这意味著 A 服务并不需要等到 B 服务处理完该事件后才能继续，而这也代表 A 服务无法取得 B 服务的处理结果。与事件存储中心近乎相似，但有所不同的是：讯息伫列并不会保存事件。一旦事件被消化（接收）后就会从伫列中消失，这很适合用在像发送欢迎信件的时机。
=== 服务探索 ===
单个微服务在上线的时候，会向服务探索中心（如：Consul）注册自己的 IP 位置、服务内容，如此一来就不需要向每个微服务表明自己的 IP 位置，也就不用替每个微服务单独设定。当服务需要呼叫另一个服务的时候，会去询问服务探索中心该服务的 IP 位置为何，得到位置后即可直接向目标服务呼叫。
这么做的用意是可以统一集中所有服务的位置，就不会分散于每个微服务中，且服务探索中心可以每隔一段时间就向微服务进行健康检查（如透过：TCP 呼叫、HTTP 呼叫、Ping），倘若该服务在时间内没有回应，则将其从服务中心移除，避免其他微服务对一个无回应的服务进行呼叫。
== 内容 ==
一个微服务架构的应用程式有下列特性：
* 每个服务都容易被取代。
* 服务是以能力来组织的，例如使用者介面、前端、推荐系统、帐单或是物流等。
* 由于功能被拆成多个服务，因此可以由不同的程式语言、资料库实作。
* 架构是对称而非分层（即生产者与消费者的关系）。
一个微服务架构：
* 适用于具持续交付（Continuous Delivery）的软体开发流程。
* 与服务导向架构（Service-Oriented Architecture）不同，后者是整合各种业务的应用程式，但微服务只属于一个应用程式。
== 技术 ==
微服务可以用不同的编程语言实现，也可以使用不同的基础设施。因此，最重要的技术选择是微服务之间的通信方式（同步、异步、UI集成）以及用于通信的协议（RESTful HTTP、消息、GraphQL……）。在传统系统中，大多数技术选择，如编程语言，都会影响整个系统。因此，选择技术的方法是完全不同的。
Eclipse基金会已经发布了开发微服务的规范——Eclipse MicroProfile。
=== Service mesh ===
在服务网格中，每个服务实例都与一个反向代理服务器实例（称为服务代理、 sidecar代理或sidecar）配对。服务实例和 sidecar 代理共享一个容器，容器由一个容器编排工具（如Kubernetes、Nomad、Docker Swarm、DC/OS）管理。
服务代理负责与其他服务实例的通信，并支持服务（实例）发现、负载平衡、身份验证和授权、安全通信等功能。
在服务网格中，服务实例及其sidecar代理被称为构成数据平面，其中不仅包括数据管理，还包括请求处理和响应。服务网格还包括一个用于管理服务之间交互的控制平面，这些交互由它们的sidecar代理协调。服务网格架构有几个选项: Istio、Linkerd、Consul和其他许多服务网格景观。服务网格管理平面 Meshery date=20220606163613 提供跨服务网格部署的生命周期、配置和性能管理。
=== 平台比较 ===
实现微服务体系结构非常困难。任何微服务体系结构都需要解决许多问题（见下表）。Netflix开发了一个微服务框架来支持他们的内部应用程序，然后开放了该框架的许多部分。其中许多工具已经通过Spring框架得到推广——它们已经在Spring Cloud项目的保护伞下重新实现为基于Spring的工具。 下表显示了Kubernetes生态系统中的实现功能与Spring Cloud世界中的等效功能的比较。 Spring Cloud生态系统值得注意的一点是，它们都是基于Java的技术，而Kubernetes是一个多语言运行时平台。
== 相关程式语言 ==
* Jolie
== 微服务采用者 ==
* Akana
* Amazon
* AnyPresence JustAPIs
* Apprenda
* Axway
*  1060 Research Ltd. date=20210120030409
* Bluemix
* Cloud Foundry
* Google
* The Guardian
* Hailo Taxi
* HP Helion Development Platform
* Jelastic
* Microsoft Azure
* Netflix
*  Nirmata date=20220616064908
*  nearForm date=20220624100650
* Riot Games
* SoundCloud
* Uber
*  Joined Node date=20210623153204
== 平台实作 ==
*  Apache ServiceComb date=20220314211420
*  Docker date=20220624102536
*  Microsoft Service Fabric date=20150916070104  ( overview date=20161018155853 ,  blog announcement date=20150806073841 )
*  MicroService4Net date=20191130080529
* NetKernel
*  Nirmata date=20220616064908
*  Seneca Microservices Framework and Protocol date=20220321173155
*  Spring Cloud date=20220129144746
* 微服务测试工具：Wilma
* Vert.x
*  Baratine date=20151109161556
* KumuluzEE
* Enduro/X