聊一聊和Nacos 2.0.0对接那些事

前言

nacos 2.0.0 已经发布了 alpha1, alpha2 和 beta 三个版本了,部分测试报告也已经出来了。

  • Nacos2.0.0-ALPHA2 服务发现性能测试报告

  • Nacos 2.0.0-ALPHA2 配置性能测试报告

还是比较值得期待的。

前段时间也一直在完善 nacos-sdk-csharp 这个项目。

主要就是对接 Nacos 2.0.0 这一块,也考虑到之前主要是针对Open API封装,同时参考JAVA的SDK进行功能叠加。

这一次就索性全部重新来过了,也对齐 JAVA SDK 提供的方法。

这其中最为重要的应该是底层协议由 HTTP 换成 gRPC,也是长轮询到长连接的一个跨越。

现在就和大家简单梳理一下老黄在对接中认为要注意的地方。

这里以 nacos 2.0.0 beta 版本为准,后续版本可能会有变化。

端口

nacos 的默认端口是 8848,也是之前 HTTP 协议对接时的请求端口,那么我们是不是通过 8848 这个端口进行 gRPC 的交互呢?

答案是否定的!

nacos 里面做了一个约定,把 gRPC 的服务端口设置成 nacos 启动的端口加 1000。

也就是说,nacos 的端口是 8848 的话,那么 gRPC 服务端口就是 9848

所以这里是第一个注意的点。

proto 文件

下面是 nacos 提供的 proto 文件,这个是SDK和Server交互的基础。

syntax = "proto3";import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";option java_multiple_files = true;
option java_package = "com.alibaba.nacos.api.grpc.auto";message Metadata {string type = 3;map<string, string> headers = 7;
}message Payload {Metadata metadata = 2;google.protobuf.Any body = 3;
}service RequestStream {// build a streamRequestrpc requestStream (Payload) returns (stream Payload) {}
}service Request {// Sends a commonRequestrpc request (Payload) returns (Payload) {}
}service BiRequestStream {// Sends a commonRequestrpc requestBiStream (stream Payload) returns (stream Payload) {}
}

这里有 3 个 service,其中 RequestStream 这个在实际对接中是没有使用到的。所以只介绍其他两个。

Request 这个是通用请求,发布配置,注册服务之类的请求都是通过这个方法来交互的。

BiRequestStream 这个是双向流,主要是用来注册连接,和一些监听回调。

Nacos 1.x 里面, 配置的监听回调是基于长轮询机制,服务的监听回调是基于udp机制。

再来看看 service 的参数和响应。

Payload 的设计是有两个部分, 一个是自定义类型的 metadata, 一个是 Any 类型的 body

metadata 里面有一个 type 字段,这个字段代表的是客户端和服务端交互的 RPC 语义。好比说,我要发布配置,就是通过这个 type 告诉服务端,当前请求是要做什么。

body 这个在交互时需要做一下转换,拿到一个 object 对象,序列化成一个 JSON 字符串,最后在转化成 Any 类型的 value。

下面是一个简单的示例:

var body = new Google.Protobuf.WellKnownTypes.Any
{// convert the request paramter to a json string, as the bodyValue = Google.Protobuf.ByteString.CopyFromUtf8(request.ToJsonString())
};

这里有一个要注意的地方,在生成 C# 代码后,会因为参数名和方法名一样造成编译不过,所以这里要修改一下生成代码的参数名。

对接

知道了服务端的端口, proto 文件也有了,接下来就可以和服务端对接了。

想要和服务端对接上,成功获取到正确的数据,其实还有不少内容的。

下面老黄拆成 3 个小节来说。

建立连接

Step 1:

与 gRPC 服务端进行交互,首先就是要创建一个 Channel ,这里用的是 Insecure 的方式,不需要提供额外的证书信息。

Step 2:

创建 Request 请求客户端,并发起 ServerCheckRequest 请求,检查服务是否可用,不可用就直接关闭这个 Channel 了。

Step 3:

创建 BiRequestStream 请求客户端,注册处理服务端推送的相关操作,主要是配置和服务的变更。

注册完成后,还要发送 ConnectionSetupRequest 请求和 server 端建立真正意义上的连接。

这一步至关重要,因为这一步过后,服务端会把这个连接维护到客户端的连接管理里面,后续的请求会通过这个来判断是不是合法的请求。可以理解成拿到了大门的钥匙。

这一步完成之后,就可以通过 Request 发送请求了。

请求与响应

这里的请求,指的是通过 Request 发起的。

前面有提到,body 参数这一块,是对一个 JSON 字符串进行转化后的值。

这个 JSON 字符串大概成下面这样。

