マイクロサービス(microservice)はソフトウェアアーキテクチャであり、ますます注目を集めています。
しかし、それは何を意味しますか?どのようなアーキテクチャをマイクロサービスと呼べるのでしょうか?
インターネット上には多くの記事がありますが、それらはあまり複雑で、初心者が理解しにくいです。私はこの概念は実は非常にシンプルで、通俗的に説明できると考えています。

一、モノリシックソフトウェア
マイクロサービスを理解するには、まずソフトウェアアーキテクチャの進化を理解する必要があります。
初期のソフトウェアでは、すべての機能が一緒に書かれており、これをモノリシックアーキテクチャ(monolithic software)と呼びます。

ソフトウェア全体が単一のまとまりであり、一体化した機械のようです。
考えると、ソフトウェアの機能が多いほど、モノリシックアーキテクチャはより複雑になり、多くの欠点も露呈してきます。
(1)すべての機能が結合しており、お互いに影響し合い、最終的に管理が困難になる。
(2)一行のコードを修正するだけで、ソフトウェア全体を再構築してデプロイする必要があり、コストが非常に高い。
(3)ソフトウェアが一つのまとまりになっているため、各機能を個別に開発・テストすることは不可能で、全体として開発・テストしなければならず、これにより水の流れ式開発モデルを導入する必要がある。
上記の三つの理由の詳細な分析は、以前の記事『ソフトウェア工学の最大の難題』を参照してください。

要するに、モノリシックアーキテクチャの大規模ソフトウェアは、開発速度が遅く、メンテナンスやアップグレードが困難な複雑なコードを形成し、プログラマーにとって重荷となる。
二、サービス指向アーキテクチャ
上記の問題を解決するために、早い段階でコードの結合を打破し、モノリシックアーキテクチャを分割し、ソフトウェアを個々の独立した機能単位に分割する必要があると提案されてきた。
約20年前、インターネットの出現とともに、機能単位が遠隔地の「サービス」という形式で提供できるようになり、「サービス指向アーキテクチャ」(service-oriented architecture、略称SOA)が生まれました。

「サービス」とは、バックグラウンドで絶えず動作し、特定の機能を提供するプログラムのことです。最も一般的なサービスはWebサービスで、80番ポートを通じて外部にウェブページのアクセスを提供します。
「サービス指向アーキテクチャ」は、大きな単体プログラムを、個々の独立したサービス、つまり小さなプログラムに分割するものです。各サービスは独立した機能単位であり、異なる機能を担い、サービス間は通信プロトコルで接続されています。

このアーキテクチャには多くの利点があります。
(1)各サービスの機能が単一で、小型ソフトウェアに相当し、開発とテストが容易です。
(2)各サービスは独立して動作するため、アーキテクチャが簡素化され、信頼性が向上します。
(3)コードの再利用を奨励し、同じサービスを複数の目的で使用できる。
(4)異なるサービスは独立して開発・デプロイできるため、アップグレードが容易。
(5)拡張性が高く、機器や機能を容易に追加でき、高負荷を耐えられる。
(6)単一障害点が発生しにくい。あるサービスが失敗しても、他のサービスに影響しない。
モノリシックアーキテクチャとは異なり、サービス指向アーキテクチャは言語に依存せず、異なるサービスは異なる言語やツールで開発でき、異なるシステムや環境でデプロイされる必要がある。
これは意味する、サービス指向アーキテクチャはデフォルトで異なるサーバー上で実行される、各サーバーは一つのサービスを提供し、複数のサーバーが一つの完全なネットワークアプリケーションを構成する。
三、マイクロサービス
2014年、Dockerが登場し、ソフトウェア開発の様子を根本から変えました。プログラムをコンテナ内で実行し、各コンテナは個別に実行環境を設定でき、かつ非常に少ないシステムリソースを占有します。

明らかに、コンテナを使って「サービス指向アーキテクチャ」を実現できます。各サービスは一台のサーバーを占有するのではなく、一つのコンテナを占有します。
そうすれば、複数のサーバーは必要ありません。最も簡単な場合、自分のマシンで複数のコンテナを実行し、一台のサーバーでサービス指向アーキテクチャを実現できます。これまでは不可能でした。この実現方法を「マイクロサービス」と呼びます。

簡単に言えば、マイクロサービスとは、コンテナ技術を用いたサービス指向アーキテクチャです。それでも「サービス」を機能単位として使用しますが、軽量な実装になり、新しいサーバーを追加する必要はなく、新しいコンテナ(一つのプロセス)を新規作成するだけでよいので、「マイクロサービス」と呼ばれるのです。
一つのマイクロサービスは独立したプロセスです。 このプロセスは本機で実行することもできますし、他のサーバーやクラウド(例えばクラウドサービスやクラウド関数FaaS)で実行することもできます。
その特徴はサービス指向アーキテクチャと同じですが、より軽量級であるため、機能の分離とサービス化がより徹底的に行えます。また、標準化できるため、同じコンテナでもどこで実行しても結果は同じです。そのため、市場には標準化されたマイクロサービスを提供するSaaS製品が多く存在します。
正にこれらのマイクロサービスの際立った利点のおかげで、ここ数年で非常に人気が高まっています。コンテナ技術やクラウドサービスと共に、今後のソフトウェア開発においてますます重要な役割を果たすことでしょう。
(完了)












