RustのLT会 Shinjuku.rs #4 @FORCIA
アプリケーションの代わりにネットワーク層の仕事をするレイヤ。PodにSidecar ProxyをinjectしてService Meshを実現する。
高速でメモリ使用量が少ないRustが適している
New Type Patternで外部のクレートをwrapし、疎結合にする
use tower::builder::ServiceBuilder;
use tower::layer::util::{Identity, Stack};
#[derive(Clone, Debug)]
pub struct Builder<L>(ServiceBuilder<L>);
pub fn builder() -> Builder<Identity> {
Builder(ServiceBuilder::new())
}
impl<L> Builder<L> { ... }
別のスレッドのある処理が完了しているかどうかで、処理を分岐させる
// 別のスレッドのある処理が終わったかを気にするスレッドに渡す
#[derive(Clone, Debug)]
pub struct Readiness(Weak<()>);
// Readinessが気にする処理を行うスレッドに渡す
#[derive(Clone, Debug)]
pub struct Latch(Arc<()>);
impl Readiness {
pub fn new() -> (Readiness, Latch) {
let r = Arc::new(());
(Readiness(Arc::downgrade(&r)), Latch(r))
}
pub fn is_ready(&self) -> bool {
// upgrade()はOption<Arc<T>>を返す。解放済みならNoneを返す。
self.0.upgrade().is_none()
}
}
impl Latch {
pub fn release(self) {
drop(self);
}
}
$ snap install microk8s --classic --channel=1.14/edge
$ microk8s.enable linkerd:proxy-auto-inject