マむクロサヌビスに関する簡単なブログを準備し、PHPでマむクロフレヌムワヌクを蚘述し、Dockerですべおの䟋を実行したす

しかし、新補品がマむクロサヌビスアヌキテクチャ䞊ですぐに曞き始められ、モノリスの切断に察凊するこずはできないず蚀ったらどうでしょうか。 これは䞀般的に正垞ですか 䟿利ですか 答えを知りたいですか


タスクフレヌムワヌクを䜿甚せずに、週末時間は10〜15時間に制限されたすにPHPでマむクロサヌビスに関する球状のブログを曞く必芁がありたす。 垞識を䜿甚できたす。 たた、フロント゚ンドに぀いおも忘れ、仮想化なしでは生きおいけないこずを忘れないでください。 Dockerを遞択したす。 面癜い 猫に転送したす。


画像

マむクロサヌビス


マむクロサヌビスのアプロヌチに興味があるが、どこから始めればよいかわからない堎合は、Sam Newmanの著曞 『Building Microservices』から始めおください。 このアプロヌチの䞻なポむントを少し説明しようず思いたすが、远加があればコメントに曞いおください。 䞀般に、䜕らかの理由で、私は、特にあなたの特定のケヌスで、以䞋に説明するアプロヌチのいずれかに圓おはたるふりをしたせん。


前述のブログの䟋ですべおを怜蚎したす。 もちろん、これはタスクのためのタスクですが、このバヌゞョンでも動䜜し、正垞に動䜜するこずに泚意しおください迅速か぀問題なく。


マむクロサヌビスの本質は、モノリシックアヌキテクチャず比范しお理解しやすいです。 通垞のブログ゚ンゞンはどのように芋えたすか 倧たかに蚀っお、これは1぀のアプリケヌションにすぎたせん。 蚘事、コメント、ペヌゞ、ナヌザヌ、およびその他の機胜ナニットの操䜜は、決しお共有されない単䞀の゜ヌスコヌドパッケヌゞに含たれおいたす。



コンポヌネント間のすべおの接続がコヌド内の呌び出しである堎合、クラス、パタヌンなどの間の䜕らかの関係 たたは、互いに分離するこずが䞍可胜な堎合は、単にgovnokodでさえもです。


ブログはどのように衚瀺されたすか はい、ほが同じ、正盎に蚀うず。



唯䞀の違いは、コンポヌネントのあるボックスが1぀のアプリケヌションのコヌドに囲たれたコンポヌネントではなくなり、矢印がこのコヌド内のクラスのシステムコヌルではなくなったこずです。 珟圚、これらは個別のコンポヌネントであり、矢印は通垞のhttp芁求です。


なぜこれが必芁なのですか おそらく誰もがこれを必芁ずしおいるわけではないずすぐに刀断したす。 これは、かなり倧きな䌚瀟で、各サヌビスに開発チヌムを割り圓おるこずができる堎合に非垞に䟿利です。 䞭芏暡の䌚瀟であっおも、各サヌビスに人を割り圓おるずいいず思いたす。 ただし、䌚瀟党䜓で自分が1人であっおも、マむクロサヌビスには興味深いものがありたす。


サヌビスの倧きさはどれくらいですか 境界線を匕くのは困難です。間違いは倚倧な費甚がかかりたすが、芁するに、サヌビスはシステムの特定の単䜍であり、短時間で完党に曞き換えるこずができたす。 経隓的に、あなたたたはあなたのチヌムに1週間でサヌビスに察応させおください。 ここでの䞻なアむデアは、サヌビスを小さくするこずです。 圌らはモノリスの束になっおはいけたせん。


だから、私が自分のために遞べる肯定的なこずは、䞀般に、すべお同じ傟向にありたす開発のための信じられないほどの䜿いやすさ



私たちのアプリケヌションは䜕ができるはずですか それほど倚くはありたせん。
4ペヌゞ



機胜は簡単です



Docker



これで、理論に぀いおはもう話さず、アプリケヌションをカットしたしょう。 ドッキングりィンドりに配眮したす。 このような分散アプリケヌションを仮想化なしで1台のマシンで開発するこずはほずんど䞍可胜です。 Dockerの説明は、この蚘事の範囲を超えおいるため、フラグメントで衚瀺されたす。 あなたは圌に぀いお䜕かを知っおいるず仮定されたす。


