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 }
发表评论