概要
前回の
の続きで、今回はネットワーク名前空間から外部ネットワークへアクセスできるようにします。
環境
- Ubuntu 18.04
以下の状態からスタートします。
続きを読む
Linuxには名前空間(Namespace)というカーネルの機能が提供されています。
これは1つのプロセスが1つのリソースセットを参照し、別のプロセスが異なるリソースセットを参照するようにカーネルリソースを分割する機能です。
その中の1つであるネットワーク名前空間(Network Namespace)の機能を学んでみます。
デフォルトのUbuntuでは以下のように2つのNICが存在します。
コマンドで確認します。
$ ip l 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 02:b7:1f:33:e9:24 brd ff:ff:ff:ff:ff:ff続きを読む
gRPCでは主に
といったLBアプローチがあります。
それぞれの特徴や実装方法を調べてみました。
こちらで定義されてます。
grpc/load-balancing.md at master · grpc/grpc · GitHub
主な負荷分散のアプローチとしては以下です。
続きを読むgRPCでのバランシングをClient-Sideで直接実装する方法の紹介です。
gRPCはPolyglot(様々な言語で扱う)を意識しているので、gRPC自体の仕様が策定→各言語がそれに則って実装となります。
なので「元々はこういう実装だったけど、他の言語と統一してこう変更したよ」みたいなissueをちょこちょこ見ます。
結果これまでの書き方がいつのまにかdeprecatedになってたりするので、以前の書き方から遡って調べてみました。
goはModulesでリポジトリのライブラリのバージョン管理を行えます。
ただコマンドラインツールに関してはgo get
してgo.mod
に追加されても、goファイルで扱っているわけではないのでgo mod tidy
すると消えてしまいます。
しかしながら「この機能は最新のmasterにしかない。かと言ってgo get -u
や@master
で常に最新にしてしまうと互換性が壊れるかもしれない。だからバージョン管理できないと困る」というシチュエーションはよくあります。
その対策としては現状tools.go
にblank importするのがベストプラクティスとなっています。
こういった設計のようにレイヤ間の依存関係を抽象化していると、DIの初期化処理が段々冗長になっていきます。
google/wireはそういったDIの初期化を自動的にやってくれるコード生成ツールです。
今回はwireを使う上で知っていると便利なところをまとめます。
以下のチュートリアルが非常に分かりやすいので一度やってみてください。
続きを読む