00:10
好。接下来我们。继续来。运行一下server和client。咱去做个调用。搜咱重启一下啊。好,收起来了。咱再去调用一下客户端。看到没有,咱的输出已经变了,变成叫hello跟啊,说明咱咱已经调用到了啊c hello这么一个方法。
01:02
咱看一下官网,它有一个叫做可以指定name啊,咱叫爱丽丝。咱没有如预期一般的输出爱丽丝,嗯,Hello,干啊,咱们看一眼是什么问题啊?
02:13
咱找一下问题在哪里啊。
03:12
来打印一下。打印数据啊。好,咱的客户端呢。有成功的。获取到爱丽丝。这个。名字。啊,我们已经成功打印出来Alice啊。刚才看错了。没,没问题。我以为。
04:05
好,到这里呢,我们就已经成功的把。官网教我们的步骤都走了一遍。那么我们跟着官网走了一遍之后呢,大家是不是感觉就是说。知其然,不知其所以然。所以我们也大概来接下来我们来讲一下,就是说这个标准代码到底是有些什么东西在里头啊。咱先看一下啊,这个协议文件咱已经看过了。大概就是第一步定义了一个服务。第二步。做了。两个数据结构的一个定义。这就是整个整个GBC一个服务的一个声明,相当于是。那么它生成了两个文件,一个叫做PB.go的,一个是JPC.pb.go。
05:04
咱看下PP点购的。这里头呢,其实就是说对输入输出这两个数据文件啊,那两个数据结构做了一些处理。大家看一下,根据这个。工具的显示啊,咱这个ID的显示咱可以看到啊。他生,他替我们生存了。这个。他替我们生成的这个啊。两个数据结构的。内容它是有去做一些接口实现的。这个构语言的一个接口实现啊,跟其他语言可能有点不一样啊,它并不需要说去指定关键词。过云的一个接口实验,就是说我的接口声明了什么方法。
06:02
你的结构体。同样有实现,有实现同样的方法,他就会认为你。实现了。实现了它。就比如说我们对一个人的定义。就有手、有脚,有头、有鼻子有脸,这就是一个人。如果有一个结构体。他实现了手脚头脸口鼻子,那他就是一个人。简单的一个逻辑是像什么就是什么,大概就是这么一个意思,所以它这里啊,咱看不到关键词,但是呢,它是实现了这么一些。内容。实现了这么一些借口。他为什么要实现这个接口呢?其实就是说他为。他在传恩请求的传递过程当中,他去做一些序列化压缩。
07:05
提供一些方法实现。啊,这个文件就是包含这些内容啊,就是整个呃,序列化压缩呀。都在这里面做了一个具体实现。然后第二个文件。待过年咱看啊,它包含的。两部分。三部分啊,咱第一部分是一个,呃,客户端的一个stop,这就叫客户端的一个stop啊。然后以借口的方式。实现的啊。咱先定义啊,这个包含一个是hello,一个是hello盖,然后呢,再对这个。嗯。定义做一个实现。第二个部分呢,是一个S的一个实现。
08:04
第三个部分呢,就是。具体方法的一个handle的一个实现。以及。Service的一个描述。咱看一下客户端这块啊,客户端这块他去。重写了这个c hello,啊,实现了这个c hello。然后呢,通过反射的形式去调用啊,这么一个service下面的一个方法啊,赛拉同上啊。然后呢,Service呢啊呢,也是同样的一个逻辑,它这里定义了。它比我们预期要多出一个方法啊,这个地方大家注意一下,就是大家初看可能觉得,呃,这是在interface里面去调用的这么一个方法,这里其实不是啊。
09:04
他其实是在interface里面去重新定义了啊,去多加了一个方法的定义啊,多加了一个方法的声明,只是一个它没有输入输出的一个方法。然后接下来他定了一个叫做结构体,一个未实现社会的一个结构体啊。他对这么一个社保做了一个默认实现。咱看下主要都是一些提示。就说你没有实现这个方法。咱看一下这个。最后他加的这么一个方法啊,最后加的这个方法呢,它是实现了一个空方法,什么都没有。我猜测他的意图啊,其实就是为了做个提示,就这个方法名呢,就是个提示。
10:04
咱大家大概看一眼啊,就是说。说咱在外面实现的这个事啊,他必须去内嵌这么一个结构体在里头。所以这只是说做一个提示的作用。这这个unsafe这个呢,就没什么用。好,下面有个方式呢。做一个。是我注册的。就我们师傅在运行前需要呃,把师否的一个具体实现传过来啊,给他注册上。下面呢是say hello,就是我们service声明的方法的一个具体实现。一个处理逻辑啊,就怎么去调用它。哎,也是通过一个。方法名方法路径,方法路径去调用,调用的啊就是符service name加c hello service name加name啊去调用。
11:08
好,最后咱看一下。这个service的一个描述,首先它定义这个surface name,一个hello word点。你看这个hello是我们这个协议里头哪个hello word呢。待会儿跟大家说好。下面是。指定了它所包含的一些方法以及。他的一个协议文件。那么这个是hello。这个放名啊,这个hello word.great这个前面这个。Hello,到底是协议里头的package呢,还是?Go package呢?大家可能不太清楚,待会我们自己通过代码去验证一下。还有一个要注意的点啊,咱这个。
12:03
定义数据结构,它有指定一个名称和一个数字。啊,我这里说是一个数字啊,因为大家可能不知道它是什么东西。我跟大家说啊,这个数字呢,据官网描述呢,它是一个标识号。比如我再加一个字段。我在加个电话号。我给他指定一个叫做三。那可不可以呢?它也是可以的。所以它不是一个序号,它并不要求你说必须是123下来啊。好,我们来试一下啊。啊,刚才我们有两个问题啊,我们带着两个问题走,一个是。Page name。啊,那个STEM里头的到底是。这个package还是go package?
13:01
的一个描述。咱怎么去实现呢?怎么去验证呢。咱自己新建一个项目好吧。给他。单拎开来啊。叫G。RPC。Server,好吧。好,咱去。把协议文件给复制过来。看咱的那个文件路径都跟他写的不一样啊。咱就把协议文件复制过来。
14:00
嗯。咱们那些没用的删掉。下面这些与Java相关的啊,Java相关的我们也不需要。我们是够嘛啊。Java相关的不需要。我们的go package指定什么目录呢?咱去指定一个。之前咱项目的目录。那么咱的PA指巾什么也是指定,Hello。
15:03
啊,咱先把它运行起来啊。好,协议文件咱处理完完了啊,咱就完成了,第一步叫做先定义破文件。第二步,我们要去生成这么一个。协议代码啊,标准标准的一个RPC代码,嗯,咱复制过来。生成一个标准的RPP代码。听一下还我。咱去生成一下。好,生成成功了啊。但是呢,一对报错。为什么呢?
16:01
因为它有一些一代没有安装。你去安装一下依赖。好,咱的报酬解决了啊,那么咱去。写一个社法。好,咱就把咱就把例子里的serve复制过来啊。咱。
17:54
咱们把例子的代码复制过来,咱来。吃一下这个手。
18:07
Go。好,启动失败说我们这个。呃,端口已经被使用了啊,咱去给他换一个。那个50052。好,我们的福就起来了。那我们接下来干什么呢?咱拿丽泽代码去。马丽子客户端去调用我们的50052。好。咱改一下这个电的端口地址啊。
19:08
好,报错了。他告诉我们说没有实现。这个service。为什么呢?因为我们的例子代码的两个package name,两个pageage都是指定的hello word。然后我们自己写的这个service呢,我们的两个都是指定的。Hello。所以他是钓不着的。因为我们刚才也看了一下咱的这个service啊,它是。它的方法调用是根据STEM加方法名来的。所以咱的设备是设name不对,所以他肯定调用调用不到。那我们现在不知道到底是。哪个package的问题啊,那咱就给它重新生成,咱来改。
20:01
咱打开这个协议文件啊,Po文件。咱先改go package啊,咱给它改成word。哇。咱们复制一下啊。避免把单子写错啊。好,那么我们来重新生成一下。重新生成一下代码。没有我们的。Page改过来了,嗯。但是我们去看一下我们的service package service service那个service name,它也是还是没有改过来的,但是我们的,呃,代码的啊。
21:05
标准代码所在的报名是改了。不知道大家有没有注意到一个现象啊,就是。我们平时import的时候啊。它到底是I input的什么东西?是I input的目录呢?还是I input的包名?这里应该大家可以看出来啊,咱再运行一下这个服务。你看这个服务是没有报错的,说明什么?你看我们引用的是GBC杠,Serve杠,Hello,下面啊,这其实import一个包,但你没有发现这是import的一个目录。它并不是import的一个包名,如果是import包名,我们这应该怎么写,应该是hello。啊。海洛的这个报错,事实上它是import一个文件。一个目录。
22:05
但是我们的报名啊,报名是害的,呃,文件目录是害漏。所以这个地方大家注意一下,可能大家平时呃都习惯于把包名和文件名命名成一样的,所以没有留意到这一块啊。那么我们生成的一个。Server server name是没有变的。所以我们预期。我们还是会调用不成功。咱们看一下。没有还是说没有定这个社保。所以协议里头的一个package package才是指定的。Service service name和service name相关。所以我们去把这个改一下。
23:02
好,咱改一下之后呢,重新去生成一下标准代码,嗯。咱先来观察一下。看呀,我们的service描述变了吧?我们重新来起一下这个福。好,切换到我们的用例代码。再来调一下客户啦。没有,他已经调成功了。那么第一个问题我们解决了啊,第一个问题我们已经有结果了,就是报名上面的报名呢是。
24:02
代码目录所致的报名,下面这个package name呢是与相关的一个报名。与社是栏目相关呢,一个报名。下面这个会影响到影响,影响到我们这个。而不调成不成功的一个关键啊。嗯,接下来我们讲第二个问题。就是这个数字。到底有什么影响?好吧。首先呢,我们去给我们的,嗯。
25:00
客户端啊,这个GC这边源码这一块的,Hello word这个去重新生成一下,因为我们改了这个。嗯。点po的文件,我们没有重新申请代码。好,我们重新生成一个代码,我们观察一下啊。看一下我们的电话号是不是加上了,看到没有电话号码啊,已经加上了。我们的name的标识是一,电话号的标识是三啊。那么我们客户端去做点什么呢?咱去接收一个电话号,传到服务端,让他去打印。
26:23
咱从命列行去接收,呃,一个叫父母的自带,然后。通过hello盖。去传给富代。然后在服务端做点什么事呢?啊,服务端当然需要接受这个字段去打印。Say hello,盖啊,咱再去接收一下。给他加一点逻辑啊。
27:07
啊,它逗号这个the form。咱就可以打印一个get啊,咱把它打印出来。咱重新去起一下这个服。啊,咱设备是改了啊,咱设的hello,咱打印了一个名字和一个电话啊,名字在前,电话在后。那我们客户端去调用一下。
28:19
看到没有,他们的名字在前,电话在后,打印出来了啊,没问题啊。这里去。咱给他log打印一下啊。
29:02
回答一下。服服务service service也接到了啊。那么接下来我们做件什么事呢?我们要凸显这个数字。那么我们我们就把它俩对调一下。真的。字段名不变。咱给他把。
30:02
标识号变一下。咱再去重新生成一下这个标准代码。咱看有什么区别没有啊。啊,字段名的顺序还是一样的,但是呢,这里有个表示二变了啊。好,我们再重新运行一下。好,我们的服务器起来了,我们去调用一下。那么数据结果还会和上次一样吗?大家可以想一下啊。看见没有?和上次的结果是不一样的,看见没有?上一次是名字在前,电话在后。
31:04
这一次呢?电话在前,名字在后。说明什么?说明,RBC的一个通讯,它用的不是字段名。他用的是这个。标识号。是用的这么这后面一个这个数字,而不是而不是我们通常认为的字段名去传递的。到这里呢,我们的。RBC的应用呢,基本上大家也有个大概的了解了啊。大概的使用流程就是先定义这个po文件。
32:02
然后呢,去执行生成标准代码的这么一个命令。生成完了之后呢,会生成两个文件,一个点PP.go啊,主要是啊。一些数据结构的一个生产。还有一个呢,是。JBC.pb.go这就是啊,Server server的一个定义和客户端的一个定义啊,都形成在这里头了。第三步呢,就是说客,第三步和第四步呢,就是说服务端使用这么一个生成的标准代码去提供服务啊没有。客户端呢,也去使用这么一个生成的代码去调用服务端啊,这整体的流程就这样。
33:07
那么呢,我们接下来做啥呢?就是说我们去。看一下PB这么一个东西,咱去看一下啊。看看到底是什么东西?好,PB的一个介绍,我这是从。嗯,官网和其他地方去整,大概整理了一下啊,他就是这么一个,嗯。虚拟化框架。语言中立,平台中立,可扩展。咱去看一下PB的一个官方文档。看一下啊,这是我找到的一个PB的一个官方文档。
34:08
他给我们详细讲述了去怎么去定义一个变量,怎么去使用。咱可以咱的例子使用的一个。使用的一个数据结构还是比较简单的,就是啊,一个字两个字。咱去做一些。实践。来做些比较复杂的实践啊。咱去怎么做呢?咱首先看他能不能去。
35:02
看官网啊。去做一些。稍微复杂的内嵌呐。枚举啊。以及数组啊。之类的。只能再定一个type type。嗯。来订一个什么订一个。
36:00
好,定一个地址好吧。漫画里都包含什么呢?不好审。是啊。省直线。然后呢,我们去把它给啊组合组合起来。
37:02
队重新申请设置代码。咱看一下啊。咱的hello request里头包含了一个address的一个。结构啊,一个字段,这个字段呢,是一个address啊,来看一下address address。没有。整个dress定义也生成了。那么如果我们有多个dress怎么办呢?是吧,那我们就可能要涉及到一个数组,那我们再去尝试一下。入住。
38:12
数组数组数组,咱们看一下数组用什么啊。数组,这有一个叫做repeat,去看一下。那要把谁做成一个repeat呢?我们去把。地址做成一个配子。这样。
39:02
那么大家想一想会是什么效果啊?三明心下。看到没有?这就变成了一个数组结构了。咱再看一下官网的。其他类型啊。还有个枚举,咱没举释一下好吧。没有,咱来复制一下他这个枚举。
40:03
好,我们给它放起来,咱直接把霉菌内嵌到这个。Hello request里头咱去试一下,看它长什么样。样枚举的一些内容就生成了啊,它是以常量的形式来体现的。然后这里生成一个相对应的一个map,因为它是支持别名的。咱几咱。大概看一下这个结构啊。然后我们再去把,我们再去把刚才这行代码去改一下啊,咱就看啊,它定义枚举这里多了一多了一个。
41:01
选项啊,他说允许别名。我们把这个给去掉看。看好,我们现在结构有什么不一样?
42:06
结构其实是一样的。但是呢,刚才我们发现了一个报错,这个报错是什么呢。就是它原来的K值呢,有两个是一样的啊,有两个一啊,它每举两个一。然后呢,我们去生成是会报语法错的,但是我们去把这个。别名啊,这个就打开。那他就没有问题。那我们可以意识到一个别名,就是说,呃,我这两个别名都是指向。这一个值。
43:00
是吧,你看。那我们再看一下啊,再看一下还有其他的。什么?类型。哦,咱这里还有一个叫什么,这里还有一个叫做。预留值,预留值这么一个概念啊。什么叫预留值呢?它这里主要涉及到一个。呃,兼容问题。
44:02
在知道这个咱是提供服务啊,这个客户端和服务端是基于同样一个协议去啊。基于同样一个协议去。交换数据,但是呢,客户端是客户端,服务端是服务端。它总有不一样的时候,所以呢,为了兼容这种情况呢。他就出了一个叫做。保留字段这么一个概念啊,就是预留字段这么一个概念。咱看一下啊。咱从文档上也摘录下来,就是说它向前向后兼容的一个注意事项,一个是不得更改任何现有字段的标记,咱之前也改过,咱将name和form的一个标记号啊反过来了,反过来之后呢,它的传值也是跟着反过来了的,第二个可以删除字段。
45:00
但大家想一想,这第二点可以删除字段,字段删了之后怎么办?他这个标记号是不是就少了一个。比如说我服务端删了这个字段,怎么服务端把删掉,删掉之后客户端还在使用form怎么办?是不是有这个想,是不是有这个问题。这个地方呢,嗯。我这个字段就体现在这里了啊,就是说咱去删掉了一个字段啊,咱服务端删掉一个字段啊,咱的项目呢,通常是多个人在做啊,那我删掉这个字段呢,如果我不做任何处理啊。我就是把它删掉了。比如说我把这个form删掉了。我把父母删掉了。
46:03
那么从。这个文件从这个呃,Pod这个定义上来看。我会认为。我们就没有父母这个字段,但是我们的server呢?他并没有去删除父母这个字段,所以他还是有的。所以预留自带的一个作用就体现在这里,就是说。咱来试一下啊,预留字段,你看这个关键词来指定这个预留字段。他什么作用呢?我父母不是删掉了吗?我父母是三嘛是吧。那父母是三,那我去给它加个加个保留,哎,叫做三。什么意思?就这个三,以后谁也别用,就这个意思。
47:02
你看我再来定义一个字段,比如说我叫做form,嗯。没有他就会把语法错误。他告诉你父母。这段已经。嗯。使用了什么?使用了被保留自带。所以他就这么一个概念。那咱看官网啊,官网你看这个。这什么意思啊?咱复制过来。你看一下什么意思啊。布置过来。意思就是保留25 91。
48:02
然后40G以后的所有数字啊,所有标记号。就是这些都不能用。然后保留字段名。福特巴。你看,所以咱加了之后呢,咱这个address它就报错了,说已经使用了保留的。我们给它改一下,你改成啥呢。还是还可以用,你看没有。然后我们再去申明一个字段,这是什么呢?好。说明他保留的这个。知道没有?有没有也是不行的。
49:02
你看我是。声明一个小写的是可以的,然后再声明一个大写的。上面个大写的,他说我们使用了。被保留子弹。但是这个小写的也报错了。他告诉我们啦,POD3语法这个字段名了,必须唯一。就是它字段名其实不区分大小写的,但是在语法检查呢,它是有大小写区分的啊,那咱把它注掉。
50:09
是没问题的。就是语法检查能过。那这样写语法简直又不能过了啊,就是。没有。所以这块注意一下啊。叫八一。被保留的一个。标记号啊,被保留的标记号和被保留的字段名啊,都是不能被重新定义的。咱看下40TWO marks 40two marks。啊,40不行,41也不行。好,500。还是不行对吧,40TO max,呃,这个max是多大呢?
51:06
呃,可能是整形的最大值吧。大家回头可以去试一下,看这个max。最大能到多大啊?我们把这些删掉。来重新生成一下啊。好,字段都加上了,咱再来看一下。第三点啊,向前向后兼容的注意事项,第三点可以添加新思字段,但是必须使用新的标记号。
52:05
却从未使用过。即使是已经删除的字段也没有使用过,就新加的字段标记号必须是新的。唯一标识啊,这个唯一标识它是有范围的啊,是作用在这个呃,结构的定义里头是唯一的啊。但如果出了这个结构啊,这个结构外面咱就不管了啊,你看。他这第三点为什么会有这么一个要求呢?就是即使是已经删除了这段,也要没有使用过这么一个东西。咱想想啊。咱的客户端服务端是会存在不同步的啊,你看咱咱目前已经不同步了啊,咱看一下啊,你看。
53:00
咱是不是已经不同步了,咱的服务端,哎,就这么几个字段。站在客户端,你看字段多着呢。看我服务端是保留了啊,咱客户端啊,客户端把给。给怎么了呢?看看客户端。把父母已经删掉了,咱把这个保留字段也去掉,这咱就已经相当于把父母给删掉了啊,咱再去加一个字段,加一个字段叫什么呢。咱家个叫做。微信号。怎样去使用三这个标识?那么问题就出现了。
54:02
你的服务端诶,还是正常的接收了三这个序号啊,那服务端改过来。咱正常接受了三这个序号。咱客户端呢,哎把把电话给删掉了,但是呢。嗯,我又重新订了个就微信微信号啊,微信号微信号呢,使用三这个标识。这会导致什么问题?之前我已经演示过了啊。导致的问题是。咋样把电话删了,导致问题就会会串。他没有保存到他预期的业务代码里头。
55:00
预写的业务值里头。好,咱加微信。咱微信啊,咱假如微信就说啊微信。ID啊。123456好吧,咱这微信号。我传过去了,传到四五端了。
56:04
15段呢?把它当做电话接收了。从SE再重新生成一下。咱再运行一下。没有。是什么问题导致的?就是因为我使用了曾经定义过的。曾经使用过的标记号、标识号。
57:01
但是呢,由于。客户端和服务端。它存在版本问题啊,存在版本不一致的情况,所以导致的一个问题就是。我的老版本的。我的老版本的server接收到了。微信号。把新版本的客户端加的微信号写到了电话号里头,这就会导致我们在业务处理上会出现一些偏差。所以这个地方。为什么这么要求呢,是吧?就是说可以添加新字段,但是必须使用新的标记号及从未使用过,从来没有用过。哪怕是已经删除过的字段也没有用过啊,就是这么一个逻辑在这里啊。这三天咱都一一验证了,好。不能更改现有的字段标识号啊,咱既然改了,电话和名字换过来了。
58:03
那么它的值也传错了。第二个可以删除啊,咱删一个啊。咱删除删除。咱把server的。嗯,咱不可孤单的。表示三删了。再给它改成四啊。五个。这样咱就相当于把电话号啊,电话号那个删掉了,电话号自然删掉了。你看删除之后呢,整体服务是并不受影响的啊,就是。
59:02
但是他没有处理值啊,但是他没有值。就是代码不会啊,不会报错,但是事实上它的业务可能是受一些影响的。只是他这个电话号是取不到了。好,这三点咱就一一验证了。好,那么咱今天的主要目的啊,咱三个重点都已经讲过了啊,一个是GPC的一个应用。第二个是呢,GPC一个标准代码的讲解。第三个呢,是。PhoTo Buff的一个介绍和应用啊,咱就一一都讲到了啊,大家自己回去,嗯,再好好复习一下,做一些代码上的实践啊,不要光听啊。然后今天的课程呢,咱就先到这儿啊,谢谢大家。
我来说两句