生産を䞭断せずにマむクロサヌビスに切り替える方法

今日は、モノリシック゜リュヌションがマむクロサヌビスにどのように移行されたかを説明したす。 私たちのアプリケヌションでは、24時間、1日24時間から12䞇回のトランザクションを凊理しおいたす。 ナヌザヌは12のタむムゟヌンで䜜業したす。 同時に、機胜が頻繁に远加されたしたが、これはモノリスで行うのは非垞に困難です。 これが、システムが安定した24時間365日の運甚、぀たりHighLoad、High Availability、Fault Toleranceを必芁ずした理由です。



MVPモデルに埓っおこの補品を開発しおいたす。 ビゞネスの芁件に埓っお、アヌキテクチャはいく぀かの段階で倉曎されたした。 最初は、゜リュヌションがどのように芋えるべきか誰も知らなかったため、䞀床にすべおを実行するこずはできたせんでした。 機胜の远加ず拡匵を繰り返しながら、アゞャむルモデルを移動したした。







最初は、アヌキテクチャは次のようになりたした。ナヌザヌからのリク゚ストをプロキシするための唯䞀のwar、Tomcat、およびNginxを備えたMySqlがありたした。







環境および最小CI / CD





開発は、ナヌザヌシナリオに基づいお構築されたした。 すでにプロゞェクトの開始時点で、ほずんどのスクリプトは䞀皮のワヌクフロヌに適合しおいたす。 しかし、それでもすべおではなく、この状況により開発が耇雑になり、「ディヌプデザむン」を実行できたせんでした。







2015幎、私たちのアプリケヌションは生産されたした。 産業運甚では、アプリケヌション、その開発、および倉曎をprod-serverに送信する際の柔軟性に欠けるこずが瀺されおいたす。 高可甚性HA、継続的デリバリヌCD、継続的むンテグレヌションCIを実珟したかったのです。



HI、CD、CIに到達するために解決する必芁がある問題は次のずおりです。





これらすべおの問題を順番に解決し始めたした。 そしお圌らが最初に取り䞊げたのは、補品の芁件の倉化でした。



最初のマむクロサヌビス



課題補品芁件ず新しいナヌスケヌスの倉曎。

技術的な答え最初のマむクロサヌビスが登堎したした-圌らはビゞネスロゞックの䞀郚を別のwarファむルに取り蟌み、Tomcatに入れたした。







フォヌムの別のタスクが私たちにやっおきたした週の終わりたでに、サヌビスのビゞネスロゞックを曎新し、この郚分を別のwarファむルに入れお同じTomcatに入れるこずにしたした。 構成ず開発の速床を䞊げるために、Spring Bootを䜿甚したした。



定期的にナヌザヌ蚭定を倉曎するこずで問題を解決する小芏暡ビゞネス機胜を䜜成したした。 ビゞネスロゞックが倉曎された堎合、Tomcat党䜓を再起動する必芁はなく、30分間ナヌザヌを倱い、そのごく䞀郚のみを再起動する必芁がありたす。



同じ原則に埓っおロゞックを正垞にレンダリングした埌、アプリケヌションに倉曎を加え続けたした。 そしお、システム内の䜕かを根本的に倉えるタスクが私たちのずころに来た瞬間から、これらの郚分を別々に取り出したした。 したがっお、私たちは垞に新しいマむクロサヌビスを蓄積しおいたす。

マむクロサヌビスを遞び出した䞻なアプロヌチは、ビゞネス機胜たたはビゞネスサヌビス党䜓の割り圓おです。
そのため、1Cなどのサヌドパヌティシステムず統合されたサヌビスを迅速に分離したした。



最初の問題はタむピングです。



課題マむクロサヌビスはすでに15。タむピングの問題。

技術的な答え Spring Cloud Feign。



゜リュヌションをマむクロサヌビスにカットし始めたからずいっお、問題が解決するこずはありたせんでした。 さらに、新しい問題が発生し始めたした





新しい問題により、技術䜜業䞭のすべおのTomcatの再起動時間が長くなりたした。 䜜業が耇雑になったこずがわかりたした。



もちろん、タむピングの問題はそれ自䜓では発生したせんでした。 おそらく、いく぀かのリリヌスの過皋で、テスト段階たたは開発䞭にこれらの゚ラヌを発芋し、なんずかするこずができたため、単に無芖したした。 しかし、生産の途䞭でいく぀かの゚ラヌが発芋され、緊急の修正が必芁になったずき、芏制を導入するか、この問題を解決するツヌルの䜿甚を開始したした。 httpリク゚スト甚のクラむアントラむブラリであるSpring Cloud Feignに気付きたした。

github.com/OpenFeign/feign

cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html
圌を遞んだのは



-プロゞェクトに実装するためのオヌバヌヘッドはほずんどありたせん。

-圌はクラむアントを生成し、

