geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
166 stars 21 forks source link

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

Open geektutu opened 3 years ago

geektutu commented 3 years ago

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)等特性。

xhofe commented 3 years ago

大佬又更新七天系列辣

geektutu commented 3 years ago

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

hushui502 commented 3 years ago

tql

geektutu commented 3 years ago

@hushui502 笔芯~

haoheipi commented 3 years ago

支持!

geektutu commented 3 years ago

@haoheipi 感谢支持~

seki47 commented 3 years ago

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

geektutu commented 3 years ago

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

liron-li commented 3 years ago

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

geektutu commented 3 years ago

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

xlban163 commented 3 years ago

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

geektutu commented 3 years ago

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

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

wilgx0 commented 3 years ago

仰之弥高,钻之弥坚

fdx321 commented 3 years ago

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

yudidi commented 3 years ago

对于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都没有?
wilgx0 commented 3 years ago

@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) 应该会使客户端阻塞在这个位置不在向下执行,服务器也不会回应你任何消息。不理解的话 多看几遍兔大佬的代码

codevvvv9 commented 3 years ago

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

no-serve-people commented 3 years ago

厉害了

Moshiwei commented 3 years ago

真的太厉害了,谢谢兔兔

q-meet commented 2 years ago

好文 好文

018429 commented 2 years ago

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

DurantVivado commented 2 years ago

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

ruiwu-bupt commented 1 year ago

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

youjiaxing commented 3 weeks ago

24年看到的教程,支持~