在构建微服务时,使用服务发现可以减少配置的复杂性,本文以go-micro为微服务框架,使用consul作为服务发现服务,使用gin开发golang服务。
使用gin 的原因是gin能够很好的和go-micro进行集成。
本文主要介绍服务注册和发现的实现
关于如何搭建consul服务可以移步:
ubuntu+docker+consul安装部署及使用www.jianshu.com
本文默认以搭建好了consul服务,服务的地址是:192.168.109.131:8500
如果你搭建好了自己的consul服务,可以在浏览器内输入192.168.109.131:8500(地址根据自己的consul服务做调整),会看到如下界面:
这里我的consul服务启用了 3个节点。
填坑
在开始写代码前,先给大家避一避坑,目前go-micro已经更新到v2版本,此版本去除了对consul 的支持,但支持etcd、mdns作为服务发现,但是老版本的go-micro仍支持consul,但是有些地方做了调整。
首先
这些小编折腾了很久才搞明白,这里先给大家提醒下,避免走我的老路
开撸
- 服务注册
我们预设两个server,userserver和orderserver
下面开始上代码:
userserver程序结果如下:
有两个文件router.go和main.go
main.go代码如下
//main.go实现初始化路由,服务注册
router.go代码如下
router.go主要用来定义程序的api接口,使用gin开发
package
注册的代码就写好了,启动userserver,我们在consul服务界面,可以看到如下效果:
说明我们注册成功了
- 服务发现
服务发现,就是从consul中获取到我们注册进去的服务,这样在调用别的服务时,就不用从配置文件获取,直接查询consul即可。
orderserver我们除了实现服务注册外,也实现服务发现的功能
orderserver代码结构如下:
上代码
main.go代码如下
package
GetServiceAddr就是服务发现的代码
首先,使用servers,err :=consulReg.GetService(serviceName)获取注册的服务
返回的servers是个slice
然后,使用next := selector.RoundRobin(services)获取其中一个服务的信息
这里注意:
在老版本中可以直接使用selector.RoundRobin(services),但是在v2版本中需要做个转换处理:
var
因为使用的数据结构不同,感兴趣的可以细看下区别。
router.go代码如下
package
启动orderserver 我们就能获取到userserver的地址,各位可以调试看下效果。
今天go-micro+gin+consul微服务实战就介绍完了,是不是很简单