CMDR 04 -シンプルなマイクロサービス
に基づくcmdr
v0.2.21
私のADOは多すぎます。
だから、今回はストレート対象に、Tucaoに減少しました。私にはわからないcmdr
理由を使用し、早く見たいと思うことがあり
だから、バックエンドの開発に適しgolangは、かどうかRESTfulなgRPCが強みです。
我々はさておきさておき、コアロジックをマイクロサービスを開発したい、と関係なく、DevOpsチームの用語はK8S、またはドッカー、またはベアメタルであるかどうかの、常に日常の問題をテストし、試運転、スタートアップに直面している。いったん
cmdr
コマンドライン引数を解釈する能力を提供するだけでなく、デーモンの追加プラグインを提供することに加えて、それはあなたがそうで、pidファイルを心配するログ、終了信号とする必要はありませんので、あなたは、日々の開発作業を簡素化することができ、および関連スケジューリングデーモンを繰り返す必要はありませんコマンドライン命令。
ここでは、実際のビジネス・ロジックを書く方法を、デーモンプラグインを使用する方法です。私たちのデモ例えば簡単な例マイクロサービスを記述し、具体的な実践を説明しています。
デーモンプラグインを使用します
デーモンプラグインを有効にします
デーモンは、プラグインのコードは1行だけを有効にします。
// Entry is app main entry
func Entry() {
logrus.SetLevel(logrus.DebugLevel)
logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
daemon.Enable(svr.NewDaemon(), nil, nil, nil)
if err := cmdr.Exec(rootCmd); err != nil {
logrus.Errorf("Error: %v", err)
}
}
复制代码
実装daemon.Daemon
インタフェース
デーモンが有効になっているプラグインは、あなたが実装する必要があるdaemon.Daemon
インターフェイスを、そしていくつかの接続するラッパーコード記述cmdr
、daemon
だけでなく、あなたのビジネスロジックを。
daemon.Daemon
インターフェース
daemon.Daemon
インターフェイスはこれです:
// Daemon interface should be implemented when you are using `daemon.Enable()`.
type Daemon interface {
OnRun(cmd *cmdr.Command, args []string, stopCh, doneCh chan struct{}) (err error)
OnStop(cmd *cmdr.Command, args []string) (err error)
OnReload()
OnStatus(cxt *Context, cmd *cmdr.Command, p *os.Process) (err error)
OnInstall(cxt *Context, cmd *cmdr.Command, args []string) (err error)
OnUninstall(cxt *Context, cmd *cmdr.Command, args []string) (err error)
}
复制代码
マイクロサービスの場合、あなたはそれを記述する必要がありOnRun
、OnStop
2つのメソッドを。いくつかの他の方法は、通常はオプションであり、RESTfulなHTTP2のためのデーモンプラグインがリロード、状態をサポートするために、デフォルトのロジックを完了しました。また、systemdにプラグインのデーモンは、デフォルトではインストールおよびアンインストール・ロジック実装しています。
そこでここでは、最初の部分を完了しています:
OnRun
type daemonImpl struct {}
func (*daemonImpl) OnRun(cmd *cmdr.Command, args []string, stopCh, doneCh chan struct{}) (err error) {
logrus.Debugf("demo daemon OnRun, pid = %v, ppid = %v", os.Getpid(), os.Getppid())
go worker(stopCh, doneCh)
return
}
func worker(stopCh, doneCh chan struct{}) {
LOOP:
for {
time.Sleep(time.Second) // this is work to be done by worker.
select {
case <-stopCh:
break LOOP
default:
}
}
doneCh <- struct{}{}
}
复制代码
デーモンは、2つのチャネルを提供しstopCh
、あなたのコードはループをトリガすべき出たとき、あなたのコードは無限ループを終了させる必要があるdoneCh
イベントを。全体のマイクロサービスを確実にするような適切なシャットダウン・ロジック。
コア・ロジックについては、私たちはworker
、今、それだけで無限ループである、あなたが実際のビジネスに基づいて交換を完了することができ、それらを必要とします。
次回は、私たちはRESTfulなマイクロサービスのサンプルを提供することができます。
OnStop
そして、他の
func (*daemonImpl) OnStop(cmd *cmdr.Command, args []string) (err error) {
logrus.Debugf("demo daemon OnStop")
return
}
func (*daemonImpl) OnReload() {
logrus.Debugf("demo daemon OnReload")
}
func (*daemonImpl) OnStatus(cxt *daemon.Context, cmd *cmdr.Command, p *os.Process) (err error) {
fmt.Printf("%v v%v\n", cmd.GetRoot().AppName, cmd.GetRoot().Version)
fmt.Printf("PID=%v\nLOG=%v\n", cxt.PidFileName, cxt.LogFileName)
return
}
func (*daemonImpl) OnInstall(cxt *daemon.Context, cmd *cmdr.Command, args []string) (err error) {
logrus.Debugf("demo daemon OnInstall")
return
}
func (*daemonImpl) OnUninstall(cxt *daemon.Context, cmd *cmdr.Command, args []string) (err error) {
logrus.Debugf("demo daemon OnUninstall")
return
}
复制代码
その他のインタフェース・メソッドは、基本的には、私たちの労働者のために、必要がないため、何もしないOnStop
、他のリソースの解放を、データベース接続をクリーンアップ、また必要にOnReload
新しい設定ファイルをロードするとき。
テスト demo
今、私たちは可能demo
な外観を実行します。まず、コマンドライン命令は、我々が使用し、利用可能な下の研究がある--tree
を見ては:
注目することができるs, server, serve, svr, daemon
、それがデーモン関連の操作を提供するために、サブコマンドのセットが含まれ、コマンドは新しいです。
これはserver start
、このサブコマンドについて説明します:
言い換えれば、start
2つの変形サブコマンドは、IDEマイクロ目的での統合と試運転のサービスを容易にするために、ドッキングウィンドウフロントデスクにてマイクロを実行することができます:
# 在前台运行微服务,而不是进入 daemon 模式
demo run
demo start --foreground
复制代码
デーモンモードでは、標準的な仕様は、要素が特定の聞いているかを定義していないが、一般的に進化したものが残っているがあります。デーモンは、多くの場合、中国語で呼ばれています
守护进程
。一般的にデーモンモードでは、これらの要素が含まれています:
- プロセスが開始された後、他のサービスを受信しません、切り離しなり、コピーに関連付けられた独自のオペレーティングシステムの実行中のコピー、およびTTYをフォークし、ほかにも別の子プロセスの環境とプロセス空間、あるいは同一性を有し、他のttyの干渉。
- 子供の基本的な状態を示しているの/ var / runの中の子プロセスのpidファイルを、維持
- フロントと相互作用する子供は、一般的には、SIGHUP信号は、システムコール信号を介して子プロセスを引き起こす再起動を完了するために構成情報を再ロード、まだプロセスをシャットダウンしてプロセスを再起動しない; SIGTERMらは、子プロセスサービスの終了を合図。などなど。
- 下には/ var / log /ログファイルに子プロセスのログ出力
フォアグラウンド
そこで、我々は、フォアグラウンドでデモを実行します。
そして、それを終了するにはCTRL-Cを押すと、あなたは「マイクロサービスは、」適切に実行することができます見ることができ、することができ、通常、自己破壊。
デーモンランニング
私たちはデーモンのデモを実行したい場合や、最初の事あなたはデーモンモードとして起動することができます前に、実行可能ファイルにコンパイルする必要があります。
浮浪者の環境によって、我々は、デーモンが開始されたことを確認することができ、その後、我々は適切に閉じられた命令を停止します。
ランニングにsystemdサービス
サポートにsystemdのLinuxディストリビューションでは、我々はサービスをsystemdにするためにマイクロサービスのインストールをテストすることができます。
その中でも、sudo /vagrant/demo server install
デモ・サービスの成功がインストールされ、準備ができて、システムの起動モードを自動的に起動するように予め設定されたされた後、インストールのアクションを完了します。
その後、我々はsystemdにの規範に基づいて、それを起動しますsudo systemctl start demo@$USER.service
。
デモは異なるユーザーIDの下で活性化することができ、我々はワイルドカードモードのインストールをデモします、ということは注目に値します。あなたは、専用のマイクロサービスアカウントを使用して、それを起動したい場合は、使用することができますsudo systemctl start [email protected]
。
私たちは、その後、sudo systemctl status [email protected]
デモが正常に起動され、どれが3個のエラーがありますが、彼らは無視することができ、彼らはいくつかの関連フォルダの目的のために構築しようと、これだけの予防指示されている参照してください。主のデモは、あるExecStartラインが正常に起動を指示され、そして状態がアクティブ状態が実行されています。
この場合、ログ/ logrusログ出力なども/var/log/demo/demo.log内のログファイルに転送されます。
その後、我々はまた、可能sudo systemctl stop demo@$USER.service
に停止するのに役立ちます。
概要
直接ではMacOSの中にsystemdサポートされていないので、テストのこの部分のためには、浮浪者に行われます。
Windowsの場合、あなただけ使用することができますserver run
フォアグラウンドでやり方を実行し、我々は一時的にNTサービスをサポートする予定はありません。しかし、あなたはフォアグラウンドで実行されているデバッグを通じて日々開発を行うことができます。
実際の本番環境では、あなたの展開にのみ必要、CentOSのは、Ubuntuおよび他のリリースを選択することができますsudo demo server install
つの命令を。
環境コンテナの場合、あなたが使用する必要がありますdemo server run
フォアグラウンドで実行を開始し、このモードを。
参照
ます。https://juejin.im/post/5cf4b2ab6fb9a07eae2a485eで再現