go-mciro系列(二) 手写第一个微服务_go-micro 4 proto3 怎么写,2024年最新顺利拿到OPPO公司Golang架构师offer

24 阅读2分钟

string username = 1; string token = 2; string nickname = 3; }


### 生成rpc文件


注意以下命令是在项目的根目录执行的,如果你在其它目录记得修改`--go_out``--micro_out`目录,`--go_out``--micro_out`的目录都是相对于执行命令所在的目录的



protoc --go_out=./proto --micro_out=./proto ./proto/user.proto


### 编写main.go



package main

import ( "context" "github.com/micro/go-micro/v2" "log" "microdemo/proto" )

type Service struct { }

func (s *Service) Register(ctx context.Context, req *proto.RegisterRequest, res *proto.RegisterResponse) error { res.Username = req.Username res.Token = "13123412" res.Nickname = req.Nickname return nil }

func main() { // 实例化 srv := micro.NewService(micro.Name("user"), micro.Address("127.0.0.1:8001")) // 初始化 srv.Init() // 注册服务 err := proto.RegisterUserHandler(srv.Server(), new(Service)) if err != nil { log.Fatalln("注册服务失败", err) } // 运行服务 err = srv.Run() if err != nil { log.Fatalln("启动服务失败", err) } }


这里没有配置注册中心,因此使用的是micro默认的mdns作为注册中心,后面会讲使用其他注册中心。



### 编写client.go



package main

import ( "context" "fmt" "github.com/micro/go-micro/v2" "log" "microdemo/proto" )

func main() { // 实例化 srv := micro.NewService(micro.Name("user.client")) // 初始化 srv.Init() // 调用其他服务 user := proto.NewUserService("user", srv.Client()) res, err := user.Register(context.TODO(), &proto.RegisterRequest{ Username: "18232587802", Password: "123456", Nickname: "王小明", }) if err != nil { log.Fatalln("调用服务出错", err) } fmt.Println(res) }


### 运行测试


运行main.go


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9ec521eb4e20483f920c54643e529f67~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252482&x-signature=AiMNqRr9v6d%2F1Kf8HuqEqtxEo%2F4%3D)


运行client.go


![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/59f21046724c446fbc7131954da88206~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252482&x-signature=fRFE1V1TxX8tEOX8%2FDGIIbgSSl8%3D)


可以看到正常打印出了结果,说明客户端调用服务端成功了。


注意:要先运行main.go启动user服务,然后再运行client.go客户端调用服务,否则会提示服务未发现。


说明:我在自己一个windows电脑上使用mdns注册中心,客户端发现不了服务,另一个windows电脑上可以正常发现,目前还没有调试出问题在哪,后续有结果会补充。因此gitee仓库中的演示中包含使用consul注册中心的代码,大家使用mdns作为注册中心演示时需要注释掉consul注册中心的代码。


### 演示代码


<https://gitee.com/zjq528/micro-study/tree/master/microdemo>







![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/dcb49d60e044498cbfdd76260e85cb9e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252482&x-signature=JEly37Lxli2MogEmZ4vSdQ8XUWM%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/805fde85541d4b2f9b844e370bca9f69~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252482&x-signature=pdt%2BjaG8yUxxcGA3VvunTQgZ7gc%3D)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://gitee.com/vip204888)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**