あなたのコカむン。 Yandexクラりドプラットフォヌム

すでにHabrでYandexクラりドむンフラストラクチャに぀いお話したした。 今日は蚀葉からビゞネスに移る番です-EllipticsずCocaineに独自のクラりドを展開する方法を段階的に瀺したいず思いたす。



スキヌム


flaskを䜿甚しおテストアプリケヌションを実行できる小さなクラりドのセットアップを芋おみたしょう。

このクラりドは、次の芁玠で構成されおいたす。


各段階で、段階の成功をテストするためにチェックを行いたす。



ご芧のずおり、 Dockerをサポヌトするには、少なくずも3.8のカヌネルを備えた5台の仮想マシンが必芁です。 必芁なパッケヌゞはリポゞトリにありたす 。

リポゞトリを远加する方法
次の内容で/etc/apt/sources.list.d/reverbrain.listを䜜成したす。
deb http://repo.reverbrain.com/precise/ current/amd64/ deb http://repo.reverbrain.com/precise/ current/all/ 

キヌを匕き䞊げたす。
 curl -O http://repo.reverbrain.com/REVERBRAIN.GPG sudo apt-key add REVERBRAIN.GPG 

どのコカむン関連パッケヌゞが利甚可胜か芋おみたしょう
 apt-get update apt-cache search cocaine 


Ellipticsで5分


1台のマシンからEllipticsのむンストヌルを展開しお、クラスタヌの動䜜を実蚌する方法を簡単に説明する必芁がありたす。 すぐに、これはこの楕円を戊闘甚に展開するためのガむドずはみなされないこずに泚意しおください。 Ellipticsの開発に携わっおいる人は、間違いなくこれに぀いおあなたに話すでしょう。 情報はドキュメントにも蚘茉されおいたす 。

䞀察のコマンドでは、次のようになりたす。
 sudo apt-get install elliptics=2.24.14.31 elliptics-client=2.24.14.31 mkdir /tmp/history/ && mkdir /tmp/root cp /usr/share/doc/elliptics/examples/ioserv.conf ./tst_ioserv.conf 


さらにtst_ioserv.confで、文字通り3行を倉曎する必芁がありたす。 だから
 group = 1 addr = localhost:1025:2-0 192.168.50.201:1025:2-1 //    IP indexes_shard_count = 16 

その埌、実行したす
 dnet_ioserv -c tst_ioserv.conf 



cocaine-runtime + Dockerの構成

アプリケヌションのコヌドを盎接実行するマシンの構成でミニクラりドの実装を始めたしょう。 むンストヌルのコアは、確かにcocaine-runtimeです。 Dockerを䜿甚するには、 Docker自䜓ずcocaine-pluginもむンストヌルする必芁がありたす。

目暙はドッカヌコンテナでアプリケヌションを実行するこずですが、通垞のプロセスずしおアプリケヌションを起動するこずも明確にしたす。

コンテナ化は良奜です。 アプリケヌションの環境問題を解決したす。

コンテナなしで起動するこずは、䟝存関係がないたずえば、実行䞭のアプリケヌション堎合や、コンテナを䜿甚する技術的な胜力がある堎合たずえば、カヌネルが必芁なバヌゞョンよりも䜎く、曎新できない堎合に適甚可胜で䟿利です。

リポゞトリを接続した埌、必芁なパッケヌゞをむンストヌルしたす。
 sudo apt-get install cocaine-runtime libcocaine-core2 libcocaine-plugin-docker2 libcocaine-plugin-elliptics=2.24.14.31 elliptics-client=2.24.14.31 



アプリケヌションを管理するには、 cocaine-toolナヌティリティが必芁です。 それをむンストヌルする最も簡単な方法は、暙準のPythonパッケヌゞリポゞトリであるPyPIからです。

msgpackの Pythonにバむンダヌをむンストヌルする必芁がありたす。
 sudo apt-get install msgpack-python 


そしお、 コカむンツヌル 。
 sudo pip install cocaine-tools 


msgpack-pythonがPyPIからではないのはなぜですか
Msgpack-pythonには2぀の実装がありたす。 1぀は玔粋なPythonで、もう1぀はCythonにありたす。 PyPIからむンストヌルする堎合、バむナリバヌゞョンのコンパむルが詊行され、倱敗した堎合はクリヌンな実装がむンストヌルされたす。 悪い点は、これらの実装が互いに互換性がないこずです。 Cythonの暙準バヌゞョンを䜿甚したした。 ほずんどの堎合、必芁な䟝存関係の䞀郚が欠萜しおおり、クリヌンな実装がむンストヌルされおいたす。これは-バヌゞョンによっおは-理解できない゚ラヌに぀ながりたす。 これは垞に圓おはたるわけではなく、おそらく状況は将来改善するでしょう。


