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  }