blog icon indicating copy to clipboard operation
blog copied to clipboard

7天用Go从零实现RPC框架GeeRPC | 极客兔兔

Open geektutu opened this issue 5 years ago • 25 comments

https://geektutu.com/post/geerpc.html

7天用 Go语言/golang 从零实现 RPC 框架 GeeRPC 教程(7 days implement golang remote procedure call framework from scratch tutorial),动手写 RPC 框架,参照 golang标准库 net/rpc 的实现,实现了服务端(server)、支持异步和并发的客户端(client)、消息编码与解码(message encoding and decoding)、服务注册(service register)、支持 TCP/Unix/HTTP 等多种传输协议。并在此基础上新增了协议交换(protocol exchange)、注册中心(registry)、服务发现(service discovery)、负载均衡(load balance)、超时处理(timeout processing)等特性。

geektutu avatar Oct 07 '20 04:10 geektutu

大佬又更新七天系列辣

xhofe avatar Oct 09 '20 03:10 xhofe

@Xhofe 国庆抽时间填了个坑,感谢你的支持呢~

geektutu avatar Oct 09 '20 07:10 geektutu

tql

hushui502 avatar Oct 12 '20 05:10 hushui502

@hushui502 笔芯~

geektutu avatar Oct 12 '20 05:10 geektutu

支持!

haoheipi avatar Oct 17 '20 07:10 haoheipi

@haoheipi 感谢支持~

geektutu avatar Oct 17 '20 15:10 geektutu

膜拜大佬 边学go语法边跟着学!

seki47 avatar Nov 12 '20 03:11 seki47

@seki47 配合使用,快速掌握,哈哈~ 👏

geektutu avatar Nov 22 '20 14:11 geektutu

写的很好,受益匪浅 感谢大佬分享

liron-li avatar Dec 03 '20 13:12 liron-li

@liron-li 感谢赞赏和支持~ 笔芯 😸

geektutu avatar Dec 04 '20 06:12 geektutu

大佬的文章,深入浅出,简洁易懂,受益匪浅。感谢感谢

xlban163 avatar Jan 12 '21 06:01 xlban163

大佬的文章,深入浅出,简洁易懂,受益匪浅。感谢感谢

@xlban163 感谢你的支持和认可,ღ( ´・ᴗ・` )比心

geektutu avatar Jan 14 '21 14:01 geektutu

仰之弥高,钻之弥坚

wilgx0 avatar Mar 16 '21 03:03 wilgx0

博主辛苦,这几个系列很有帮助,打赏支持一下。

fdx321 avatar Mar 17 '21 09:03 fdx321

对于day1-rpc目录的这一句话,大佬们可以给我解释下吗? https://github.com/geektutu/7days-golang/blob/9898515ba39d223be48e41c832633b8a79f0d82a/gee-rpc/day1-codec/main/main.go#L35

_ = json.NewEncoder(conn).Encode(geerpc.DefaultOption) //我理解这句话执行完成应该已经往conn里面写入了内容,那么如果我此时应该可以从conn中读取到刚刚写入的内容。
// 为了验证刚刚的猜想,我增加了下面这几句,我理解应该可以从conn读出内容才对。
buf := make([]byte,1024)
n,err := conn.Read(buf) // 但是为什么执行到conn.Read,程序就直接退出了,甚至连panic都没有?

yudidi avatar Mar 19 '21 11:03 yudidi

@yudidi 对于day1-rpc目录的这一句话,大佬们可以给我解释下吗? https://github.com/geektutu/7days-golang/blob/9898515ba39d223be48e41c832633b8a79f0d82a/gee-rpc/day1-codec/main/main.go#L35

_ = json.NewEncoder(conn).Encode(geerpc.DefaultOption) //我理解这句话执行完成应该已经往conn里面写入了内容,那么如果我此时应该可以从conn中读取到刚刚写入的内容。
// 为了验证刚刚的猜想,我增加了下面这几句,我理解应该可以从conn读出内容才对。
buf := make([]byte,1024)
n,err := conn.Read(buf) // 但是为什么执行到conn.Read,程序就直接退出了,甚至连panic都没有?

_ = json.NewEncoder(conn).Encode(geerpc.DefaultOption) 这一句是客户端告诉服务器需要使用的消息解码器的类型 , 服务端选择了消息解码器之后会阻塞等待客户端发送具体的消息内容。而你接下来的这句 n,err := conn.Read(buf) 应该会使客户端阻塞在这个位置不在向下执行,服务器也不会回应你任何消息。不理解的话 多看几遍兔大佬的代码

wilgx0 avatar Mar 23 '21 06:03 wilgx0

谢谢极客兔兔,让我有机会一窥其中奥秘

codevvvv9 avatar Apr 22 '21 01:04 codevvvv9

厉害了

no-serve-people avatar Jun 05 '21 23:06 no-serve-people

真的太厉害了,谢谢兔兔

Moshiwei avatar Jul 14 '21 09:07 Moshiwei

好文 好文

q-meet avatar Oct 25 '21 03:10 q-meet

大佬的文章,深入浅出,简洁易懂,受益匪浅。感谢感谢

018429 avatar Dec 01 '21 11:12 018429

“我们可以想象下两台机器上,两个应用程序之间需要通信,那么首先,需要确定采用的传输协议是什么?如果这个两个应用程序位于不同的机器,那么一般会选择 TCP 协议或者 HTTP 协议;”这句话不太严谨,HTTP是应用层协议,一般也会采用TCP(传输层协议)+IP(网络层协议)。我猜大佬想说的是,“一般会选择TCP或者UDP协议”。欢迎批评指正!

DurantVivado avatar Jan 14 '22 08:01 DurantVivado

@DurantVivado “我们可以想象下两台机器上,两个应用程序之间需要通信,那么首先,需要确定采用的传输协议是什么?如果这个两个应用程序位于不同的机器,那么一般会选择 TCP 协议或者 HTTP 协议;”这句话不太严谨,HTTP是应用层协议,一般也会采用TCP(传输层协议)+IP(网络层协议)。我猜大佬想说的是,“一般会选择TCP或者UDP协议”。欢迎批评指正! tcp协议比http低一层。应该一种是说直接用tcp,自定义应用层协议格式(游戏服务端会这么干);或者直接用http作为应用层协议

ruiwu-bupt avatar Aug 31 '22 04:08 ruiwu-bupt