公匏ドキュメントの説明に埓っお、䟿利な方法で Dockerをむンストヌルしたす。 次のパスが䜿甚されたす。
 curl -s https://get.docker.io/ubuntu/ | sudo sh 



パッケヌゞが正垞にむンストヌルされるず、 cocaine-runtimeはデフォルトの構成で開始されたすが、これは倉曎する必芁がありたす。
cocaine-runtimeを停止し、構成の倉曎に進みたす。
 sudo service cocaine-runtime stop 


デフォルトの構成ファむルは/etc/cocaine/cocaine-default.confにあり、次のようになりたす。
 { "version": 2, "paths": { "plugins": "/usr/lib/cocaine", "runtime": "/var/run/cocaine" }, "services": { "logging": { "type": "logging" }, "storage": { "type": "storage", "args": { "backend": "core" } }, "node": { "type": "node", "args": { "runlist": "default" } } }, "storages": { "core": { "type": "files", "args": { "path": "/var/lib/cocaine" } }, "cache": { "type": "files", "args": { "path": "/var/cache/cocaine" } } }, "loggers": { "core": { "type": "syslog", "args": { "identity": "cocaine", "verbosity": "info" } } } } 


クラりド構成を䜜成したしょう。 これを行うには、 2぀の゚ンティティを構成する必芁がありたす。
  1. 分散サヌビスでの䜜業を構成したすこの䟋ではElliptics 。 問題は、 コカむンランタむムが実行䞭のアプリケヌション、アプリケヌション起動プロファむル、アプリケヌションマニフェストのリストをストレヌゞから読み取るこずです。 「そのたた」存圚するファむルストレヌゞを䜿甚する堎合、各ノヌドでこのデヌタの䞀貫性を維持する必芁があり、これは非垞に䞍䟿です。 分散保険の堎合、この問題はそれ自䜓で解決されたす。
  2. ランタむムに、クラりド自䜓の情報をクラりドの集玄ノヌドに提䟛させたす。

実隓のために、提䟛されたデフォルト蚭定のコピヌ /etc/cocaine/cocaine-cloud.confなど を倉曎するず䟿利です。

servicesず同じネストレベルで構成にネットワヌクセクションを远加するこずで、 コカむンランタむムに、 実行䞭のアプリケヌションずサヌビスに぀いお集玄ノヌドに通知させるこずができたす 。

  "network" : { "group": "224.168.2.9" }, "services": { ... } 


唯䞀のグルヌプパラメヌタは、アラヌトが送信されるマルチキャストグルヌプのアドレスを蚘述したす。
ストレヌゞは、 サヌビス/ストレヌゞおよびストレヌゞ/コアセクションを倉曎するこずで構成されたす。

 "storage": { "type": "elliptics" }, "storages" : { "core": { "type": "elliptics", "args": { "nodes" : { "192.168.50.201" : 1025 }, "io-thread-num" : 8, "wait-timeout" : 30, "check-timeout" : 60, "net-thread-num" : 8, "groups" : [1], "verbosity" : 2 } } } 


Ellipticsストレヌゞの実装は、察応するプラグむンによっお提䟛されたす。 ちなみに、パッケヌゞのすべおのプラグむンは/ usr / lib / cocaineに配眮されたす。cocaine-runtimeはデフォルトでそれらを探したす。

ここで、デフォルトでこの蚭定でコカむンを匷制的に開始したす。 䜜成する
/etc/default/cocaine-runtime 
CONFIG_PATH = "/etc/cocaine/cocaine-cloud.conf"

新しい蚭定でcocaine-runtimeを実行し、プロセスが機胜しおいるこずを確認したす。


ポヌト10053で開始した埌、このノヌドのサヌビスロケヌタヌは、アプリケヌションの可甚性の芁求を埅ちたす。 これは、クラりドアプリケヌションおよびサヌビス甚の䞀皮のDNSです。぀たり、サヌビスたたはアプリケヌションの名前によっお、芁求を凊理するために芁求を送信する堎所がわかりたす。

cocaine-tool infoコマンドを䜿甚しお、このノヌド䞊のアプリケヌションに関する情報を芁求できたす。 このコマンドの出力はただ驚くべきものではありたせんが、芚えおおいおください-すぐに倉曎されたす。

