EasyDSS转码模块关于gRPC服务注册到ETCD的实现过程

在上一篇分享博客中,我们讲了EasyDSS负载均衡模块的优化由nginx方式变更为etcd方式,大家可以了解一下:如何通过ETCD实现EasyDSS分布式负载均衡?因此相应的转码模块的gRPC服务端及客户端的代码也要做一定的修改。

在etcd的代码层面,无论是客户端或是服务器端都有了一定程度的复杂,但后续的服务部署简化了相当多,仅仅需要修改配置文件,不需要像nginx那样修改nginx的配置,并重启nginx。

客户端实现

客户端的实现,相对服务器端没有过多的负载操作,仅仅需要在开启gRPC连接前。注册到负责负载均衡的etcd服务即可。

etcd:= etcd3.Config{
		Endpoints: conf2.Cfg.Etcd,
	}
	registry.RegisterResolver("etcd3", etcd, "/backend/services", "test", "1.0")
	conn, err := grpc.Dial("etcd3:///", grpc.WithInsecure(), grpc.WithBalancerName(balancer.RoundRobin))
	if err != nil {
		log.Error("grpc dial: %s", err.Error())
		return nil
	}
	cli := proto.NewTranscodeClient(conn)
	log.Info("Init transcode service success")

服务器实现

服务器端,需要保证自身的ip+port的配置唯一,即同一IP端口则必须不同,不同IP则可以是同一端口,Node配置需要唯一。之后注册服务到etcd,启动gRPC服务。

服务启动成功后可以打开etcdKeeper查看服务是否注册成功;

cfg := conf2.GetConfig().GRPC
	etcdConfig := etcd3.Config{
		Endpoints: cfg.Etcd,
	}
	service := &registry.ServiceInfo{
		InstanceId: cfg.Node,
		Name:       cfg.Name,
		Version:    cfg.Version,
		Address:    fmt.Sprintf("%s:%d", cfg.Ip, cfg.Port),
		Metadata:   metadata.Pairs(common.WeightKey, "1"),
	}

	registrar, err := etcd.NewRegistrar(&etcd.Config{
		EtcdConfig:  etcdConfig,
		RegistryDir: "/backend/services",
		Ttl:         10 * time.Second,
	})
	if err != nil {
		log.Error("grpc server registrar err, %v", err.Error())
		return
	}
	server := NewServer(fmt.Sprintf(":%d", cfg.Port))
	wg := sync.WaitGroup{}

	wg.Add(1)
	go func() {
		server.Run()
		wg.Done()
	}()

	wg.Add(1)
	go func() {
		registrar.Register(service)
		wg.Done()
	}()
原文地址:https://www.cnblogs.com/easydss/p/15044687.html