开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
真的,没想到平常买东西碰上了假货,没想到敲代码用框架也用上假的了。起初是安装micro框架,GitHub上搜出来的micro已经不支持go-micro的一些用法,但是它极为相似,第一次使用我也不太熟悉,弄了很久发现为啥micro框架生成的代码不大对劲,然后在网上找到一篇教程,才终于解答疑惑。go-micro安装
go-micro框架安装、使用
- 首先在windows上安装go-micro
go install github.com/go-micro/cli/cmd/go-micro@latest
或者
安装成功后输入go-micro -v查看是否安装成功
- 使用go-micro new命令初始化服务
使用命令go-micro new service helloworld 就会在当前路径下创建helloworl文件夹,其中包含一个service类型的微服务。
紧接着我们去修改proto文件,因为他初始化设置了很多参数,用来测试微服务是否能连接成功,所以我们只需要保留Call方法以及对应传入参数Request和传出参数Response。
定义好proto文件后,我们创建出对应的微服务go文件
//首先需要下载依赖
make
//然后创建出按照proto文件生成的所需要的微服务go文件
make proto
我们只保留了Call方法,然后在Call方法中实现所需要的功能,用Request和Response来传输数据。
最后我们们修改main文件,增加consul作为服务发现
首先需要导入consul依赖,终端下运行
go get github.com/go-micro/plugins/v4/registry/consul
然后修改mian函数增加consul
//初始化consul配置
consulReg := consul.NewRegistry()
// Create service
srv := micro.NewService()
srv.Init(
micro.Name(service),
micro.Version(version),
micro.Registry(consulReg), //使用consul作为服务发现
micro.Address("127.0.0.1:1111"), //增加consul服务指定的地址
)
``````
这样一个微服务端就定义好了,接下来我们就可以在客户端中调用了。
在client调用微服务的Call函数
首先依然需要在client导入consul依赖,终端下运行
go get github.com/go-micro/plugins/v4/registry/consul
//初始化consul配置
consulReg := consul.NewRegistry()
//创建一个microService,使用consul默认配置
consulService := micro.NewService(
micro.Registry(consulReg),
)
request := getCaptcha.CallRequest{}
//创建micro客户端,第一个参数为服务名称,第二个参数为上面创建的consulService的Client
microClient := getCaptcha.NewGetCaptchaService("getCaptcha", consulService.Client())
//micro客户端调用call方法,使用resp接收返回的数据,
//第一个参数为context.TODO( ) , 指定一个不为空的Context
//第二个参数为request消息体
resp, err := microClient.Call(context.TODO(), &request)
if err != nil {
fmt.Println("microClient调用Call方法失败,错误为:", err)
return
}
这就是使用go-micro框架实现一个简单的微服务完整流程了,之后使用的时候就是按照这个流程去创建微服务。
踩坑补充
在做毕设的时候,我把consul部署在一台华为云服务器上并且把微服务也运行在服务器上并注册上去了。但当时我在本机进行调试的时候,发现找到了consul但是调用不了微服务,总是报408错误。这就让我百思不得其解,还以为是我在客户端代码有问题调用失败,一直在尝试修改代码还是不行。但当微服务通过我本机注册上consul的时候又能成功调用。这么一对比才发现两个方式的不同。
consul是通过提供调用微服务的IP+端口给客户端来进行服务发现的
所以当我的微服务注册在云服务器上时,提供的是服务器内网地址,我的本机肯定调用不了才会出现超时调用不了的情况。但当我使用本机提供微服务并注册上consul,提供的是本地的socket这就是为什么本机注册的微服务可以调用成功的原因。
解决方案
将本机和另外两台服务器,通过ZeroTier One搭建小型局域网进行内网穿透,这样就可以通过consul提供的socket调用服务器上的微服务啦。