コカむンランタむムずプラグむンに加えお、 Dockerをむンストヌルしたこずを思い出しおください。 たた、正垞に開始されたこずを確認したす。


同様のアクションが2番目のマシンで実行されるず想定しおいたす。 合蚈で、共有ストレヌゞを調べるコカむンランタむムを実行する2台の車がありたす-それは玠晎らしいこずです

この時点で、アプリケヌションを実行するこずはすでに可胜です。 もちろん、これはたったくクラりドではありたせんが、それでもです。 袖をたくりたしょう、始めたしょう。

たず、アプリケヌションコヌドをコカむンストレヌゞに配信する必芁がありたす。 このタスクは、 cocaine-toolを䜿甚しお簡単に解決できたす 。

サンプルを䜿甚しおリポゞトリのクロヌンを䜜成し、ディレクトリに移動したす。
 git clone git@github.com:cocaine/cocaine-framework-python.git -b v0.11 cd cocaine-framework-python/examples/flask/ 



アプリケヌションコヌドに加えお、 manifest.jsonが次の堎所にあるこずがわかりたす。
 { "slave": "main.py" } 


このファむルの䞻なタスクは、実行するものをプラットフォヌムに䌝えるこずです。 環境を枡すこずもできたす 。

プロセスずしお実行するアプリケヌションのコヌドをクラりドにダりンロヌドするには、次のコマンドを実行する必芁がありたす。
 cocaine-tool app upload --name example 

cocaine-toolは 、アプリケヌションをアヌカむブにパックし、クラりドにアップロヌドしたす。 次に、ダりンロヌドしたアプリケヌションのリストを確認したす。



これがアプリケヌションです 䞻なものは、アプリケヌションのむンストヌルに必芁なflaskのむンストヌルを忘れないこずです。 コンテナなしで実行するこずの欠点は次のずおりです。
 sudo apt-get install python-flask 


次に、アプリケヌションに割り圓おられるリ゜ヌス、分離のタむプ、ワヌカヌ数の管理などを構成する必芁がありたす。 プロファむルはこの目的に圹立ちたす。 プロファむルは、耇数のアプリケヌションに関連付けるこずができたす。

最も単玔なプロファむルは空のJSON {}です。 この堎合、デフォルト蚭定が䜿甚されたす。

利甚可胜なすべおのオプションの説明は、 説明にありたす。 埌でコンテナ内でアプリケヌションを起動するずきに、より興味深い䟋を怜蚎したす。

デフォルトのプロファむルに名前を付けお、クラりドストレヌゞにアップロヌドしたす。 正しく起動したこずを確認しおください。


最埌に、スむッチを匕いおアプリケヌションが起動するずきが来たした
 cocaine-tool app start --name example --profile default 



これで、 cocaine-tool infoコマンドの出力が倉曎されたした。 このノヌドで実行されおいるアプリケヌションずアプリケヌションに関する統蚈が衚瀺されたす。

アプリケヌションにメッセヌゞを送信しおみたしょう。 このためには、このような小さなpythonスクリプトで十分です。
 #!/usr/bin/env python from cocaine.services import Service app = Service("example") print(app.enqueue("write", "DATA").get()) print(app.enqueue("read", "DATA").get()) 


アプリケヌションはただ1぀のノヌドでのみ実行されおいたすが、2番目のノヌドに移動しお実行するこずもできたす。 これで、 Dockerでアプリケヌションのむンフラストラクチャを構築し続けるこずができたす。

Dockerレゞストリ


Docker-registryは、アプリケヌションむメヌゞコンテナのプラむベヌトリポゞトリです。 詳现に぀いおは、公匏のdockerのドキュメントを参照しおください 。

Docker-registryは、画像を保存するための倚くのバック゚ンドをサポヌトしおいたす。 品揃えは、ロヌカルファむルシステムに画像を蚘録するこずから始たり、 Ellipticsに画像を保存するたで拡匵されたす。

Docker-registryを実行する最も簡単な方法は、Dockerを䜿甚するこずです。 これを行うには、 Docker 䞊蚘を参照をむンストヌルし、コマンドに目的のむメヌゞを実行させる必芁がありたす。
 sudo docker run -p 5000:5000 registry 


レゞストリむメヌゞは最初にリポゞトリからロヌドされおキャッシュされ、次回はすぐに起動したす。

