项目作者: adityak368

项目描述 :
Grpc MDNS Resolver. Useful when developing microservices using grpc locally for service discovery.
高级语言: Go
项目地址: git://github.com/adityak368/mdnsresolver.git
创建时间: 2020-11-01T23:33:16Z
项目社区:https://github.com/adityak368/mdnsresolver

开源协议:MIT License

下载


mdnsresolver

Grpc MDNS Resolver

  • A Grpc name resolver by using zeroconf mdns.
  • Useful when developing microservices locally for service discovery.
  • It comes with a small ~250 LOC mdns client to find service endpoints. Therefore it won’t bloat your binaries.

GoDoc Go Report Card

USAGE

  1. // Import the module
  2. import (
  3. "github.com/adityak368/mdnsresolver"
  4. "google.golang.org/grpc"
  5. )
  6. // if schema is 'mdns' then grpc will use mdnsresolver to resolve addresses
  7. cc, err := grpc.Dial("mdns://service/serviceInstanceName.domain", grpc.WithResolvers(mdnsresolver.NewBuilder()))
  8. // Ex: mdns://MyApp/MyAwesomeMicroService.local

More information on naming can be found in grpc naming docs

Client Side Load Balancing

You need to pass grpc.WithBalancerName option to grpc on dial:

  1. grpc.DialContext(ctx, "mdns://service/serviceInstanceName.domain", grpc.WithResolvers(mdnsresolver.NewBuilder()), grpc.WithBalancerName("round_robin"), grpc.WithInsecure())

This will create subconnections for each available service endpoints.

MDNS Service setup

To setup a service for the client to discover via mdns, have a look at the examples in

https://github.com/grandcat/zeroconf

https://github.com/hashicorp/mdns

or if you are using Ego Framework, you can just setup a registry using:

  1. import (
  2. "github.com/adityak368/ego/registry"
  3. "github.com/adityak368/ego/registry/mdns"
  4. )
  5. service := "MyApp"
  6. serviceName := "MyAwesomeMicroService"
  7. domain := "local"
  8. reg := mdns.New(service, domain)
  9. reg.Init(registry.Options{})
  10. reg.Register(registry.Entry{
  11. Name: serviceName,
  12. Address: "localhost:1212",
  13. Version: "1.0.0",
  14. })
  15. err := reg.Watch()
  16. if err != nil {
  17. return err
  18. }
  19. defer reg.Deregister(serviceName)
  20. defer reg.CancelWatch()

Using Ego Server:

  1. import (
  2. "github.com/adityak368/ego/registry"
  3. "github.com/adityak368/ego/registry/mdns"
  4. "github.com/adityak368/ego/server"
  5. grpcServer "github.com/adityak368/ego/server/grpc"
  6. "google.golang.org/grpc"
  7. )
  8. service := "MyApp"
  9. serviceName := "MyAwesomeMicroService"
  10. domain := "local"
  11. reg := mdns.New(service, domain)
  12. reg.Init(registry.Options{})
  13. srv := grpcServer.New()
  14. err := srv.Init(server.Options{
  15. Name: serviceName,
  16. Host: "localhost",
  17. Registry: reg,
  18. Version: "1.0.0",
  19. })
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. grpcHandle, ok := srv.Handle().(*grpc.Server)
  24. if !ok {
  25. log.Fatal("Invalid Grpc Server Handle")
  26. }
  27. // Register any protobuf services here
  28. if err := srv.Run(); err != nil {
  29. log.Fatal(err)
  30. }