ずころで、ここにブログをダりンロヌドしお実行できるカブぞのリンクがありたす。以䞋のコヌドを䜿甚しお䜕かを参照しおください。 https://github.com/gregory-vc/blog


私たちの最も単玔なブログにはいく぀のコンテナがありたすか ちなみに、コンテナは、本質的には、ネットワヌクを介しお他のコンテナず通信する別のサヌバヌの仮想化です。ただし、厳密な類䌌のcontainer = serverを䜿甚する堎合、䞀郚のコンテナは攟棄する必芁がありたす。 マむクロサヌビスに関するブログの最も簡単な実装では、24個のコンテナヌをカりントしたした。 芋おみたしょう。



䞀郚のサヌビスのコピヌが2぀あるのはなぜですか なぜならそれは面癜くなく、はっきりしないからです。


1぀のコマンドですべおをデプロむするdocker-composeファむルは次のようになりたす。
https://github.com/gregory-vc/blog/blob/master/host/docker-compose.yml
最も興味深いものから、ゲヌトりェむコンテナのphp蚭定を怜蚎したす。


'php_gate': image: 'tattoor/blog_php' container_name: 'php_gate' volumes_from: ['source_gate'] volumes: ['./logs/php/gate/:/var/log/dev_php'] links: - nginx_post_1:post1.blog - nginx_post_2:post2.blog - nginx_comment_1:comment1.blog - nginx_comment_2:comment2.blog - nginx_auth_1:auth1.blog - nginx_auth_2:auth2.blog - redis environment: - POST_1_HOST=post1.blog - POST_1_PORT=80 - POST_2_HOST=post2.blog - POST_2_PORT=80 - COMMENT_1_HOST=comment1.blog - COMMENT_1_PORT=80 - COMMENT_2_HOST=comment2.blog - COMMENT_2_PORT=80 - AUTH_1_HOST=auth1.blog - AUTH_1_PORT=80 - AUTH_2_HOST=auth2.blog - AUTH_2_PORT=80 

リンクコンテナの説明セクション。これは基本的に/ etc / hosts /


 docker exec php_gate cat /etc/hosts 172.17.0.36 auth1.blog 86b8b266477d nginx_auth_1 172.17.0.36 nginx_auth_1 86b8b266477d 172.17.0.21 comment1.blog 836bacb42e78 nginx_comment_1 172.17.0.19 comment2.blog c554a8888801 nginx_comment_2 172.17.0.20 post2.blog 37f81921419c nginx_post_2 172.17.0.7 redis a1932016be87 172.17.0.37 auth2.blog 5715045a213b nginx_auth_2 172.17.0.37 nginx_auth_2 5715045a213b 172.17.0.21 nginx_comment_1 836bacb42e78 172.17.0.19 nginx_comment_2 c554a8888801 172.17.0.22 nginx_post_1 1cc1ef5ab896 172.17.0.22 post1.blog 1cc1ef5ab896 nginx_post_1 172.17.0.20 nginx_post_2 37f81921419c 172.17.0.23 fafe93f31a67 

指定されたホストで、Dockerの内郚ネットワヌクを介しお別のコンテナにアクセスするだけです。


たた、環境セクションは、getenvを介しおアプリケヌション内で取埗できる倉数の指定にすぎたせん。 docker-composeファむルがアプリケヌション党䜓を蚭定するための単䞀の゚ントリポむントになるように䜜成されたす。


サヌビスの構造は、ディレクトリが近くにあるように芋えたすが、



しかし、実際には、ホストのドッカヌを起動するず、これらの各ディレクトリは個別の分離された察応するコンテナ内に衚瀺されたす。 それは䜕らかの圢で行われたす


 'source_post_1': volumes: ['../Services/Post:/home/gregory/source/'] 

぀たり、それらはもうすぐ近くにありたすが、起動時には、あるサヌビスなどから別のサヌビスのクラスを含める機䌚はありたせん。 近くにあるのは利䟿性のためだけであり、実際にはお互いにたったく觊れずに、それぞれがリポゞトリ内にある必芁がありたす。


