golang 同时(一个项目)注册http和GRPC服务
main 里面
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/hashicorp/consul/api" grpc "gorm_project/grpc/services" "gorm_project/route" "gorm_project/utils" "log" "net/http" ) func main() { // **************协程开始Grpc服务 ************************** go grpc.RunGrpc() utils.InitRedisClient() r := gin.Default() // ****** consul健康检查服务 ******* r.GET("/health", func(c *gin.Context) { c.String(http.StatusOK, "OK") }) //r.Use(middleware.ValiTokenMiddleware()) route.AddGoodsRoute(r) route.AddOrderInfo(r) // *************注册服务到consul ********************** client, regId, err := ConsulRegister() if err != nil { return } else { // 注销 consul 服务 defer client.Agent().ServiceDeregister(regId) } r.Run(":8595") } // ***************注册服务到consul 方法*********************** func ConsulRegister() (*api.Client, string, error) { // 创建Consul客户端 config := api.DefaultConfig() config.Address = "39.101.194.250:8500" // Consul服务器地址 client, err := api.NewClient(config) if err != nil { log.Fatal(err) } // 注册服务到consul reg := new(api.AgentServiceRegistration) reg.ID = "httpgrpc-http-service-id" reg.Name = "httpgrpc-http" reg.Tags = []string{"httpgrpc-http"} reg.Port = 8595 reg.Address = "127.0.0.1" reg.Check = &api.AgentServiceCheck{ HTTP: fmt.Sprintf("http://localhost:%d/health", reg.Port), Timeout: "5s", Interval: "10s", DeregisterCriticalServiceAfter: "30s", } err = client.Agent().ServiceRegister(reg) return client, reg.ID, err }
协程里的GRPC 注册到consul
package grpc import ( "context" "fmt" "github.com/hashicorp/consul/api" pb "gorm_project/grpc/services/proto" "log" "net" "google.golang.org/grpc" ) type Server struct { pb.UnimplementedGreeterServer } func (s *Server) SayHello(cxt context.Context, r *pb.HelloRequest) (h *pb.HelloReply, e error) { return &pb.HelloReply{Message: "好样的"}, nil } func RunGrpc() { fmt.Println("开始监听了~~~~~") // 1.开始监听 listen, err := net.Listen("tcp", ":9868") if err != nil { fmt.Println("listen err:", err) return } defer listen.Close() // 2.创建GRPC 服务 server := grpc.NewServer() // 3.将服务和实例注册 ******** 注意 pb 取于.proto 里的 option go_package = "./;pb"; ******** pb.RegisterGreeterServer(server, &Server{}) // *************注册服务到consul ********************** client, regId, err := ConsulRegister() if err != nil { return } else { // 注销 consul 服务 defer client.Agent().ServiceDeregister(regId) } // 4.服务开始监听 errs := server.Serve(listen) if errs != nil { fmt.Println("服务出错 err:", err) return } //time.Sleep(time.Second * 10) } // ***************注册服务到consul 方法*********************** func ConsulRegister() (*api.Client, string, error) { // 创建Consul客户端 config := api.DefaultConfig() config.Address = "39.101.194.250:8500" // Consul服务器地址 client, err := api.NewClient(config) if err != nil { log.Fatal(err) } // 注册服务 reg := new(api.AgentServiceRegistration) reg.ID = "httpgrpc-grpc-service-id" reg.Name = "httpgrpc-grpc" reg.Tags = []string{"httpgrpc-grpc"} reg.Port = 8595 reg.Address = "127.0.0.1" reg.Check = &api.AgentServiceCheck{ HTTP: fmt.Sprintf("http://localhost:%d/health", reg.Port), Timeout: "5s", Interval: "10s", DeregisterCriticalServiceAfter: "30s", } err = client.Agent().ServiceRegister(reg) return client, reg.ID, err }
效果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!