部署GO应用 本章节主要围绕快速部署一个GO语言的微服务应用,分享一个最佳实践 概述 微服务示例所用框架为Gomicro和Gin的开发框架,示例主要分为服务端goprovider服务提供者和客户端goconsumer服务消费者,服务端goprovider主要是通过protobuf定义服务接口,并使用gRPC作为底层传输;客户端主要是基于Gin的web框架,通过外部Http接口调用触发内部RPC调用远程服务端goprovider的服务。注册中心采用nacos作为服务发现和治理。 代码所依赖的环境变量如下: 环境变量名 是否必填 说明 NacosAddr 是 nacos注册中心(ip+port) NamespaceId 是 nacos命名空间 Username 是 nacos用户名 PwCode 是 nacos密码(未加密) APMTOKEN 否 接入APM所需TOKEN APMENDPOINT 否 接入APM节点 SERVICENAME 是 接入APM上报节点(项目code.环境code.应用实例名) 说明 如果用户要接入APM,创建应用实例时,应用实例名要和应用名一致,否则链路上报可能不成功 GoProvider 创建microService服务,定义服务名:goprovider,注册中心支持consul、nacos等,这里使用nacos注册中心,同时注册了一个user服务,通过暴露50051端口提供外部服务。 参考代码如下: plaintext nacosAddr : os.Getenv(utils.NacosAddr) namespaceId : os.Getenv(utils.NamespaceId) username : os.Getenv(utils.Username) pwCode : os.Getenv(utils.PwCode) registry : nacos.NewRegistry(nacos.WithAddress(addrs), nacos.WithClientConfig(config)) // 初始化 OpenTelemetry Tracer shutdown : apm.InitProviderHttp() defer shutdown() ip, err2 : utils.GetContainerIP() if err2 ! nil { log.Errorf("GetContainerIP err:%v", err2) } // Create service srv : micro.NewService( micro.Name(service), micro.Version(version), micro.Address(ip+":50051"), micro.Registry(registry), micro.WrapHandler(utils.MicroGoMicroServerTrace()), ) srv.Init() // Register handler err : pb.RegisterUserHandler(srv.Server(), new(handler.User)) if err ! nil { fmt.Println("RegisterUserHandler err: ", err) return }