Files
common/consul/consul.go

68 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package consul
import (
"context"
"errors"
"fmt"
"net"
"github.com/gogf/gf/contrib/registry/consul/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/gsel"
"github.com/gogf/gf/v2/net/gsvc"
"github.com/gogf/gf/v2/util/grand"
)
func init() {
consulAddr := g.Cfg().MustGet(context.Background(), "consul.address").String()
registry, err := consul.New(consul.WithAddress(consulAddr))
if err != nil {
panic(err)
}
gsvc.SetRegistry(registry)
gsel.SetBuilder(gsel.NewBuilderRoundRobin())
}
func getLocalIP() (string, error) {
// 获取本机所有网络接口
addrs, err := net.InterfaceAddrs()
if err != nil {
return "", err
}
for _, addr := range addrs {
// 检查是否是IP地址
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
// 返回第一个非回环的IPv4地址
return ipNet.IP.String(), nil
}
}
}
return "", fmt.Errorf("无法找到本地IP地址")
}
func GetInstanceAddr(ctx context.Context, name string) (addr string, err error) {
watch, err := gsvc.GetRegistry().Watch(ctx, name)
service, err := watch.Proceed()
if err != nil || service == nil {
err = errors.New("获取customerService服务实例失败")
return
}
maxService := grand.N(0, len(service)-1)
maxEndpoints := grand.N(0, len(service[maxService].GetEndpoints())-1)
//优先使用gateway同IP的服务实例
addr, err = getLocalIP()
if err != nil {
return
}
for _, point := range service[maxService].GetEndpoints() {
if point.Host() == addr {
addr = point.String()
return
}
}
addr = service[maxService].GetEndpoints()[maxEndpoints].String()
return
}