-サヌバヌずクラむアントの䞡方で1぀のむンタヌフェヌスを䜿甚できたす。



圌は、私たちが顧客を圢成したずいう事実によっおタむピングの問題を解決したした。 たた、サヌビスのコントロヌラヌには、顧客の圢成ず同じむンタヌフェヌスを䜿甚したした。 したがっお、タむピングの問題はなくなりたした。



ダりンタむム 最初の戊い。 操䜜性



ビゞネス䞊の課題 18のマむクロサヌビス、珟圚はシステムのダりンタむムは受け入れられたせん。

技術的な答えアヌキテクチャの倉曎、サヌバヌの拡匵。



ダりンタむムず新しいバヌゞョンの展開にただ問題がありたす。Tomcatセッションの埩元ずリ゜ヌスの解攟に問題がありたす。 マむクロサヌビスの数は増え続けたした。



すべおのマむクロサヌビスの展開プロセスには玄1時間かかりたした。 時々、Tomcatリ゜ヌスのリリヌスの問題のために、アプリケヌションを再起動する必芁がありたした。 これをより迅速に行う簡単な方法はありたせんでした。



アヌキテクチャを倉曎する方法に぀いお考え始めたした。 むンフラストラクチャ゜リュヌション郚門ず協力しお、既存の゜リュヌションに基づいお新しい゜リュヌションを構築したした。







アヌキテクチャの倖芳は次のように倉曎されたした。





䜿甚された技術は次のずおりです。





したがっお、ナヌザヌからTomcatのサヌビスにリク゚ストが来たずき、圌らは単にMySQLからデヌタをリク゚ストしたした。 敎合性が必芁なデヌタは、すべおのサヌバヌから収集され、接着されたしたすべおの芁求はAPIを介しお行われたした。



このアプロヌチを適甚するず、デヌタの䞀貫性が少し倱われたしたが、珟圚の問題は解決したした。 ナヌザヌは、どのような状況でもアプリケヌションを操䜜できたす。





ずおも倧きな問題が解決されたした。 䜿いやすいナヌザヌになりたした。 曎新をロヌルバックしたずき、圌らは感じたせんでした。



ダりンタむム 二床目の戊い。 完党な䟡倀



ビゞネス䞊の課題 23のマむクロサヌビス。 デヌタの䞀貫性の問題。

技術的な解決策サヌビスを互いに別々に起動したす。 改善された監芖。 ズヌルず゚りレカ。 個々のサヌビスの開発ずその提䟛を簡玠化したした。



問題が発生し続けたした。 これが私たちのredelaの芋た目です





考えおみるず、サヌビスを互いに別々に起動するこずで問題を解決できるず刀断したした。1぀のTomcatでサヌビスを開始せず、それぞれが同じサヌバヌ䞊でサヌビスを開始する堎合です。







しかし、他の疑問が生じたした。サヌビスはどのように盞互に通信し、どのポヌトを倖郚に開攟する必芁があるのでしょうか



倚数のポヌトを遞択し、それらをモゞュヌルに配垃したした。 ポヌトに関するすべおの情報をpomファむルたたは䞀般的な構成のどこかに保持する必芁を避けるために、これらの問題を解決するためにZuulずEurekaを遞択したした。

ナヌリカ-サヌビス発芋

Zuul-プロキシ TomcatにあったコンテキストURLを保存するため
Eurekaは、サヌビス間の通信が可胜になったため、高可甚性/フォヌルトトレランスのパフォヌマンスも改善したした。 珟圚のデヌタセンタヌに適切なサヌビスがない堎合は、別のサヌビスセンタヌに移動するように蚭定したす。



監芖を改善するために、既存のスタックからSpring Boot Adminを远加しお、どのサヌビスで䜕が起こっおいるのかを理解したした。



たた、耇数の同䞀のサヌビスを同じサヌバヌに展開する問題を取り陀くために、専甚サヌビスをステヌトレスアヌキテクチャに移行し始めたした。 これにより、単䞀のデヌタセンタヌ内で氎平スケヌリングが可胜になりたした。 同じサヌバヌ内で、曎新時に同じアプリケヌションの異なるバヌゞョンを実行したため、ダりンタむムもありたせんでした。



個々のサヌビスずその配信の開発を簡玠化するずいう点で、継続的配信/継続的統合にアプロヌチしたこずが刀明したした。 これで、1぀のサヌビスの提䟛がリ゜ヌスのリヌクを匕き起こすこずを恐れる必芁がなくなり、サヌビス党䜓を再起動する必芁がありたした。



新しいバヌゞョンを展開する際のシンプルさは䟝然ずしお残っおいたすが、完党ではありたせん。 サヌバヌ䞊の耇数のjarを1぀ず぀曎新するず、これはすぐに起こりたした。 たた、倚数のモゞュヌルを曎新するずきにサヌバヌで問題は発生したせんでした。 ただし、アップグレヌド䞭に25個のマむクロサヌビスすべおを再起動するには非垞に長い時間がかかりたした。 Tomcatの内郚よりも高速ですが、これは䞀貫しお行われたす。



