golang使用consul完成服务注册和服务发现

golang使用consul完成服务注册和服务发现


服务注册:

package initialize

import (
   "fmt"
   "github.com/hashicorp/consul/api"
   "github.com/satori/go.uuid"
   "go.uber.org/zap"
   "os"
   "os/signal"
   "shop_srvs/order_srv/global"
   "syscall"
)

func InitConsul() {
   cfg := api.DefaultConfig()
   cfg.Address = fmt.Sprintf("%s:%d", global.ServerConfig.Consul.Host, global.ServerConfig.Consul.Port)//consul的ip 和 端口号

   client, err := api.NewClient(cfg)
   if err != nil {
      panic(err)
   }

   serviceId := fmt.Sprintf("%s", uuid.NewV4())
   err = client.Agent().ServiceRegister(&api.AgentServiceRegistration{
      ID:      serviceId,
      Name:    global.ServerConfig.Name,
      Tags:    []string{global.ServerConfig.Name},
      Port:    global.ServerConfig.Port,
      Address: global.ServerConfig.Host,
      Check: &api.AgentServiceCheck{
         Interval:                       "5s",
         Timeout:                        "15s",
         GRPC:                           fmt.Sprintf("%s:%d", global.ServerConfig.Host, global.ServerConfig.Port),
         DeregisterCriticalServiceAfter: "15s",
      },
   })
   if err != nil {
      panic(err)
   }
   zap.S().Info("consul服务注册成功")

   //以下代码是监控退出信号,手动ctrl+C 退出程序时,会自动将consul注销
   go func() {
      quit := make(chan os.Signal)
      signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
      <-quit

      if err = client.Agent().ServiceDeregister(serviceId); err != nil {
         zap.S().Infof("注销失败:%s", err.Error())
      }
      zap.S().Info("注销成功")
      os.Exit(0)
   }()
}

服务发现:

package initialize

import (
   "fmt"
   _ "github.com/mbobakov/grpc-consul-resolver" //这一步很关键,必须引入
   "go.uber.org/zap"
   "google.golang.org/grpc"
   "shop_srvs/order_srv/global"
   protoGoods "shop_srvs/order_srv/proto/goods"
   protoInv "shop_srvs/order_srv/proto/inventory"
)


func InitClient() {
   host, port := global.ServerConfig.Consul.Host, global.ServerConfig.Consul.Port
   if host == "" || port == 0 {
      panic("客户端服务获取失败")
   }

   fmt.Println( global.ServerConfig.GoodsSrv.Name)
   
   //关键在以下几行:
   conn, err := grpc.Dial(fmt.Sprintf("consul://%s:%d/%s?wait=1s", host, port, global.ServerConfig.GoodsSrv.Name),//consul的ip和端口号
      grpc.WithInsecure(),
      grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),//使用轮询负载均衡
   )
   if err != nil {
      zap.S().Error(err)
      return
   }

   global.GoodsClient = protoGoods.NewGoodsClient(conn)
   zap.S().Infof("goods客户端初始化成功,%s:%d", host, port)

   return
}

golang使用consul完成服务注册和服务发现

最后编辑于:2022/03/01作者: 牛逼PHP

发表评论