github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/registry/server/server.go (about) 1 package server 2 3 import ( 4 "context" 5 "time" 6 7 pb "github.com/tickoalcantara12/micro/v3/proto/registry" 8 "github.com/tickoalcantara12/micro/v3/service" 9 log "github.com/tickoalcantara12/micro/v3/service/logger" 10 "github.com/tickoalcantara12/micro/v3/service/registry" 11 "github.com/tickoalcantara12/micro/v3/service/registry/handler" 12 "github.com/tickoalcantara12/micro/v3/service/registry/util" 13 "github.com/urfave/cli/v2" 14 ) 15 16 var ( 17 // name of the registry 18 name = "registry" 19 // address of the registry 20 address = ":8000" 21 // topic to publish registry events to 22 topic = "registry.events" 23 ) 24 25 // Sub processes registry events 26 type subscriber struct { 27 // id is registry id 28 Id string 29 // registry is service registry 30 Registry registry.Registry 31 } 32 33 // Process processes registry events 34 func (s *subscriber) Process(ctx context.Context, event *pb.Event) error { 35 if event.Id == s.Id { 36 log.Tracef("skipping own %s event: %s for: %s", registry.EventType(event.Type), event.Id, event.Service.Name) 37 return nil 38 } 39 40 log.Debugf("received %s event from: %s for: %s", registry.EventType(event.Type), event.Id, event.Service.Name) 41 42 // no service 43 if event.Service == nil { 44 return nil 45 } 46 47 // decode protobuf to registry.Service 48 svc := util.ToService(event.Service) 49 50 // default ttl to 1 minute 51 ttl := time.Minute 52 53 // set ttl if it exists 54 if opts := event.Service.Options; opts != nil { 55 if opts.Ttl > 0 { 56 ttl = time.Duration(opts.Ttl) * time.Second 57 } 58 } 59 60 switch registry.EventType(event.Type) { 61 case registry.Create, registry.Update: 62 log.Debugf("registering service: %s", svc.Name) 63 if err := s.Registry.Register(svc, registry.RegisterTTL(ttl)); err != nil { 64 log.Debugf("failed to register service: %s", svc.Name) 65 return err 66 } 67 case registry.Delete: 68 log.Debugf("deregistering service: %s", svc.Name) 69 if err := s.Registry.Deregister(svc); err != nil { 70 log.Debugf("failed to deregister service: %s", svc.Name) 71 return err 72 } 73 } 74 75 return nil 76 } 77 78 func Run(ctx *cli.Context) error { 79 if len(ctx.String("server_name")) > 0 { 80 name = ctx.String("server_name") 81 } 82 if len(ctx.String("address")) > 0 { 83 address = ctx.String("address") 84 } 85 86 // service opts 87 srvOpts := []service.Option{service.Name(name)} 88 if i := time.Duration(ctx.Int("register_ttl")); i > 0 { 89 srvOpts = append(srvOpts, service.RegisterTTL(i*time.Second)) 90 } 91 if i := time.Duration(ctx.Int("register_interval")); i > 0 { 92 srvOpts = append(srvOpts, service.RegisterInterval(i*time.Second)) 93 } 94 95 // set address 96 if len(address) > 0 { 97 srvOpts = append(srvOpts, service.Address(address)) 98 } 99 100 // new service 101 srv := service.New(srvOpts...) 102 // get server id 103 id := srv.Server().Options().Id 104 105 // register the handler 106 pb.RegisterRegistryHandler(srv.Server(), &handler.Registry{ 107 ID: id, 108 Event: service.NewEvent(topic), 109 }) 110 111 // run the service 112 if err := srv.Run(); err != nil { 113 log.Fatal(err) 114 } 115 return nil 116 }