Feathers: マむクロサヌビスサヌビスを分割しおアプリをリファクタリングするための掚奚される方法は

䜜成日 2016幎05月19日  Â·  27コメント  Â·  ゜ヌス: feathersjs/feathers

私は、マむクロサヌビススタむルに埓っお、サヌビスを抜出し、それらを独自のむンスタンスに分離するための実甚的/掚奚される方法を芋぀けようずしおいたす。 この問題では、矜のランディングペヌゞに興味深い声明がありたす

サヌビス指向フェザヌ最初からサヌビス指向アプリを構築するための構造を提䟛したす。 最終的にアプリをマむクロサヌビスに分割する必芁がある堎合、移行は簡単で、Feathersはアプリを簡単に拡匵できたす。

しかし、私はただこのナヌスケヌスを矜毛で凊理する方法に぀いおの情報を芋぀けるこずができたせんでした。

実際には、最初は2぀の基本的なトピックに焊点を圓おおいたす。

  • 通信サヌビスの呌び出しをHTTPリク゚ストに眮き換えるなど、サヌビスを抜出し、元のアプリケヌションが倧きな曞き換え䜜業を必芁ずせずに通信を継続できるようにする方法だず思いたす。
  • 認蚌サヌビスが分割された埌、フェザヌがサヌビス間通信に向けお認蚌を凊理する方法に関する説明。

前もっお感謝したす

Documentation Question Scaling

最も参考になるコメント

そうです、ただドキュメントはあたりありたせん。それを远跡するために、少し前にhttps://github.com/feathersjs/feathers/issues/157を䜜成したした。 あなたが蚀及した2぀のトピックに぀いおの私の考えのいく぀かはここにありたす

最初に2぀のサヌビスを備えたサヌバヌがあるず仮定したしょう。

app.use('/users', memory())
  .use('/todos', memory());

ナヌザヌサヌビスは、1぀のサヌバヌが凊理できるよりも倚くのトラフィックを取埗しおいるため、別のアプリを䜜成しお別のシステムに移動したす。

// server1
app.use('/users', memory());
// server2
app.use('/todos', memory());

/todosサヌビスがリモヌトサヌビスず通信できるようにするには、 Feathersをクラむアントずしお䜿甚しお接続できたすWebSocketは高速で双方向なので、サヌバヌ間通信に䜿甚したせんか

// server2
const client = require('feathers/client')
const socketClient = require('feathers-socketio/client');
const io = require('socket.io-client');

const socket = io('http://other-server.com');
const otherApp = client().configure(socketClient(socket));

app.use('/todos', memory())
 .use('/users', otherApp.service('users'));

これは基本的に、WebSocket接続を介しおナヌザヌサヌビスをリモヌトサヌビスに透過的に枡したす。 元の/users゚ンドポむントを䜿甚するものは、䜕も倉曎する必芁はありたせん。

認蚌に関しおは、さたざたなオプションがありたす。 䞊蚘のシナリオでは、 server2が䟝然ずしおクラむアントの唯䞀の通信ポむントであるため、 server1が他のサヌバヌのIPアドレスをホワむトリストに登録するのが最も簡単な方法です。 最終的に、 server2は、ナヌザヌ認蚌を凊理するゲヌトりェむになり、サヌビス呌び出しを他のサヌバヌに枡すだけで枈みたす発信元IPアドレスを確認する以倖に認蚌に぀いお心配する必芁はありたせん。

党おのコメント27件

そうです、ただドキュメントはあたりありたせん。それを远跡するために、少し前にhttps://github.com/feathersjs/feathers/issues/157を䜜成したした。 あなたが蚀及した2぀のトピックに぀いおの私の考えのいく぀かはここにありたす

最初に2぀のサヌビスを備えたサヌバヌがあるず仮定したしょう。

app.use('/users', memory())
  .use('/todos', memory());

ナヌザヌサヌビスは、1぀のサヌバヌが凊理できるよりも倚くのトラフィックを取埗しおいるため、別のアプリを䜜成しお別のシステムに移動したす。

// server1
app.use('/users', memory());
// server2
app.use('/todos', memory());

/todosサヌビスがリモヌトサヌビスず通信できるようにするには、 Feathersをクラむアントずしお䜿甚しお接続できたすWebSocketは高速で双方向なので、サヌバヌ間通信に䜿甚したせんか

// server2
const client = require('feathers/client')
const socketClient = require('feathers-socketio/client');
const io = require('socket.io-client');

const socket = io('http://other-server.com');
const otherApp = client().configure(socketClient(socket));

app.use('/todos', memory())
 .use('/users', otherApp.service('users'));

これは基本的に、WebSocket接続を介しおナヌザヌサヌビスをリモヌトサヌビスに透過的に枡したす。 元の/users゚ンドポむントを䜿甚するものは、䜕も倉曎する必芁はありたせん。

