package discovery import ( "errors" "fmt" "sig-pub/pkg/grpc/discovery/consul" "sig-pub/pkg/zlog" "strings" "github.com/hashicorp/consul/api" "google.golang.org/grpc" "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/resolver" ) const ( ConsulSchema = "consul" ) func ConsulDialUrl(svrName string) string { url := fmt.Sprintf("%s:///%s", ConsulSchema, svrName) return url } type ConsulDiscovery struct { client *api.Client } func NewConsulDiscovery(client *api.Client) *ConsulDiscovery { return &ConsulDiscovery{ client: client, } } func (r *ConsulDiscovery) Registry(grpcServer grpc.ServiceRegistrar, register Server) (err error) { if strings.Trim(register.Name, " ") == "" { err = errors.New("registry name is empty") return } // 健康检查服务 healthSrv := NewHealthServer() grpc_health_v1.RegisterHealthServer(grpcServer, healthSrv) // 服务注册 ip, port, err := RegisterIpPort(register.Addr) if err != nil { panic(err) } reg := &api.AgentServiceRegistration{ ID: fmt.Sprintf("%s-%d", register.Name, register.NodeId), // 唯一 ID Name: register.Name, // 服务名 Port: port, Tags: []string{"v1", "grpc"}, Address: ip, // Weights: &api.AgentWeights{}, Check: &api.AgentServiceCheck{ CheckID: fmt.Sprintf("%s-%d-check", register.Name, register.NodeId), GRPC: fmt.Sprintf("%s:%d/grpc.health.v1.Health", ip, port), // gRPC 健康检查 Interval: "10s", Timeout: "3s", DeregisterCriticalServiceAfter: "30s", }, } if err = r.client.Agent().ServiceRegister(reg); err != nil { zlog.Errorf("registry service %s error: %v", register.Name, err) return } zlog.Infof("service %s registered to consul", register.Name) return } func (r *ConsulDiscovery) Resolver() (builder resolver.Builder) { builder = consul.NewConsulBuilder(r.client) return }