作者:李俱顺

原文: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服务发现相关推荐

  1. ZooKeeper是按照CP原则构建的,不适合做Service服务发现

    一.cap 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据变动都是同步的. ②A:Avail ...

  2. Nacos2.0的K8s服务发现生态应用及规划

    简介:Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能.随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社区 ...

  3. ASP.NET Core结合Nacos来完成配置管理和服务发现

    目录 前言 Nacos的简介 启动Nacos 配置管理 服务发现 写在最后 前言 今年4月份的时候,和平台组的同事一起调研了一下Nacos,也就在那个时候写了.net core版本的非官方版的SDK. ...

  4. Spring Cloud微服务之Nacos服务发现(八)

    Nacos服务发现 一.什么是Nacos? 二.微服务中常见的注册中心 三.Nacos主要提供以下四大功能: 四.Nacose结构图 5.Nacos下载和安装 1.下载地址和版本 2.启动nacos服 ...

  5. Nacos服务发现与调用

    什么是Nacos (1)Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供 ...

  6. dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

    作者 | 张远征来源|阿里巴巴云原生公众号 导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构.重启开源后,我们不仅看到 Dubbo 3.0 最新的 Road ...

  7. 如何快速构建服务发现的高可用能力

    作者:十眠 背景 注册中心作为承担服务注册发现的核心组件,是微服务架构中必不可少的一环.在 CAP 的模型中,注册中心可以牺牲一点点数据一致性(C),即同一时刻每一个节点拿到的服务地址允许短暂的不一致 ...

  8. 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul

    <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发现 Consul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发 ...

  9. 轻松构建docker服务发现机制

    目录 前言 一.环境 二.部署步骤 1.Docker01操作 2.docker02.docker03加入consul集群 三.验证 前言 服务发现在SOA(Service-Oriented Archi ...

最新文章

  1. MySQL最新版8.0.21安装配置教程~
  2. python networkx教程_如何在python中使用networkx绘制有向图?
  3. 多路三线RTD电阻温度采集电路设计方案
  4. P4144 大河的序列
  5. 国家电网是“围城”?辞职吗?
  6. Enum枚举类|注解Annotation
  7. 学会这个python数字大全,让你不再发愁
  8. Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(1) - 处理器保证的原子操作
  9. Linux命令之lsof
  10. php8拦截器,Web中的监听器 过滤器 拦截器
  11. 蜀道难于上青天 四川盆地DEM数据下载
  12. java WebSocket客户端断线重连 | 实用代码框架
  13. 数据库的内连接和外连接的区别
  14. CentOS系统简介
  15. 使用n切换node版本
  16. 学计算机难吗d,我想学计算机,五笔打字很难吗
  17. 层次分析法(AHP)基础概念整理+步骤总结
  18. 【FFMPEG】AVFrame中buffer分配的两种方式
  19. Maven Scanning for projects... < org.example:MapReduceDemo > Building MapReduceDemo 1.0-SNAPSHOT BUI
  20. 【CV】Mask R-CNN:用于目标实例分割的通用框架

热门文章

  1. [超享]linux共享3160命令
  2. 比特币base58源码解析_中本聪源码早期版本流出:区块链原名时间链,比特币内置虚拟扑克游戏...
  3. idea中自动deployment的步骤
  4. 有两个地方,用到了javabean对象和属性字符串值之间的转换
  5. SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据
  6. wpf中的datagrid中如何显示图片
  7. VS2010插件之NuGet
  8. [WP] 关于页面切换动画 记录
  9. [导入]ASP.NET中上传并读取Excel文件数据
  10. 超链接禁用_在Microsoft Word 2003和2007中禁用自动超链接