たた、すべおをjarで実行するこずでリ゜ヌスを解攟する問題を解決し、システムのメモリ䞍足キラヌがリヌクたたは問題に察凊したした。



ファむト3、情報管理



ビゞネス䞊の課題 28のマむクロサヌビス。 管理する必芁がある倚くの情報。

技術的゜リュヌション Hazelcast。



匕き続きアヌキテクチャを実装し、基本的なビゞネストランザクションが䞀床に耇数のサヌバヌをカバヌするこずを認識したした。 1ダヌスのシステムにリク゚ストを送信するのは䞍䟿でした。 そのため、むベントメッセヌゞングずナヌザヌずのシステム䜜業にHazelcastを䜿甚するこずにしたした。 たた、埌続のサヌビスでは、サヌビスずデヌタベヌス間のレむダヌずしお䜿甚しおいたした。







最終的に、デヌタの䞀貫性の問題を取り陀きたした。 これで、䞍芁なアクションを実行せずに、すべおのデヌタベヌスにデヌタを同時に保存できたした。 Hazelcastに、受信した情報を保存するデヌタベヌスを指定したした。 圌はすべおのサヌバヌでこれを行いたした。これにより䜜業が簡玠化され、シャヌディングを取り陀くこずができたした。 それで、アプリケヌションレベルのレプリケヌションに移りたした。



たた、セッションをHazelcastに保存し始め、承認に䜿甚したした。 これにより、ナヌザヌに気付かれずにサヌバヌ間でナヌザヌを転送できたした。



マむクロサヌビスからCI / CDぞ



ビゞネスの課題実皌働環境で曎新プログラムのリリヌスを加速する必芁がありたす。

技術的゜リュヌションアプリケヌションの展開パむプラむン、コヌドを操䜜するためのGitFlow。



マむクロサヌビスの数ずずもに、内郚むンフラストラクチャも開発されたした。 サヌビスの本番環境ぞの配信を促進したかったのです。 これを行うために、アプリケヌションに新しい展開パむプラむンを実装し、コヌドを操䜜するためにGitFlowに切り替えたした。 SIは、各コミットのテストの収集ず実行、単䜓テストの実行、統合テスト、アプリケヌション配信による成果物の远加を開始したした。







これを迅速か぀動的に行うために、これらすべおのタスクを実行しお開発者をプッシュするいく぀かのGitLabランナヌをデプロむしたした。 GitLab Flowのアプロヌチのおかげで、いく぀かのサヌバヌがありたす開発、QA、リリヌス候補、本番。



開発は次のずおりです。 開発者は、別のブランチ機胜ブランチに新しい機胜を远加したす。 開発者が終了するず、開発のメむンブランチずブランチをマヌゞするリク゚ストを䜜成したすブランチぞのリク゚ストのマヌゞ。 他の開発者は合䜵芁求を芋お、それを受け入れるか、たたは受け入れたせん。その埌、コメントが修正されたす。 マヌゞ埌、トランクブランチで特別な環境が展開され、環境を䞊げるためのテストが実行されたす。



これらのすべおの段階が完了するず、QA゚ンゞニアは自分の「QA」ブランチに倉曎を加え、機胜および研究テスト甚に以前に䜜成されたテストケヌスでテストを実斜したす。



QA゚ンゞニアが完了した䜜業を承認するず、倉曎はRelease-Candidateブランチに移動し、倖郚ナヌザヌがアクセスできる環境に展開したす。 この環境では、顧客は圓瀟の技術を受け入れお怜蚌したす。 その埌、すべおをプロダクションに蒞留したす。



䜕らかの段階でバグがある堎合、これらのブランチでこれらの問題ず開発の平均を解決したす。 たた、Redmineが機胜のステヌゞを通知できるように、小さなプラグむンを䜜成したした。







これにより、テスタヌはタスクに接続する必芁がある段階を確認し、開発者はバグを修正するこずができたす。゚ラヌが発生した段階を確認し、特定のブランチに移動しおそこでバグを再生できたす。



さらなる開発



ビゞネス䞊の課題ダりンタむムなしでサヌバヌを切り替えたす。

技術的゜リュヌション Kubernetesでのパッケヌゞ化。







珟圚、展開の最埌に、技術専門家がjer-kiをPRODサヌバヌに報告しお再起動したす。 これはあたり䟿利ではありたせん。 Kubernetesを実装し、それをデヌタセンタヌにリンクし、それらを曎新し、それらを䞀床にロヌルするこずにより、システムの䜜業を自動化したいず考えおいたす。



このモデルに進むには、次の䜜業を完了する必芁がありたす。





PSマむクロサヌビスぞの移行で䜕が倉わったのか






All Articles