起動するず、 Docker-registryはポヌト5000でリッスンしたす。 私たちは圌にpingを送りたす
 curl "http://192.168.50.4:5000/_ping" 

これでセットアップは完了です。

コンテナでアプリケヌションをビルドおよびデプロむしたす


コンテナの堎合のアプリケヌションの展開は、「非コンテナ」ず倧差ありたせん。 最も重芁な違いは、むメヌゞをビルドするにはDockerfileが必芁なこずです。 実際には、むメヌゞの内郚状態を圢成するために実行する必芁があるシェルコマンドのセットで構成されおいたす。 その埌、むメヌゞがDocker-registryに泚がれたす。

さらに、コンテナを実行するDockerは、レゞストリからむメヌゞをロヌドできたす。 Dockerfileの構文、䜿甚可胜なコマンドはこちらにありたす。 Dockerfileの代わりに、アセンブリ䞭にコンテナ内で実行されるChefレシピたたはPuppetマニフェストを提䟛できたす。

このアプリケヌションのプロファむルでは、絶瞁Dockerのタむプを指定する必芁がありたす。 これを行うには、新しいプロファむルを䜜成したす。
 { "queue-limit": 1000, "pool-limit": 10, "isolate": { "type": "docker", "args": { "memory_limit": 1000000000, "endpoint": "unix:///var/run/docker.sock", "registry": "registry.cloud.net:5000", "cpu_shares": 0 } }, "concurrency": 200 } 

docker-profile.jsonずいう名前でファむルにプロファむルを配眮し、docker-profileずいう名前でアップロヌドしたす
 cocaine-tool profile upload --name docker-profile --profile=docker-profile.json 


この䟋では、既補のDockerfileがあり、クラりドぞのアプリケヌションのダりンロヌドは次のずおりです。
 sudo cocaine-tool app upload --docker=unix:///var/run/docker.sock --registry=registry.cloud.net:5000 --manifest manifest-docker.json --name example-docker --timeout 20000 

これはむンスタントプロセスではなく、すべお画像ずネットワヌクのサむズに䟝存したす。 しかし、その結果、同様の碑文が衚瀺されるはずです。 次に、アプリケヌションが起動したす。


1぀のポむントが芋萜ずされおいたす-どのアプリケヌションが起動時にコカむンランタむムを開始し、それをどのように芋぀けるかに぀いお。 これにはランリストがありたす。 本質的に、この連想配列のアプリケヌションずそのプロファむルは、起動時にcocane-runtimeが読み取りたす。 プロファむルのように、 ストレヌゞに配眮されたす 。 クラりドの異なるノヌドで実行䞭のアプリケヌションのセットは異なる堎合があるため、それらの実行リストは異なる堎合がありたす。 ランリストの名前は、ノヌドサヌビスのrunlistパラメヌタヌのcocaine-runtime configで指定されたす。

集玄ノヌドの構成


本質的に、構成のこの郚分は、「コカむンランタむムの構成」項目に非垞に䌌おいたす。 コカむンランタむムは集玄ノヌドずしお機胜するため、これは自然なこずです。 その䞭のすべおのバランシング䜜業は、 ゲヌトりェむプラグむンによっお実行されたす 。

このプラグむンには2぀の実装がありたす。 最初はアドホックず呌ばれたす。 「すぐに䜿甚可胜」であり、远加のパッケヌゞをむンストヌルする必芁はありたせん。 戊闘で䜿甚する2番目の実装はipvsず呌ばれたす。 名前が瀺すように、同じ名前のテクノロゞヌを䜿甚したす。 アドホックは、 ipvsを䜿甚できない堎合に䜿甚するのが賢明です。 そしおもちろん、このプラグむンの独自の実装を蚘述しお、奜みのテクノロゞヌを䜿甚しおバランスを取るこずができたす。

蚀葉から行為ぞ。 パッケヌゞをむンストヌルしたす。
 sudo apt-get install cocaine-runtime libcocaine-core2 libcocaine-plugin-ipvs2 libcocaine-plugin-elliptics=2.24.14.31 elliptics-client=2.24.14.31 



ipvsを䜿甚できない堎合は、指定されたパッケヌゞの最埌をむンストヌルする必芁はありたせん。 基本構成の違いはわずかであり、個別に瀺されたす。

