1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-08-10 21:52:01 +02:00
This commit is contained in:
Asim
2015-01-13 23:31:27 +00:00
commit 8e55cde513
43 changed files with 1639 additions and 0 deletions

20
registry/consul_node.go Normal file
View File

@@ -0,0 +1,20 @@
package registry
type ConsulNode struct {
Node string
NodeId string
NodeAddress string
NodePort int
}
func (c *ConsulNode) Id() string {
return c.NodeId
}
func (c *ConsulNode) Address() string {
return c.NodeAddress
}
func (c *ConsulNode) Port() int {
return c.NodePort
}

108
registry/consul_registry.go Normal file
View File

@@ -0,0 +1,108 @@
package registry
import (
"errors"
consul "github.com/armon/consul-api"
)
type ConsulRegistry struct {
Client *consul.Client
}
var (
ConsulCheckTTL = "30s"
)
func (c *ConsulRegistry) Deregister(s Service) error {
if len(s.Nodes()) == 0 {
return errors.New("Require at least one node")
}
node := s.Nodes()[0]
_, err := c.Client.Catalog().Deregister(&consul.CatalogDeregistration{
Node: node.Id(),
Address: node.Address(),
ServiceID: node.Id(),
}, nil)
return err
}
func (c *ConsulRegistry) Register(s Service) error {
if len(s.Nodes()) == 0 {
return errors.New("Require at least one node")
}
node := s.Nodes()[0]
_, err := c.Client.Catalog().Register(&consul.CatalogRegistration{
Node: node.Id(),
Address: node.Address(),
Service: &consul.AgentService{
ID: node.Id(),
Service: s.Name(),
Port: node.Port(),
},
}, nil)
return err
}
func (c *ConsulRegistry) GetService(name string) (Service, error) {
rsp, _, err := c.Client.Catalog().Service(name, "", nil)
if err != nil {
return nil, err
}
cs := &ConsulService{}
for _, s := range rsp {
if s.ServiceName != name {
continue
}
cs.ServiceName = s.ServiceName
cs.ServiceNodes = append(cs.ServiceNodes, &ConsulNode{
Node: s.Node,
NodeId: s.ServiceID,
NodeAddress: s.Address,
NodePort: s.ServicePort,
})
}
return cs, nil
}
func (c *ConsulRegistry) NewService(name string, nodes ...Node) Service {
var snodes []*ConsulNode
for _, node := range nodes {
if n, ok := node.(*ConsulNode); ok {
snodes = append(snodes, n)
}
}
return &ConsulService{
ServiceName: name,
ServiceNodes: snodes,
}
}
func (c *ConsulRegistry) NewNode(id, address string, port int) Node {
return &ConsulNode{
Node: id,
NodeId: id,
NodeAddress: address,
NodePort: port,
}
}
func NewConsulRegistry() Registry {
client, _ := consul.NewClient(&consul.Config{})
return &ConsulRegistry{
Client: client,
}
}

View File

@@ -0,0 +1,20 @@
package registry
type ConsulService struct {
ServiceName string
ServiceNodes []*ConsulNode
}
func (c *ConsulService) Name() string {
return c.ServiceName
}
func (c *ConsulService) Nodes() []Node {
var nodes []Node
for _, node := range c.ServiceNodes {
nodes = append(nodes, node)
}
return nodes
}

View File

@@ -0,0 +1,19 @@
package registry
type KubernetesNode struct {
NodeId string
NodeAddress string
NodePort int
}
func (c *KubernetesNode) Id() string {
return c.NodeId
}
func (c *KubernetesNode) Address() string {
return c.NodeAddress
}
func (c *KubernetesNode) Port() int {
return c.NodePort
}

View File

@@ -0,0 +1,77 @@
package registry
import (
"fmt"
"os"
k8s "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
)
type KubernetesRegistry struct {
Client *k8s.Client
Namespace string
}
func (c *KubernetesRegistry) Deregister(s Service) error {
return nil
}
func (c *KubernetesRegistry) Register(s Service) error {
return nil
}
func (c *KubernetesRegistry) GetService(name string) (Service, error) {
services, err := c.Client.Services(c.Namespace).List(labels.OneTermEqualSelector("name", name))
if err != nil {
return nil, err
}
if len(services.Items) == 0 {
return nil, fmt.Errorf("Service not found")
}
ks := &KubernetesService{ServiceName: name}
for _, item := range services.Items {
ks.ServiceNodes = append(ks.ServiceNodes, &KubernetesNode{
NodeAddress: item.Spec.PortalIP,
NodePort: item.Spec.Port,
})
}
return ks, nil
}
func (c *KubernetesRegistry) NewService(name string, nodes ...Node) Service {
var snodes []*KubernetesNode
for _, node := range nodes {
if n, ok := node.(*KubernetesNode); ok {
snodes = append(snodes, n)
}
}
return &KubernetesService{
ServiceName: name,
ServiceNodes: snodes,
}
}
func (c *KubernetesRegistry) NewNode(id, address string, port int) Node {
return &KubernetesNode{
NodeId: id,
NodeAddress: address,
NodePort: port,
}
}
func NewKubernetesRegistry() Registry {
client, _ := k8s.New(&k8s.Config{
Host: "http://" + os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT"),
})
return &KubernetesRegistry{
Client: client,
Namespace: "default",
}
}

View File

@@ -0,0 +1,20 @@
package registry
type KubernetesService struct {
ServiceName string
ServiceNodes []*KubernetesNode
}
func (c *KubernetesService) Name() string {
return c.ServiceName
}
func (c *KubernetesService) Nodes() []Node {
var nodes []Node
for _, node := range c.ServiceNodes {
nodes = append(nodes, node)
}
return nodes
}

11
registry/node.go Normal file
View File

@@ -0,0 +1,11 @@
package registry
type Node interface {
Id() string
Address() string
Port() int
}
func NewNode(id, address string, port int) Node {
return DefaultRegistry.NewNode(id, address, port)
}

25
registry/registry.go Normal file
View File

@@ -0,0 +1,25 @@
package registry
type Registry interface {
Register(Service) error
Deregister(Service) error
GetService(string) (Service, error)
NewService(string, ...Node) Service
NewNode(string, string, int) Node
}
var (
DefaultRegistry = NewConsulRegistry()
)
func Register(s Service) error {
return DefaultRegistry.Register(s)
}
func Deregister(s Service) error {
return DefaultRegistry.Deregister(s)
}
func GetService(name string) (Service, error) {
return DefaultRegistry.GetService(name)
}

10
registry/service.go Normal file
View File

@@ -0,0 +1,10 @@
package registry
type Service interface {
Name() string
Nodes() []Node
}
func NewService(name string, nodes ...Node) Service {
return DefaultRegistry.NewService(name, nodes...)
}