使用Gin + go-micro + consul 实现一个简单的微服务项目,实现服务注册与发现功能
一、引入依赖:
- gin框架: go get -u github.com/gin-gonic/gin
- go-micro: go get -u -v github.com/micro/micro
go get -u -v github.com/micro/go-micro - consul:windows版本:www.consul.io/downloads.h… 下载后解压并添加系统变量
二、编写user微服务:
1. 项目目录:
2. router.go:
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
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. 项目目录:
2. router.go:
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
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界面,查看已发布的微服务:
3. 服务发现
orderserver/main.go 中调用 userServer 微服务,并打印返回信息到控制台
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END