中银跨境go 网络开小差了

中银跨境go 网络开小差了,第1张

中银跨境go网络开小差原因可能是网速慢或服务器暂时关闭。
网速慢时会暂时连不上网,另外一个原因是服务器暂时关闭,你这边发出信号,联系不到对方,所以说网络开小差了。
中银跨境GO是中国银行股份有限公司发行的一站式跨境金融服务平台,适合国外留学、国外旅游等用户使用。

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端 应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。名叫 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言。当前针对 Java 和 C++ 发布了 beta 版本,针对 JavaNano(即 Android Java)发布 alpha 版本,在protocol buffers Github 源码库里有 Ruby 支持, 在golang/protobuf Github 源码库里还有针对 Go 语言的生成器, 对更多语言的支持正在开发中。

有了 gRPC, 我们可以一次性的在一个 proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。

现在让我们来仔细了解一下当 gRPC 客户端调用 gRPC 服务端的方法时到底发生了什么。我们不究其实现细节,关于实现细节的部分,你可以在我们的特定语言页面里找到更为详尽的内容。

首先我们来了解一下最简单的 RPC 形式:客户端发出单个请求,获得单个响应。

服务端流式 RPC 除了在得到客户端请求信息后发送回一个应答流之外,与我们的简单例子一样。在发送完所有应答后,服务端的状态详情(状态码和可选的状态信息)和可选的跟踪元数据被发送回客户端,以此来完成服务端的工作。客户端在接收到所有服务端的应答后也完成了工作。

客户端流式 RPC 也基本与我们的简单例子一样,区别在于客户端通过发送一个请求流给服务端,取代了原先发送的单个请求。服务端通常(但并不必须)会在接收到客户端所有的请求后发送回一个应答,其中附带有它的状态详情和可选的跟踪数据。

双向流式 RPC ,调用由客户端调用方法来初始化,而服务端则接收到客户端的元数据,方法名和截止时间。服务端可以选择发送回它的初始元数据或等待客户端发送请求。 下一步怎样发展取决于应用,因为客户端和服务端能在任意顺序上读写 - 这些流的 *** 作是完全独立的。例如服务端可以一直等直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像"乒乓球"一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

通过运行下面的命令克隆并安装grpc-go代码库:

下载protobuf源码包

安装golang-protobuf

第一步使用 protocol buffers去定义 gRPC service 和方法 request 以及 response 的类型。

要定义一个服务,必须在proto 文件中指定 service:

然后在服务中定义 rpc 方法,指定请求的和响应类型,gRPC 允许定义4种类型的 service 方法。

服务proto文件如下所示:

对于一款MMORPG来说,副本系统是游戏中相当重要的内容,作为第三代网游,上古世纪在副本系统这块的设计虽然和目前的MMORPG比较相似,但在玩法和副本的背景故事上精益求精,做出了第三代网游的特色。目前游戏中已开启的副本有7个,2个18级副本:西方自在天王宫地下、风刃废矿;2个31级副本:哈迪尔的农场,燃烧之城武器库;以及3个40级以上副本:呼啸深渊、毁灭之源、娜刹什伽尔象

为了确保一致性构建,Go引入了gomod文件来标记每个依赖包的版本,在构建过程中go命令会下载gomod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个gomod文件并不能保证一致性构建。

为了解决Go module的这一安全隐患,Go开发团队在引入gomod的同时也引入了gosum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与gosum文件中记录得不一致,则会拒绝构建。

gosum文件记录

gosum文件中每行记录由module名、版本和哈希组成,并由空格分开:

比如,某个gosum文件中记录了githubcom/google/uuid 这个依赖包的v112版本的哈希值:

正常情况下,每个依赖包版本会包含两条记录,第一条记录为该依赖包版本整体(所有文件)的哈希值,第二条记录表示该依赖包版本中gomod文件的哈希值,如果该依赖包版本没有gomod文件,则只有第一条记录。如上面的例子中,v112表示该依赖包版本整体,而v112/gomod表示该依赖包版本中gomod文件。

依赖包版本中任何一个文件(包括gomod)改动,都会改变其整体哈希值,此处再额外记录依赖包版本的gomod文件主要用于计算依赖树时不必下载完整的依赖包版本,只根据gomod即可计算依赖树。

每条记录中的哈希值前均有一个表示哈希算法的h1:,表示后面的哈希值是由算法SHA-256计算出来的

gosum文件中记录的依赖包版本数量往往比gomod文件中要多,这是因为二者记录的粒度不同导致的。gomod只需要记录直接依赖的依赖包版本,只在依赖包版本不包含gomod文件时候才会记录间接依赖包版本,而gosum则是要记录构建用到的所有依赖包版本。

生成

当我们在GOMODULE模式下引入一个新的依赖时,通常会使用go get命令获取该依赖,比如:

go get命令首先会将该依赖包下载到本地缓存目录$GOPATH/pkg/mod/cache/download,该依赖包为一个后缀为zip的压缩包,如v100zip。go get下载完成后会对该zip包做哈希运算,并将结果存放在后缀为ziphash的文件中,如v100ziphash。如果在项目的根目录中执行go get命令的话,go get会同步更新gomod和gosum文件,gomod中记录的是依赖名及其版本,如:

gosum文件中则会记录依赖包的哈希值(同时还有依赖包中gomod的哈希值),如:

在更新gosum之前,为了确保下载的依赖包是真实可靠的,go命令在下载完依赖包后还会查询GOSUMDB环境变量所指示的服务器,以得到一个权威的依赖包版本哈希值。如果go命令计算出的依赖包版本哈希值与GOSUMDB服务器给出的哈希值不一致,go命令将拒绝向下执行,也不会更新gosum文件。

gosum存在的意义在于,希望别人或者在别的环境中构建当前项目时所使用依赖包跟gosum中记录的是完全一致的,从而达到一致构建的目的。

校验

假设我们拿到某项目的源代码并尝试在本地构建,go命令会从本地缓存中查找所有gomod中记录的依赖包,并计算本地依赖包的哈希值,然后与gosum中的记录进行对比,即检测本地缓存中使用的依赖包版本是否满足项目gosum文件的期望。

如果校验失败,说明本地缓存目录中依赖包版本的哈希值和项目中gosum中记录的哈希值不一致,go命令将拒绝构建。 这就是gosum存在的意义,即如果不使用期望的版本,就不能构建。

校验和数据库

环境变量GOSUMDB标识一个checksum database,即校验和数据库,实际上是一个web服务器,该服务器提供查询依赖包版本哈希值的服务。

该数据库中记录了很多依赖包版本的哈希值,比如Google官方的sumgolangorg则记录了所有的可公开获得的依赖包版本。除了使用官方的数据库,还可以指定自行搭建的数据库,甚至干脆禁用它(export GOSUMDB=off)。

如果系统配置了GOSUMDB,在依赖包版本被写入gosum之前会向该数据库查询该依赖包版本的哈希值进行二次校验,校验无误后再写入gosum。

如果系统禁用了GOSUMDB,在依赖包版本被写入gosum之前则不会进行二次校验,go命令会相信所有下载到的依赖包,并把其哈希值记录到gosum中。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13278382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-06
下一篇 2023-07-06

发表评论

登录后才能评论

评论列表(0条)

保存