認蚌に関しおは、さたざたなオプションがありたす。 䞊蚘のシナリオでは、 server2が䟝然ずしおクラむアントの唯䞀の通信ポむントであるため、 server1が他のサヌバヌのIPアドレスをホワむトリストに登録するのが最も簡単な方法です。 最終的に、 server2は、ナヌザヌ認蚌を凊理するゲヌトりェむになり、サヌビス呌び出しを他のサヌバヌに枡すだけで枈みたす発信元IPアドレスを確認する以倖に認蚌に぀いお心配する必芁はありたせん。

返信ありがずうございたす このトピックを公匏ドキュメントおそらくガむドのサブセクションで取り䞊げる予定はありたすか この点で私が貢献できるかどうか教えおください。

絶察に。 そしお、私たちは間違いなくいく぀かの助けを䜿うこずができたした。 たぶん、最初にガむドで芋たいものを集めおから、いく぀かのデモアプリケヌションを䜜成したしょう。

💯@ dafflは倧

@dafflバック゚ンドマむクロサヌビスでfeathers-clientを䜿甚しお蚀及したアプロヌチでは、socket.ioが䜿甚されおいるため、ストリヌミングデヌタを介した双方向通信が可胜です。 フェザヌには、このシナリオのセマンティック/ APIがすでにありたすか マむクロサヌビスが、ブラりザヌクラむアントではなく、他の関心のあるマむクロサヌビスのむベントを公開する状況を考えおいたす。

はい、しかしなぜ他の関心のあるサヌビスもWebSocketを䜿甚できなかったのですか 他のプロバむダヌを远加するこずを考えおいたすたずえば、さたざたなメッセヌゞングサヌビス甚が、今のずころWebSocketは十分に高速であるように思われ、ブラりザヌでのみ䜿甚できるようにどこにも蚘述されおいたせん。

@daffl @ekryskiフェザヌアプリケヌションが配垃されるようになるず、少なくずも1回の配信ack、べき等、トランザクション、バックプレッシャヌキュヌなどの問題にも察凊する必芁がありたす。「feathers-service-劎働者」..すなわち。 氞続的なamqp぀たりrabbitmqキュヌたたはredis぀たりkueを䜿甚からのむベントを消費する倖郚プロセス

@dafflあなたの答えの前に私はよく理解しおいなかったず思いたす。 関心のあるサヌビスがWeb゜ケットを䜿甚しおプロデュヌサヌサヌビスにサブスクラむブし、通垞のむベントAPIを䜿甚しおプロデュヌサヌに新しいむベントを公開する限り、これをフェザヌで実装するだけで十分です。

@justingreenbergに同意したす。察凊すべき別の問題は、責任のあるマむクロサヌビスがオフラむンになったずきにリク゚ストを再生するこずですクラッシュ、曎新など。 技術的には、これもメッセヌゞキュヌを䜿甚しお察凊したす。

これに぀いお䜕か進展はありたすか 私は本圓にいく぀かのドキュメント/実甚的な䟋を芋たいです。 特に認蚌の凊理方法に関しお。

@imns私たちはこれに取り組んでいたす。 私は䟋に取り組み始め、アプリを分割したしたが、認蚌の蚭定方法にいく぀かの制限があるこずに気付きたした。 そのため、珟圚、これをより適切にサポヌトするために認蚌をリファクタリングしおいたす。 それが着陞するのに玄1週間かかるはずです。

ああ、私は今これをずおもひどく䜿うこずができたD

奜奇心から、耇数のフロント゚ンドでも機胜するように認蚌を䜜り盎しおいたすか 最近の倧芏暡なアプリの倚くは、バック゚ンドでマむクロサヌビスを䜿甚しおいたすが、フロント゚ンドアプリも分割しおいるず思いたす。

少し䜙分なお金がある堎合は、この本を読むこずをお勧めしたす https //www.amazon.com/Building-Microservices-Sam-Newman/dp/1491950358/ref=sr_1_1ie = UTF8qid = 1469071253sr = 8-1keywords =マむクロサヌビス

みんな、これに関する曎新はありたすか ありがずうございたした。

@juanpujol最新情報は垞にこのチケットに含たれおいたす。 でもチェックしおくれおありがずう。

ここのmarcfawzi

スレッド党䜓を読んだわけではありたせんが、サヌビスごずにデヌタベヌスを䜿甚できるず思いたすMicreoservicesアヌキテクチャでは、抜象化を維持するためにこの分離が重芁です。そうでない堎合、すべおのサヌビスが同じデヌタベヌスを共有しおいるず、人々を劚げるこずになりたす。統䞀されたサヌビスAPIを䜿甚しおサヌビスを構成する代わりに、サヌビスモデル間の関係を定矩するこずマむクロサヌビスの抜象化の違反から

それを本圓に劚げるものは䜕もありたせん、私はあなたがそれをしないのはあなた次第だず思いたす。 モデルず関係をORMレベルで定矩する堎合にのみ、実際に問題になりたす。 別のサヌビスを呌び出すこずによっおサヌビスレベルで関係を取埗するこずは、マむクロサヌビスの抜象化に違反するずは思いたせん。

ええ、たさに私が意味したこずです。 私は、各サヌビスが独自のデヌタベヌスを持っおいるサヌビスの分離は、ORMレベルではなく、サヌビスむンタヌフェむスを介しお構成を匷制する確実な方法であるず考える傟向がありたす。

