构建属于你自己的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法

Numpy是Python强大的数据计算和处理模块,其操作数据非常迅速且简单易行。首先读取CSV文件>>> import numpy as np#导入numpy模块>>> tempnp.loadtxt("file.csv",dtypenp.int,delimiter,)可以看到两行代码搞定,看一下temp的内…

java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject

错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代码,但是每次在Android模拟器中运行的时候程序都会崩溃,搞得自己都快崩溃了。。。。 查看了一下LogCat中的错误报告,发现是因为java.lang.NoCl…

php 模板替换,使用PHPWord对Word文件做模板替换

因工作需要,使用了版本比较旧的PHPWord项目官方已不见维护更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM如果PHP版本>5.3.3,强烈推荐使用PHPOffice/PHPWord这个开源项目本篇针对的为旧版本的PHPWord基本安装问题总结Autoloader自动加载…

服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响

今天本来想研究下nginx下如果获取SSL指纹,但是环境没有装成功就尝试了下如果不用nginx直接在服务端拿到SSL指纹,没想到从创建自签名证书到如何开启证书,以及服务端证书和客户端证书各种组合校验的测试就花了我很长时间。(注意自签名证书用Rsa…

Android之应用APN、WIFI、GPS定位小例子

转自一个网上项目,由于是例子打包下载,出处不详。例子中自我写入注释。Activity类:package com.maxtech.common;import com.maxtech.common.gps.GpsTask;import com.maxtech.common.gps.GpsTaskCallBack;import com.maxtech.common.gps.GpsTa…

如果科学家封神,会有什么称号?

全世界只有3.14 % 的人关注了数据与算法之美你听说过“天雷真君”吗?你知道“虐猫狂人"吗?其实这两个称号是网友分别送给大科学家富兰克林和薛定谔的。今天让我们看看伟大的科学家们还有一些什么有趣的称号。尺规小王子高斯如来神展傅立叶勾股圣手—…

mac php mcrypt,MacOSX 10.10安装mcrypt详细教程分享

mcrypt 是使用安全技术来交换数据文件加密方法. 这是必需的,例如一些 Magento 的 Web 应用程序,购物车软件或一个 PHP 框架,比如 Laravel. 本教程在 OS X 10.10 Yosemite 经过测试。本指南是真正为用户提供了PHP运行于OSX Yosemite 的5.5.14 版本。其他下…

WPF加载高德地图

WPF开发者QQ群: 340500857 前言 有小伙伴问如何加载高德地图。欢迎转发、分享、点赞,谢谢大家~。 接着上一篇源码中放了我的 BingMap Key 请大家不要滥用,谢谢。也可以自行申请 BingMap Key https://www.bingmapsportal.com/效果预览&#x…

深度学习与机器学习到底什么关系?

最近广州的天气老是变幻无常,前脚还冻得瑟瑟发抖,后脚又开始夏天模式(如下图),让小天甚是怀念每天艳阳高照的夏天,虽然热了点但好歹不用担心猝不及防地收到寒风暴雨黄色预警。说到夏天,不得不提…

全选按钮的使用。winfrom程序中,对全选按钮的理解,欢迎拍砖!

最近在做公司项目时,用到了一些单选多选的处理情况。特编辑此文,欢迎批评指正。(有图有真相) winfrom程序。 首先,需要绑定某些用户,该用于由当前登陆用户获取。 private void BindUser() { …

php 新浪面试题,php程序员面试题(新浪篇)

新浪PHP工程笔试题1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名例如: http://www.sina.com.cn/abc/de/fg.php?id1 需要取出 php 或 .php2. 在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以…

理工男一般不浪漫,一浪漫便值很多年

今晚是平安夜接下来就是圣诞元旦小木先祝大家幸福、快乐、健康一年一度“最佳”圣诞元旦礼物奖就要发表了中了直男毒的礼物你们挚爱的女朋友可是不要的哦今天小木就大家扒一扒满满直男的礼物是怎样的!Part 1“男票送了我一箱木瓜,说是丰胸疗程&#xff0…

C#序列化与反序列化详解

什么是序列化以及如何实现序列化?序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。…

云计算涉足网游

随着云计算的发展,网游完全无端化指日可待。 互联网从C/S结构慢慢的过渡到B/S结构,网络游戏也从端游慢慢过渡到页游。比起市场上动辄7G、14G大型端游来说,页游实在是一个太过方便的东西。比如不用频繁的更新客户端,如果是安装在了…

php父子遍历,php无限分类父子追溯方法

php 无限分类之父级分类和子分类的追溯方法,代码片段如下://返回所有的叶子节点public function scanNodeOfTree($result,$fid){$checkexist false;for ($i0; $iif($fid $result[$i][ParentId]){$checkexist true;$arr . $this->scanNodeOfTree($r…

TLS是如何保障数据传输安全(中间人攻击)

前言前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密(DH这块)的阐述,让我对这块原理有了更进一步的理…

除了 Python ,这些语言写的机器学习项目也很牛

全世界只有3.14 % 的人关注了数据与算法之美Python 由于本身的易用优势和强大的工具库储备,成为了在人工智能及其它相关科学领域中最常用的语言之一。尤其是在机器学习,已然是各大项目最偏爱的语言。其实除了 Python ,也不乏有开发者用其他语…

php 输入值,php-HTML输入值更改

我有一个PHP更新页面,其中显示一个包含数据库值的文本字段.就像这样,它正在工作,现在,我需要将此更新后的值放回数据库中!我已经使用过这样的代码,但是它没有更新:$title$_POST[title];$v_id $_GET[v_id];$sql mysql_query("update vehicles set …

马斯克又要搞事情,不锈钢材质的Space X“星际飞船”正式亮相

全世界只有3.14 % 的人关注了数据与算法之美近日,据美国科技媒体 Teslarati 报道,今年 Space X (太空探索技术公司)已经开始研发“星际飞船”(Starship)和 “Super Heavy”,而“星际飞船”则是火…