{"headers": {"h1": "v1","h2": "v2"},"requestId": "xxxx","biz-prop-1": "value-1","biz-prop-2": "value-2","biz-prop-n": "value-n",
}

其中, headers 和 requestId 这两个是通用参数,每个接口都应该带上,其他的就是各个接口需要什么就加什么。

响应的话会有正常和异常。

正常的话,返回的 type 是和请求的 type 相对应的。

好比 ConfigPublishRequest 就会对应 ConfigPublishResponse

如果服务端处理异常了,就会返 ErrorResponse

这里的异常可以分为两类。

  1. 请求没有注册

{"resultCode":500,"errorCode":301,"message":"Connection is unregistered.","success":false} 

出现这种情况后,客户端这边是要重新和服务端进行连接,不然所有的请求都会是这个返回。

可能的原因有:

  • 在请求之前没有提前在双向流里面发起建立连接的请求。

  • 客户端与服务端断开过连接

  1. 请求处理失败

这个一般就是服务端处理出现了异常。

重新连接

如果响应告诉客户端请求没有注册,这个时候要及时触发重新连接,这样才不会让业务受到影响。

触发重连操作后,会有一个 SwitchServer 的操作,可以简单理解成换了一个服务地址,然后重复连接里面的几个步骤。

到这里其实对接相关的内容基本差不多了,剩下的就是对接具体的请求和其他操作了。

也附上一张老黄之前画的粗糙的图。

写在最后

老黄参与的 nacos-sdk-csharp 目前已经基本适配好了 nacos 2.0.0 beta 版本,但是还有许多细节需要慢慢的调整和改进。

希望有感兴趣的大佬一起参与到这个项目来。

nacos-sdk-csharp 的地址 :https://github.com/nacos-group/nacos-sdk-csharp

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

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

相关文章

家用简单电线路图_家庭配电箱接线图解 家用配电箱安装方法

家居装修对水电的关注不可或缺&#xff0c;家庭电路的铺设更是至关重要的环节&#xff0c;其中家庭配电箱安装涉及到家居用电的安全问题。因此&#xff0c;小编特地对家庭配电箱安装的知识&#xff0c;以及家庭配电箱接线图作出相关整理&#xff0c;帮助大家对家庭配电箱有一个…

决策树算法及实现

在计算机科学中&#xff0c;树是一种很重要的数据结构&#xff0c;比如我们最为熟悉的二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;红黑树&#xff08;Red-Black Tree&#xff09;等&#xff0c;通过引入树这种数据结构&#xff0c;我们可以很快地缩小问…

ElasticSearch+NLog实现.net core分布式日志管理

概述Elasticsearch可广泛应用于日志分析、全文检索、结构化数据分析等多种场景&#xff0c;大幅度降低维护多套专用系统的成本&#xff0c;在开源社区非常受欢迎。在系统中&#xff0c;如果将日志作为文件输出&#xff0c;查看系统日志将非常不便&#xff1b;如果将日志保存到数…

双路服务器只显示一半内存,双路服务器只显示一半内存

双路服务器只显示一半内存 内容精选换一换北京时间1月3日&#xff0c;Intel处理器芯片被曝出存在严重的Meltdown和Spectre安全漏洞&#xff0c;漏洞详情如下&#xff1a;漏洞名称&#xff1a;Intel处理器存在严重芯片级漏洞漏洞编号&#xff1a;CVE-2017-5753、CVE-2017-5715、…

不想再被鄙视?那就看进来! 一文搞懂 Python 2 字符编码

程序员都自视清高&#xff0c;觉得自己是创造者&#xff0c;经常鄙视不太懂技术的产品或者QA。可悲的是&#xff0c;程序员之间也相互鄙视&#xff0c;程序员的鄙视链流传甚广&#xff0c;作为一个Python程序员&#xff0c;自然最关心的是下面这幅图啦我们项目组一值使用Python…

mysql的外键_mysql如何查看外键

展开全部查看mysql外键方式主要是通过第三方工具或者62616964757a686964616fe4b893e5b19e31333431373233是sql语句&#xff0c;主要有以下三种方式1、使用Navicateformysql&#xff0c;打开数据库、查看数据库表、查看设计表、选择外键选项卡&#xff0c;就可以查看外键2、使用…

循环递归,相互结合,释放数据的价值

随着经济的发展&#xff0c;目前各行各业已经积累了海量的数据&#xff0c;并且还在持续增长&#xff0c;可是这些数据非常杂乱还占空间&#xff0c;因此&#xff0c;如何有效利用它们&#xff0c;达到资源不浪费也就成为了相关工作者的首要思考问题。此时&#xff0c;数据分析…

黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

企业库日志应用程序模块工作原理图: 从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信息都可以在Category配置文件中反映出来,通过配置文件,调用LogWriter类的Writer方法,就可以将包含日志信息的LogEntry实…

