go-micro+gin+etcd微服务实战之服务注册与发现

在构建微服务时,使用服务发现可以减少配置的复杂性,本文以go-micro为微服务框架,使用etcd作为服务发现服务,使用gin开发golang服务。

使用gin 的原因是gin能够很好的和go-micro进行集成。

本文主要介绍服务注册和发现的实现

关于如何搭建etcd服务可以看历史文章

本文默认以搭建好了etcd服务,服务的地址是:192.168.109.131:12379
如果你搭建好了自己的etcd服务,可以按照上面文章的步骤做,会看到如下界面:


图片.png

这里我的etcd服务启用了 3个节点。

开撸

服务注册

我们预设两个server,userserver和orderserver
下面开始上代码:
userserver程序结果如下:

图片.png

有两个文件router.go和main.go
main.go代码如下
main.go实现初始化路由,服务注册

package main

import (
    "github.com/micro/go-micro/registry"//
    "github.com/micro/go-micro/web"//
    "github.com/micro/go-micro/registry/etcd"//
    "userserver/routers"
)

var etcdReg registry.Registry

func  init()  {
    //新建一个consul注册的地址,也就是我们consul服务启动的机器ip+端口
    etcdReg = etcd.NewRegistry(
        registry.Addrs("192.168.109.131:12379"),
    )
}

func main() {
    //初始化路由
    ginRouter := routers.InitRouters()

    //注册服务
    microService:= web.NewService(
        web.Name("api.tutor.com.userserver"),
        //web.RegisterTTL(time.Second*30),//设置注册服务的过期时间
        //web.RegisterInterval(time.Second*20),//设置间隔多久再次注册服务
        web.Address(":18001"),
        web.Handler(ginRouter),
        web.Registry(etcdReg ),
        )

    microService.Run()
}

router.go代码如下
router.go主要用来定义程序的api接口,使用gin开发

package routers

import "github.com/gin-gonic/gin"

func InitRouters() *gin.Engine {
    ginRouter := gin.Default()
    ginRouter.POST("/users/", func(context *gin.Context) {
        context.String(200, "get userinfos")
    })

    return ginRouter
}

注册的代码就写好了,启动userserver,我们在micro的服务界面,可以看到如下效果:


图片.png

说明我们注册成功了

服务发现

服务发现,就是从etcd中获取到我们注册进去的服务,这样在调用别的服务时,就不用从配置文件获取,直接查询etcd即可。

orderserver我们除了实现服务注册外,也实现服务发现的功能
orderserver代码结构如下:


图片.png

上代码
main.go代码如下

package main

import (
    "bytes"
    "fmt"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/web"
    "github.com/micro/go-micro/registry/etcd"
    "net/http"
    "orderserver/routers"
    "time"
)

var etcdReg registry.Registry

func init(){
    //新建一个consul注册的地址,也就是我们consul服务启动的机器ip+端口
    etcdReg = etcd.NewRegistry(
        registry.Addrs("192.168.109.131:12379"),
    )
}

func main() {
    //初始化路由
    ginRouter := routers.InitRouters()

    //注册服务
    microService:= web.NewService(
        web.Name("api.tutor.com.orderserver"),
        //web.RegisterTTL(time.Second*30),//设置注册服务的过期时间
        //web.RegisterInterval(time.Second*20),//设置间隔多久再次注册服务
        web.Address(":18002"),
        web.Handler(ginRouter),
        web.Registry(etcdReg ),
        )

    //获取服务地址
    hostAddress := GetServiceAddr("api.tutor.com.userserver")
    if len(hostAddress) <= 0{
        fmt.Println("hostAddress is null")
    }else{
        url := "http://"+ hostAddress + "/users"
        response, _ := http.Post(url, "application/json;charset=utf-8",bytes.NewBuffer([]byte("")))

        fmt.Println(response)
    }

    microService.Run()
}

func GetServiceAddr(serviceName string)(address string){
    var retryCount int
    for{
        servers,err :=etcdReg.GetService(serviceName)
        if err !=nil {
            fmt.Println(err.Error())
        }
        var services []*registry.Service
        for _,value := range servers{
            fmt.Println(value.Name, ":", value.Version)
            services = append(services, value)
        }
        next := selector.RoundRobin(services)
        if node , err := next();err == nil{
            address = node.Address
        }
        if len(address) > 0{
            return
        }
        //重试次数++
        retryCount++
        time.Sleep(time.Second * 1)
        //重试5次为获取返回空
        if retryCount >= 5{
            return
        }
    }
}

GetServiceAddr就是服务发现的代码

首先,使用servers,err :=consulReg.GetService(serviceName)获取注册的服务
返回的servers是个slice

然后,使用next := selector.RoundRobin(services)获取其中一个服务的信息

这里注意:
在老版本中可以直接使用selector.RoundRobin(services),但是在v2版本中需要做个转换处理:
var services []*registry.Service
for _,value := range servers{
    fmt.Println(value.Name, ":", value.Version)
    services = append(services, value)
}
因为使用的数据结构不同,感兴趣的可以细看下区别。

router.go代码如下

package routers

import "github.com/gin-gonic/gin"

func InitRouters() *gin.Engine {
    ginRouter := gin.Default()
    ginRouter.POST("/orders/", func(context *gin.Context) {
        context.String(200, "get orderinfos")
    })

    return ginRouter
}

启动oerderserver 我们就能获取到userserver的地址,各位可以调试看下效果。

今天go-micro+gin+etcd微服务实战就介绍完了,是不是很简单

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 本文是基于上一篇【go-micro+gin+consul微服务实战之服务注册与发现】的,没看过的同学,请移步:ht...
    鬼厉阅读 2,971评论 1 1
  • 在我们使用go-micro框架时,会用到其api网关功能。本文以etcd作为服务注册和发现工具,实现通过api网关...
    鬼厉阅读 3,824评论 0 4
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,522评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,726评论 1 1