Codebase list golang-github-go-kit-kit / 72a93ad sd / eureka / registrar.go
72a93ad

Tree @72a93ad (Download .tar.gz)

registrar.go @72a93adraw · history · blame

package eureka

import (
	"fmt"
	"time"

	fargo "github.com/hudl/fargo"

	"github.com/go-kit/kit/log"
)

// Registrar maintains service instance liveness information in Eureka.
type Registrar struct {
	client   Client
	instance *fargo.Instance
	logger   log.Logger
	quit     chan bool
}

// NewRegistrar returns an Eureka Registrar acting on behalf of the provided
// Fargo instance.
func NewRegistrar(client Client, i *fargo.Instance, logger log.Logger) *Registrar {
	return &Registrar{
		client:   client,
		instance: i,
		logger:   log.With(logger, "service", i.App, "address", fmt.Sprintf("%s:%d", i.IPAddr, i.Port)),
	}
}

// Register implements sd.Registrar interface.
func (r *Registrar) Register() {
	if err := r.client.Register(r.instance); err != nil {
		r.logger.Log("err", err)
	} else {
		r.logger.Log("action", "register")
	}

	if r.instance.LeaseInfo.RenewalIntervalInSecs > 0 {
		// User has opted for heartbeat functionality in Eureka.
		if r.quit == nil {
			r.quit = make(chan bool)
			go r.loop()
		}
	}
}

// Deregister implements sd.Registrar interface.
func (r *Registrar) Deregister() {
	if err := r.client.Deregister(r.instance); err != nil {
		r.logger.Log("err", err)
	} else {
		r.logger.Log("action", "deregister")
	}

	if r.quit != nil {
		r.quit <- true
		r.quit = nil
	}
}

func (r *Registrar) loop() {
	tick := time.NewTicker(time.Duration(r.instance.LeaseInfo.RenewalIntervalInSecs) * time.Second)
	defer tick.Stop()
	for {
		select {
		case <-tick.C:
			if err := r.client.Heartbeat(r.instance); err != nil {
				r.logger.Log("err", err)
			}
		case <-r.quit:
			return
		}
	}
}