ネットワヌクセクションにゲヌトりェむサブセクションを远加するず、 ランタむムを集玄ノヌドにするこずができたす 。 以前のように、デフォルトで蚭定のコピヌを修正するず仮定したす。 前の段萜ず同様にストレヌゞサヌビスを構成したす。すぐに必芁になりたす。
  "network": { "group": "224.168.2.9", "gateway": { "type": "ipvs" // adhoc } }, "services"... 


sudo service cocane-runtime restartず、プロセスが開始するはずです。
 cocaine /usr/bin/cocaine-runtime --daemonize --configuration /etc/cocaine/cocaine-gateway.conf --pidfile /var/run/cocaine/runtime.pid 


実際、 ゲヌトりェむは倚数のパラメヌタヌを受け入れたすこれらのパラメヌタヌに぀いおは資料で確認できたす。

ログを開きたしょうデフォルトではsyslogに曞き蟌たれたす。 2぀のノヌドの接続が登録され、そのうちの1぀がオフになったこずがわかりたす。 バック゚ンドでも同じこずができ、 怜出が機胜するこずを確認できたす。


コカむンネむティブプロキシ


Cocaine-native-proxyを䜿甚するず、HTTP経由でクラりドアプリケヌションにアクセスできたす。 むンストヌルず蚭定は非垞に簡単です。
 apt-get install cocaine-native-proxy 


次に、 ロケヌタヌセクションで集玄ノヌドのリストを指定する必芁がありたす。 この堎合、そのようなノヌドは1぀だけです。 厳密に蚀えば、集玄モヌドで動䜜しないロケヌタヌずノヌドのアドレスを指定できたす。 これは、そのようなノヌドが他のノヌド䞊のサヌビスやアプリケヌションに぀いお䜕も知らないずいう理由で悪いこずです。぀たり、それらにアクセスするこずはできたせん。 パラメヌタヌの詳现な説明は、 github.com / cocaine / cocaine-native-proxy / blob / master / README.mdにありたす。
 { "endpoints": [ "0.0.0.0:8080" ], "backlog": 2048, "threads": 2, "application": { "locators": ["192.168.50.103:10053"], "service_pool": 5, "reconnect_timeout": 180, "request_timeout": 5 } } 


むンストヌルのクラりド゚ントリポむントは、集玄ノヌドを持぀マシンです。 HTTPむンタヌフェヌスはcocaine-native-proxyを介しお公開されおいるずいう事実にもかかわらず、実際には、このプロキシヌは集玄ノヌドも䜿甚したす。 ロケヌタヌセクションの構成で指定したした。 2぀の方法でアプリケヌションを呌び出しおみたしょう。 HTTPクラむアントはhttpむベントハンドラヌを䜿甚し、Pythonのクラむアントコヌドから曞き蟌みむベントず読み取りむベントを凊理したす。

クラむアントコヌドは、クラりド゚ントリポむントのアドレスを瀺したす。 私の堎合-192.168.50.103。
 #!/usr/bin/env python from cocaine.services import Service app = Service("example", host="192.168.50.103") print(app.enqueue("write", "DATA").get()) print(app.enqueue("read", "DATA").get()) 


フラスコアプリケヌションは、httpむベントハンドラヌずしお呌び出されたす。 珟圚、HTTPプロキシは、むベントを送信するアプリケヌションを決定する2぀の方法をサポヌトしおいたす。 最初の方法は、枡されたURLがパタヌンに埓っお構築されおいるこずを前提ずしおいたす ///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
 ///tail?arg=1&args=2.  URL   .       /tail?arg=1&args=2 .      . 

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .

///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .

///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
 ///tail?arg=1&args=2.  URL   .       /tail?arg=1&args=2 .      . 

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
 ///tail?arg=1&args=2.  URL   .       /tail?arg=1&args=2 .      . 

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
 ///tail?arg=1&args=2.  URL   .       /tail?arg=1&args=2 .      . 

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .
///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .

///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .

///tail?arg=1&args=2. URL . /tail?arg=1&args=2 . .

X-Cocaine-Service, X-Cocaine-Event . nginx .

, :
curl "http://localhost:8080/read" -H "X-Cocaine-Service: example" -H "X-Cocaine-Event: http" curl "http://localhost:8080/example/http/read"



. , . , . . . , , (, 5%). . . , , .

. example , exampleGroup . example 1000 . .
service/locator: adding group 'exampleGroup'


exampleGroup . , , app.py hello:
@app.route('/') def hello(name=None): return "HELLO! I'm version #2"

, example2 .



curl "http://localhost:8080/exampleGroup/http/"

, . example2 0 , HTTP-proxy . , HTTP-proxy . , .


, , . , Cocaine , c, . .

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


All Articles