使用gin和go-micro实现微服务注册与发现

使用Gin + go-micro + consul 实现一个简单的微服务项目,实现服务注册与发现功能

一、引入依赖:

  1. gin框架: go get -u github.com/gin-gonic/gin
  2. go-micro: go get -u -v github.com/micro/micro

go get -u -v github.com/micro/go-micro
3. consul:windows版本:www.consul.io/downloads.h… 下载后解压并添加系统变量

二、编写user微服务:

1. 项目目录:

捕获.PNG

2. router.go:

1
2
3
4
5
6
7
8
9
10
11
package复制代码
import "github.com/gin-gonic/gin"

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

return ginRouter
}

3. main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package复制代码
import (
"gin_micro/userserver/routers"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/web"
"github.com/micro/go-plugins/registry/consul"
)

var consulReg registry.Registry

func init() {
consulReg = consul.NewRegistry(
registry.Addrs("127.0.0.1:8500"),
)
}

func main() {
ginRouter := routers.InitRouters()

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

microService.Run()
}

三、编写order微服务:

1. 项目目录:

image.png

2. router.go:

1
2
3
4
5
6
7
8
9
10
11
package复制代码
import "github.com/gin-gonic/gin"

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

return ginRouter
}

3. main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package复制代码
import (
"bytes"
"fmt"
"gin_micro/orderserver/routers"
"github.com/micro/go-micro/client/selector"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/web"
"github.com/micro/go-plugins/registry/consul"
"net/http"
"time"
)

var consulReg registry.Registry

func init() {
consulReg = consul.NewRegistry(
registry.Addrs("127.0.0.1:8500"))
}

func main() {

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

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

//服务发现:获取服务地址
hostAddress := GetServiceAddr("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.Printf("发现服务,response = %v\n", response)
}

microService.Run()
}

// 服务发现
func GetServiceAddr(serverName string) (address string) {
var retryTimes int
for {
servers, err := consulReg.GetService(serverName)
fmt.Println(servers)
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
}

// 重试次数++
retryTimes++
time.Sleep(1 * time.Second)
// 重试5次 返回空
if retryTimes >= 5 {
return
}
}
}

四、启动项目

1. 启动consul:
consul agent -dev -node hhh

2. 服务注册

分别启动 userserver/main.go 和 orderserver/main.go

将 userServer 和 orderServer 发布到consul上

浏览器输入 localhost:8500\ui 进入consul界面,查看已发布的微服务:

image.png

3. 服务发现

orderserver/main.go 中调用 userServer 微服务,并打印返回信息到控制台

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%