Webapi测试工具WebBenchmark v1.3发布

这个版本更新的内容是统一使用BeetleX的Web SPA 插件作为服务的基础支持功能方便后期功能扩展&#xff0c;修复线程池配置太小引起的测试问题&#xff0c;修复统计显示的BUG。安装工具提供win64和linux64两个版本&#xff0c;可以根据自己需要下载对应系统的运行版本。地址是:h…

详解哈希表的查找

哈希表和哈希函数在记录的存储位置和它的关键字之间是建立一个确定的对应关系&#xff08;映射函数&#xff09;&#xff0c;使每个关键字和一个存储位置能唯一对应。这个映射函数称为哈希函数&#xff0c;根据这个原则建立的表称为哈希表(Hash Table)&#xff0c;也叫散列表。…

微软腾讯京东都在高薪招.NET Core,你准备好了吗!

金三银四跳槽季&#xff0c;古人诚不我欺&#xff0c;2年没更新简历了&#xff0c;还接到好几个电话邀约&#xff0c;打过交道的几个猎头妹子更是殷勤的频繁打招呼。认真了解一下才知道&#xff0c;今年的招聘真的很热&#xff0c;.NET招聘真的很热。头部互联网企业像微软苏州、…

.NET Core dump 分析

服务 CPU 或 内存偶尔飙高是部署环境中经常遇到的问题&#xff0c;一般会采用记录日志的方式来诊断&#xff0c;不过有些情况靠日志可能并不能分析出个所以然&#xff0c;面对实在无头绪的问题也只能暂时使用重启大法先恢复。为了尽可能精准的定位问题&#xff0c;掌握通过 dum…

外国人最常说的100个“中国词”出炉,第一个你绝对想不到…

近几年&#xff0c;“汉语热”在全球兴起&#xff0c;外国人说的念的中国词儿变多了&#xff01;那外国人最常说的、最热的“中国词”到底是啥呢&#xff1f;2月17日&#xff0c;中国外文局首次发布《中国话语海外认知度调研报告》。报告显示&#xff0c;近两年中国话语以汉语拼…

python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名

在日常开发中&#xff0c;我们会经常要在类中定义布尔类型的变量&#xff0c;比如在给外部系统提供一个RPC接口的时候&#xff0c;我们一般会定义一个字段表示本次请求是否成功的。关于这个”本次请求是否成功”的字段的定义&#xff0c;其实是有很多种讲究和坑的&#xff0c;稍…

自建Git服务器系列——Gitea(Gogs的孪生兄弟)

概述该项目的目标是提供一种最简单&#xff0c;最快&#xff0c;最轻松的方式来建立自托管的Git服务。使用Go&#xff0c;可以在Go支持的所有平台上进行独立的二进制分发 &#xff0c;包括x86&#xff0c;amd64&#xff0c;ARM和PowerPC体系结构上的Linux&#xff0c;macOS和Wi…

干货|吴恩达Coursera课程教你学习神经网络!

吴恩达Coursera机器学习课程系列笔记讲解课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础干货|机器学习零基础&#xff1f;不要怕&#xff0c;吴恩达机器学习课程笔记2-多元线性回归干货|机器学习零基础&#xff1f;不要怕&#xff0c;吴恩达课程笔记第三周&#xff…

笔记本内置扬声器三强PK

内置扬声器PK要点外观设计差异。外表是否美观直接影响使用者的心情&#xff0c;扬声器的结构设计直接影响放音效果。实际听音较量。利用真实的人耳感受则是最能体现扬声器实际效果的。奥特蓝星&#xff1a;音质纯净&#xff0c;低音欠佳代表机型&#xff1a;惠普&#xff0c;华…

mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用

概述MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表。大部分的单表数据查询并不能满足我们的需求&#xff0c;这时候我们就需要连接一个或者多个表&#xff0c;并通过一些条件过滤筛选出我们需要的数据。了解MySQL连接查询之前我们先来理解下笛卡尔积的原理。数据…

如何在 .NET 中使用 Kafka

Kafka 是一个开源的&#xff0c;分布式的&#xff0c;可扩展的&#xff0c;高性能的发布订阅模式的消息中间件&#xff0c;如果你要构建一个处理海量数据的系统&#xff0c;那么 Kafka 将会是一个非常好的选择&#xff0c;这篇文章我们将会讨论如何基于 Kakfa 构建一个发布订阅…

傅里叶变换和拉普拉斯变换的物理解释及区别

傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用&#xff08;例如在信号处理中&#xff0c;傅里叶变换的典型用途是将信号分解成幅值分量和频率分量&#xff09;。傅里叶变换能将满足一定条件的…