构建属于你自己的dapr服务发现
作者:李俱順
原文:https://www.4async.com/2021/05/building-your-own-dapr-service-discovery/
在上一篇文章中,我其實遺留了一個問題:如何定義dapr的服務發現呢?其實在后面閱讀dapr的源碼之后也前一篇文章的評論中提到了答案:目前dapr提供了內置兩種服務發現模式:K8s模式和用于獨立部署的mDNS模式。mDNS模式在某些網絡環境下可能存在問題(比如跨機房),不過沒有關系,dapr同時提供了可擴展能力,可以通過定義自主的服務發現能力擴展dapr的邊界。
從 NameResolution 到 Resolver 接口
在?pkg/components/nameresolution/registry.go?文件中,dapr定義了一個?NameResolution?結構體用于服務注冊和發現:
type (// NameResolution is a name resolution component definition.NameResolution struct {Name stringFactoryMethod func() nr.Resolver}// Registry handles registering and creating name resolution components.Registry interface {Register(components ...NameResolution)Create(name, version string) (nr.Resolver, error)}nameResolutionRegistry struct {resolvers map[string]func() nr.Resolver} )其中真正的服務解析則是依靠?components-contrib?中實現了?Resolver?接口的具體實現執行。
// Resolver is the interface of name resolver. type Resolver interface {// Init initializes name resolver.Init(metadata Metadata) error// ResolveID resolves name to address.ResolveID(req ResolveRequest) (string, error) }其中?Init?會在 Runtime 初始化時被調用,而?ResolveID?則會在服務查詢時調用。比如在?pkg/messaging/direct_messaging.go?的方法?getRemoteApp?中進行服務的解析:
func (d *directMessaging) getRemoteApp(appID string) (remoteApp, error) {id, namespace, err := d.requestAppIDAndNamespace(appID)if err != nil {return remoteApp{}, err}request := nr.ResolveRequest{ID: id, Namespace: namespace, Port: d.grpcPort}address, err := d.resolver.ResolveID(request)if err != nil {return remoteApp{}, err}return remoteApp{namespace: namespace,id: id,address: address,}, nil }當然,事實上這樣并不完全足夠,還需要把這個服務注冊放入dapr支持的服務中去:
runtime.WithNameResolutions(nr_loader.New("mdns", func() nr.Resolver {return nr_mdns.NewResolver(logContrib)}),nr_loader.New("kubernetes", func() nr.Resolver {return nr_kubernetes.NewResolver(logContrib)}),nr_loader.New("consul", func() nr.Resolver {return nr_consul.NewResolver(logContrib)}), ),上面的這些是設定的dpar目前支持的一些服務發現功能,而我們之前服務發現也一直使用的 Consul 實現,已經滿足我們的需求了…????拖延癥害人啊!
從原理到實現
上面提到了我們需要實現一個?Resolver?接口的實現,我們可以預見到我們大概會需要這么一個東西:
type resolver struct {}// NewResolver creates Consul name resolver. func NewResolver() nr.Resolver// Init will configure component. It will also register service or validate client connection based on config func (r *resolver) Init(metadata nr.Metadata) error // ResolveID resolves name to address via consul func (r *resolver) ResolveID(req nr.ResolveRequest) (string, error)接下來就需要一個?client *consul.Client?去實現服務的注冊:
type resolver struct {client *consul.Client }func (r *resolver) Init(metadata nr.Metadata) error {// ...if err := r.client.Agent().ServiceRegister(regData); err != nil {return fmt.Errorf("failed to register consul service: %w", err)}// ... }注冊服務完成后,在調用具體的服務時,我們需要獲取具體的服務地址:
func (r *resolver) ResolveID(req nr.ResolveRequest) (string, error) {// ...services, _, err := r.client.Health().Service(req.ID, "", true, cfg.QueryOptions)// ... }當然上面的演示代碼只是部分核心功能代碼,如果需要拓展更多的實現細節內容,需要查看具體的官方接收社區貢獻的實現:components-contrib/nameresolution/consul
相關文章:
Dapr能否引領云原生中間件的未來?
云原生 | 阿里巴巴的Dapr實踐與探索
Dapr | 云原生的抽象與實現
Dapr 可視化指南
Dapr 知多少 | 分布式應用運行時
Dapr 正式發布 1.0
Dapr 交通流量控制示例
Dapr是如何簡化微服務的開發和部署
微軟開源微服務運行時Dapr,賦能云原生應用開發
YARP實現Dapr服務調用的反向代理
Dapr微服務應用開發系列0:概述
Dapr微服務應用開發系列1:環境配置
Dapr微服務應用開發系列2:Hello World與SDK初接觸
Dapr微服務應用開發系列3:服務調用構件塊
Dapr微服務應用開發系列4:狀態管理構件塊
Dapr微服務應用開發系列5:發布訂閱構建塊
Windows環境下Dapr入門
云原生 | .NET 5 with Dapr 初體驗
通過Dapr實現一個簡單的基于.net的微服務電商系統
通過Dapr實現一個簡單的基于.net的微服務電商系統(二)——通訊框架講解
通過Dapr實現一個簡單的基于.net的微服務電商系統(三)——一步一步教你如何擼Dapr
通過Dapr實現一個簡單的基于.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱發布
通過Dapr實現一個簡單的基于.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理
通過Dapr實現一個簡單的基于.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務
通過Dapr實現一個簡單的基于.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流
通過Dapr實現一個簡單的基于.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權-百度版
通過Dapr實現一個簡單的基于.net的微服務電商系統(十)——一步一步教你如何擼Dapr之綁定
通過Dapr實現一個簡單的基于.net的微服務電商系統(十一)——一步一步教你如何擼Dapr之自動擴/縮容
WebAssembly + Dapr = 下一代云原生運行時?
dapr 應用開發 | 環境配置
乘風破浪,.Net Core遇見Dapr,為云原生而生的分布式應用運行時
Dapr案例之高德 Serverless 平臺建設及實踐
在非容器(集群)環境下運行dapr
總結
以上是生活随笔為你收集整理的构建属于你自己的dapr服务发现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近业务=困死在一条船上?
- 下一篇: 服务端和客户端证书各种组合下对访问者(浏