ゲヌトサヌビス



このサヌビスは、ブログぞの゚ントリポむントずなり、テンプレヌトをレンダリングし、結果を衚瀺し、必芁なサヌビスを匕き出したす。 ずころで、さたざたなアプロヌチがありたす。たずえば、単䞀の゚ントリポむントを拒吊し、すべおをフロント゚ンドに実装できたす。 ぀たり、ブラりザ自䜓が必芁なサヌビスにアクセスし、ブラりザで結果を盎接収集したす。 私が蚀えるこずは、それはすべおあなたの特定のケヌスに䟝存し、そこにはプラスずマむナスがありたす。


だから、私たちはPHPを持っおいたす。 ずはいえ、少なくずも䜜曲家を連れお行きたしょう。 さらに2぀のディレクトリを䜜成しおみたしょう。1぀はマむクロフレヌムワヌク甚で、これはこれから䜜成したす。2぀目はパブリックスクリプト、js、およびその他のリ゜ヌス甚です。


次のようになりたす。



コンポヌザヌでは、単玔にオヌトロヌドを実装する堎所を指定するため、これに煩わされるこずはなく、生成されたオヌトロヌドをpublic / index.phpに接続したす。


だから、私たちはすでに䜕かを持っおいたす、私たちがただ必芁なものを決定したしょう



悪くない、他に䜕



このようなオブゞェクトのリポゞトリを䜜成しお、どこにも䜜成しないようにしたす。ただし、必芁な䟝存関係をすべお備えたアプリケヌションの任意の時点で既に䜜成されたアプリケヌションにアクセスむンゞェクトできるようにしたす。 Reflectionやその他の興味深いこずを楜しむこずはありたせん。時間は厳しく制限されおいたす。


  Storage::set('Request', new Request()); Storage::set('Router', new Router()); Storage::set('Redirect', new Redirect()); Storage::set('App', new App()); 

Diでは、このリポゞトリを䜿甚しお、必芁なオブゞェクトをすべお远加したす。
公開では、Diを起動し、ルヌタヌを取埗し、䟿利なすべおのURLを登録し、アプリケヌションを受け取っお起動したす。


  $router->get('/logout/', 'AuthController@logout'); $router->get('/404', 'SystemController@notFound'); $router->post('/post/add_request/', 'PostController@add') 

アプリケヌションでは、芁求を取埗し、この芁求に察する既存のコントロヌラヌの既存のアクションをルヌタヌにマッピングするず同時に、受信したすべおのポスト倉数たたは取埗倉数を芁求に曞き蟌みたす。


コントロヌラヌメ゜ッドを実行し、応答を取埗し、応答をレンダリングしお、䜜業の結果を衚瀺するだけです。


  $current_request = $this->router->getCurrent(); $controller = new $current_request->controller; $response = $controller->{$current_request->method}(); $response->render(); 

フレヌムワヌクがあり、サヌビスを操䜜し、サヌビスを含むディレクトリを䜜成し、各サヌビスのクラスを䜜成し、各サヌビスのアクセスポむントを蚘述する必芁がありたす。 ク゚リオプションを実装するサヌビスのメむンクラスからそれらを継承したす。


https://github.com/gregory-vc/blog/blob/master/Services/Gate/My/Engine/Service.php


  static public function get($method, $params = []) { $service = new static; return $service->executeGet($method, $params); } static public function post($method, $params = []) { $service = new static; return $service->executePost($method, $params); } 

そこで、リク゚スト内で、サヌビスによっお提䟛されるコネクタからランダムなコネクタを遞択したす。


  $rand_connector = rand(0, $count_connector) % $count_connector; 

コントロヌラからリク゚ストを䜜成し、次のようにレンダリングしたす。


  $posts = Post::get('all'); return $this->response->html('posts', $posts); 

レンダリングする必芁がありたすが、どうやっお テンプレヌト゚ンゞンはありたせん。 自分で曞きたすか いえいえ phpを䜿甚しおください。


  ob_start(); require_once($layout_template); $contents = ob_get_contents(); ob_end_clean(); $this->content = $contents; 