ただし、Feathersはマむクロサヌビスフレヌムワヌクよりも䞀般的であるため、ここではすべお問題ありたせん。 ありがずうデビッド これは私がそれを掘り䞋げるほど芋栄えが良くなり続けたす すべおの呚りの玠晎らしい仕事

ここでこれに぀いお蚀及しようず思ったのは、マむクロサヌビス環境でFeathersを䜿甚する際に発生する問題のいく぀かを解決するためです。 これは最初の実装にすぎたせんが、䜕か貢献できるこずがあれば、ここに気軜にアクセスしお

有望に芋える@ zapur1 ...ディスカッションを始めるためにコメントを投皿したした

https://github.com/feathersjs/feathers-syncをrabbitMQ、Redis、たたはMongoDBずずもに䜿甚しお、サヌビス間のメッセヌゞブロヌカヌずしお䜿甚し、すべおの同期を維持するこずもできたす。

@ekryski feathers-sync 、少し異なる問題を解決したす。名前付きサヌビスFeathersサヌビスではなくマむクロサヌビススタむルのサヌビスの領域内でむベントを1回だけ受信する堎合はどうなりたすか 単䞀のAPIアプリからむベントを受信する単䞀のサヌビスの耇数のむンスタンスがある堎合、それぞれがむベントを受信し、たったく同じコヌドの耇数のむンスタンスでそのむベントが受信されたずきに実行されるアクションを耇補する可胜性がありたす。

@ekryskiリポゞトリをもう䞀床確認したずころ、zapur1 / feathers-rabbitmqが「譊告」で蚀及した問題を正確に解決したした。

socketClientによっおサヌビス1をサヌビス2に接続する堎合、サヌビス2にマルチむンスタンスがある堎合、負荷分散を実装するにはどうすればよいですか:(

socketClientを介しお接続する別のサヌバヌサむドアプリを䜜成する堎合、蚭定されおいる制限に関係なくすべおのサヌビスを利甚できるように認蚌するための最良の方法は䜕ですか。

https://github.com/kalisio/feathers-distributedを䜿甚しお、これに2セントを远加しhttps://github.com/feathersjs/feathers-syncずは異なり

  • 認蚌管理
  • APIゲヌトりェむず負荷分散
  • リモヌトフックの呌び出し
  • ..。

サヌバヌ1ずサヌバヌ2を含む䟋の@dafflは、サヌバヌ2の/usersサヌビスをどのように保護したすか サヌバヌ2でそのサヌビスを定矩しおいる堎合、特定のサヌビスフックファむルでフックを䜿甚できたすが、 app.use('/users', otherApp.service('users'));を実行しおいるため、サヌバヌ2からのそのサヌビスぞの呌び出しのみが実行されるようにするにはどうすればよいでしょうか。ナヌザヌが最初に認蚌した堎合は

線集
Nvm、私は考えがあるず思いたす const usersService = app.service('users') 、次にusersService.hooks(hooks)ようなこずを行うこずができたす。ここで、フックにぱンドポむントを正しく保護するために必芁な認蚌フックがありたすか

分散認蚌を行う方法に぀いおは、 https 

サヌビスを分割する方法はいく぀かあり、それぞれに長所ず短所がありたす。 Feathersにずっお䞀般的に重芁なこずの1぀は、セッションがなく、JSONWebトヌクンだけであるずいうこずです。 JWTはステヌトレスであり、同じシヌクレットを共有する任意のサヌバヌで読み取るこずができるため、䞭倮のセッションストアが必芁ありたせん。 私が考えるこずができる2぀の䞻なオプションは次のずおりです。

  1. 接続されおいるすべおのクラむアントの承認ず管理を凊理するメむンアプリケヌションがありたすが、デヌタベヌスず通信するサヌビスではなく、内郚ネットワヌク内の個別の単玔な個別のAPIサヌバヌに接続したす。 これはセットアップが簡単で、内郚APIサヌバヌが非垞にシンプルで、認蚌をたったく必芁ずしないずいう利点がありたすメむンアプリケヌションはすべおを実行でき、認蚌されたナヌザヌの制限に埓っおク゚リを実行するため。 欠点は、メむンアプリケヌションが䟝然ずしおボトルネックであるずいうこずですただし、基本的に内郚APIのプロキシずしお機胜するため、負荷が枛少したす。

my50m

  1. すべおのクラむアントは、JWTを䜿甚しお必芁なすべおのAPIサヌバヌに接続したす。 JWTは、個別の認蚌たたはナヌザヌAPIによっお䜜成されたす。 唯䞀のボトルネックは、䞀般的なナヌザヌサヌビスから最新のナヌザヌ情報を取埗するこずであるため、これはよりスケヌラブルな゜リュヌションです垞に必芁な堎合もありたせん。 欠点は、クラむアント偎での管理がより耇雑であり、認蚌少なくずもJWTの堎合をすべおのサヌバヌで構成する必芁があるこずです。 ただし、JWTはステヌトレスであるため、共有セッションは必芁ありたせん。

lw1bg

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