4行のサむズの非垞に匷力なテンプレヌト゚ンゞン。


投皿およびコメントサヌビス


次は これで、リク゚ストを䜜成しお結果を衚瀺できるようになりたした。次に、答えを提䟛するサヌビスを䜜成する必芁がありたす。 新しい゚ンゞンを他のサヌビスにコピヌし、URLを倉曎し、リモヌトサヌビスの代わりにモデルずデヌタベヌスで䜜業を蚘述したす。


デフォルトではfindAll、findBy、add、saveのモデルで䜜業を実装したす
https://github.com/gregory-vc/blog/blob/master/Services/Auth/My/Engine/Model.php


それで䜕 正盎に蚀うず、承認を陀けば、それだけで十分です。
他のサヌビスから他のサヌビスたで、あらゆるサヌビスのゲヌトリク゚ストを行うこずができたす。


認可サヌビス
スキヌムは単玔です。ナヌザヌずそのアクセス暩が承認サヌバヌにあり、ゲヌトりェむから承認リク゚ストを䜜成し、トヌクンを生成し、それをゲヌトりェむず別のナヌザヌに返し、ナヌザヌずトヌクンをセッションに入れたす。 投皿を远加するリク゚ストず䞀緒にトヌクンを送信するこずを忘れられない、䜕のため そうです、郵䟿サヌビスは承認サヌビスに行き、このトヌクンが良いかどうかを尋ねたすか 結果に応じお、ゞェネレヌタヌの実行は異なりたす。


  public function login($user, $password) { $hash = hash('sha256', $password); $user = User::findBy([ 'login' => $user, 'password' => $hash ]); if (!empty($user) && is_array($user)) { $user = current($user); $user['token'] = bin2hex(random_bytes(30)); User::save($user); return [ 'login' => $user['login'], 'token' => $user['token'] ]; } else { throw new \Exception('Not found user'); } } 

結果


䞀般に、1぀のコマンドでダりンロヌドしおデプロむできたす。リポゞトリを思い出させたす https : //github.com/gregory-vc/blog


意味のどこに収たるか-明確にするために、この特定のノヌドたたはこのブロックが生成されたノヌドを掚枬したした。


たた、ペヌゞが生成された時間にも感銘を受けたした。 これは、投皿ずいく぀かのコメントがあるペヌゞの堎合、5〜9ミリ秒です。 はい、これはすべお偏っおいたす、はい、これらはすべおオりムです、はい、マむクロサヌビスはそれずは䜕の関係もありたせん、はい、比范するものに䟝存したす。 しかし。 同じキャラメルがそのペヌゞを生成したす。䞀般に、リク゚ストずデヌタはなく、自分のマシン䞊で90ミリ秒間、あいさ぀だけです。 これは10〜20倍長くなりたす。


比范するのではなく、さらに倚くのこずが行われおいるこずを理解しおいたすが、それでも、別の分離されたマむクロサヌビスのこの特定の珟圚のタスクでは、これはすべお必芁ではありたせん。 コメントサヌビスに぀いおは、ネットワヌク経由でサヌビスを扱うクラスを廃止したした。 ゲヌトりェむサヌビスの堎合、基本クラスを砎棄したした。 特定のサヌビスごずに、圌が必芁ずするものだけを収集したした。 そしお、適切なサヌビスはほんの少し必芁です:)


そしお最も重芁なこずは、これはこのブログを信じられないほどのワヌクロヌドに拡倧するための信じられないほどの可胜性です。 たずえば、誰も干枉せず、Goのコメントサヌビスを䜿甚しお曞き換えたす。


問題


ネットワヌクオヌバヌヘッド
別のサヌビスがどのように機胜するかわからない堎合、ひどく機胜せず、すべおを損なう状況になる可胜性がありたす。たた、サヌビスを䜿甚したす結果を提䟛したす。


すべおを詊す方法を思い出させおください


 Clone git clone https://github.com/gregory-vc/blog.git . Install Docker: wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker user sudo apt-get install python-pip sudo pip install docker-compose Compile chmod 744 compile ./compile chmod 744 upload_db ./upload_db Run http://gate.blog:30001/ admin admin 


Source: https://habr.com/ru/post/J302844/


All Articles