mirror of
https://github.com/go-micro/go-micro.git
synced 2025-08-10 21:52:01 +02:00
Restructure go-micro layout and plugins
This commit is contained in:
11
registry/consul/consul.go
Normal file
11
registry/consul/consul.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package consul
|
||||
|
||||
// This is a hack
|
||||
|
||||
import (
|
||||
"github.com/myodc/go-micro/registry"
|
||||
)
|
||||
|
||||
func NewRegistry(addrs []string, opt ...registry.Option) registry.Registry {
|
||||
return registry.NewRegistry(addrs, opt...)
|
||||
}
|
@@ -1,20 +1,20 @@
|
||||
package registry
|
||||
|
||||
type ConsulNode struct {
|
||||
type consulNode struct {
|
||||
Node string
|
||||
NodeId string
|
||||
NodeAddress string
|
||||
NodePort int
|
||||
}
|
||||
|
||||
func (c *ConsulNode) Id() string {
|
||||
func (c *consulNode) Id() string {
|
||||
return c.NodeId
|
||||
}
|
||||
|
||||
func (c *ConsulNode) Address() string {
|
||||
func (c *consulNode) Address() string {
|
||||
return c.NodeAddress
|
||||
}
|
||||
|
||||
func (c *ConsulNode) Port() int {
|
||||
func (c *consulNode) Port() int {
|
||||
return c.NodePort
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@ import (
|
||||
consul "github.com/hashicorp/consul/api"
|
||||
)
|
||||
|
||||
type ConsulRegistry struct {
|
||||
type consulRegistry struct {
|
||||
Address string
|
||||
Client *consul.Client
|
||||
|
||||
@@ -15,7 +15,24 @@ type ConsulRegistry struct {
|
||||
services map[string]Service
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) Deregister(s Service) error {
|
||||
func newConsulRegistry(addrs []string, opts ...Option) Registry {
|
||||
config := consul.DefaultConfig()
|
||||
client, _ := consul.NewClient(config)
|
||||
if len(addrs) > 0 {
|
||||
config.Address = addrs[0]
|
||||
}
|
||||
|
||||
cr := &consulRegistry{
|
||||
Address: config.Address,
|
||||
Client: client,
|
||||
services: make(map[string]Service),
|
||||
}
|
||||
|
||||
cr.Watch()
|
||||
return cr
|
||||
}
|
||||
|
||||
func (c *consulRegistry) Deregister(s Service) error {
|
||||
if len(s.Nodes()) == 0 {
|
||||
return errors.New("Require at least one node")
|
||||
}
|
||||
@@ -31,7 +48,7 @@ func (c *ConsulRegistry) Deregister(s Service) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) Register(s Service) error {
|
||||
func (c *consulRegistry) Register(s Service) error {
|
||||
if len(s.Nodes()) == 0 {
|
||||
return errors.New("Require at least one node")
|
||||
}
|
||||
@@ -51,7 +68,7 @@ func (c *ConsulRegistry) Register(s Service) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) GetService(name string) (Service, error) {
|
||||
func (c *consulRegistry) GetService(name string) (Service, error) {
|
||||
c.mtx.RLock()
|
||||
service, ok := c.services[name]
|
||||
c.mtx.RUnlock()
|
||||
@@ -65,7 +82,7 @@ func (c *ConsulRegistry) GetService(name string) (Service, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cs := &ConsulService{}
|
||||
cs := &consulService{}
|
||||
|
||||
for _, s := range rsp {
|
||||
if s.ServiceName != name {
|
||||
@@ -73,7 +90,7 @@ func (c *ConsulRegistry) GetService(name string) (Service, error) {
|
||||
}
|
||||
|
||||
cs.ServiceName = s.ServiceName
|
||||
cs.ServiceNodes = append(cs.ServiceNodes, &ConsulNode{
|
||||
cs.ServiceNodes = append(cs.ServiceNodes, &consulNode{
|
||||
Node: s.Node,
|
||||
NodeId: s.ServiceID,
|
||||
NodeAddress: s.Address,
|
||||
@@ -84,7 +101,7 @@ func (c *ConsulRegistry) GetService(name string) (Service, error) {
|
||||
return cs, nil
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) ListServices() ([]Service, error) {
|
||||
func (c *consulRegistry) ListServices() ([]Service, error) {
|
||||
c.mtx.RLock()
|
||||
serviceMap := c.services
|
||||
c.mtx.RUnlock()
|
||||
@@ -104,29 +121,29 @@ func (c *ConsulRegistry) ListServices() ([]Service, error) {
|
||||
}
|
||||
|
||||
for service, _ := range rsp {
|
||||
services = append(services, &ConsulService{ServiceName: service})
|
||||
services = append(services, &consulService{ServiceName: service})
|
||||
}
|
||||
|
||||
return services, nil
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) NewService(name string, nodes ...Node) Service {
|
||||
var snodes []*ConsulNode
|
||||
func (c *consulRegistry) NewService(name string, nodes ...Node) Service {
|
||||
var snodes []*consulNode
|
||||
|
||||
for _, node := range nodes {
|
||||
if n, ok := node.(*ConsulNode); ok {
|
||||
if n, ok := node.(*consulNode); ok {
|
||||
snodes = append(snodes, n)
|
||||
}
|
||||
}
|
||||
|
||||
return &ConsulService{
|
||||
return &consulService{
|
||||
ServiceName: name,
|
||||
ServiceNodes: snodes,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) NewNode(id, address string, port int) Node {
|
||||
return &ConsulNode{
|
||||
func (c *consulRegistry) NewNode(id, address string, port int) Node {
|
||||
return &consulNode{
|
||||
Node: id,
|
||||
NodeId: id,
|
||||
NodeAddress: address,
|
||||
@@ -134,23 +151,6 @@ func (c *ConsulRegistry) NewNode(id, address string, port int) Node {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ConsulRegistry) Watch() {
|
||||
NewConsulWatcher(c)
|
||||
}
|
||||
|
||||
func NewConsulRegistry(addrs []string, opts ...Options) Registry {
|
||||
config := consul.DefaultConfig()
|
||||
client, _ := consul.NewClient(config)
|
||||
if len(addrs) > 0 {
|
||||
config.Address = addrs[0]
|
||||
}
|
||||
|
||||
cr := &ConsulRegistry{
|
||||
Address: config.Address,
|
||||
Client: client,
|
||||
services: make(map[string]Service),
|
||||
}
|
||||
|
||||
cr.Watch()
|
||||
return cr
|
||||
func (c *consulRegistry) Watch() {
|
||||
newConsulWatcher(c)
|
||||
}
|
||||
|
@@ -1,15 +1,15 @@
|
||||
package registry
|
||||
|
||||
type ConsulService struct {
|
||||
type consulService struct {
|
||||
ServiceName string
|
||||
ServiceNodes []*ConsulNode
|
||||
ServiceNodes []*consulNode
|
||||
}
|
||||
|
||||
func (c *ConsulService) Name() string {
|
||||
func (c *consulService) Name() string {
|
||||
return c.ServiceName
|
||||
}
|
||||
|
||||
func (c *ConsulService) Nodes() []Node {
|
||||
func (c *consulService) Nodes() []Node {
|
||||
var nodes []Node
|
||||
|
||||
for _, node := range c.ServiceNodes {
|
||||
|
@@ -5,8 +5,8 @@ import (
|
||||
"github.com/hashicorp/consul/watch"
|
||||
)
|
||||
|
||||
type ConsulWatcher struct {
|
||||
Registry *ConsulRegistry
|
||||
type consulWatcher struct {
|
||||
Registry *consulRegistry
|
||||
wp *watch.WatchPlan
|
||||
watchers map[string]*watch.WatchPlan
|
||||
}
|
||||
@@ -15,17 +15,33 @@ type serviceWatcher struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (cw *ConsulWatcher) serviceHandler(idx uint64, data interface{}) {
|
||||
func newConsulWatcher(cr *consulRegistry) *consulWatcher {
|
||||
cw := &consulWatcher{
|
||||
Registry: cr,
|
||||
watchers: make(map[string]*watch.WatchPlan),
|
||||
}
|
||||
|
||||
wp, err := watch.Parse(map[string]interface{}{"type": "services"})
|
||||
if err == nil {
|
||||
wp.Handler = cw.Handle
|
||||
go wp.Run(cr.Address)
|
||||
cw.wp = wp
|
||||
}
|
||||
|
||||
return cw
|
||||
}
|
||||
|
||||
func (cw *consulWatcher) serviceHandler(idx uint64, data interface{}) {
|
||||
entries, ok := data.([]*api.ServiceEntry)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
cs := &ConsulService{}
|
||||
cs := &consulService{}
|
||||
|
||||
for _, e := range entries {
|
||||
cs.ServiceName = e.Service.Service
|
||||
cs.ServiceNodes = append(cs.ServiceNodes, &ConsulNode{
|
||||
cs.ServiceNodes = append(cs.ServiceNodes, &consulNode{
|
||||
Node: e.Node.Node,
|
||||
NodeId: e.Service.ID,
|
||||
NodeAddress: e.Node.Address,
|
||||
@@ -38,7 +54,7 @@ func (cw *ConsulWatcher) serviceHandler(idx uint64, data interface{}) {
|
||||
cw.Registry.mtx.Unlock()
|
||||
}
|
||||
|
||||
func (cw *ConsulWatcher) Handle(idx uint64, data interface{}) {
|
||||
func (cw *consulWatcher) Handle(idx uint64, data interface{}) {
|
||||
services, ok := data.(map[string][]string)
|
||||
if !ok {
|
||||
return
|
||||
@@ -82,25 +98,9 @@ func (cw *ConsulWatcher) Handle(idx uint64, data interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
func (cw *ConsulWatcher) Stop() {
|
||||
func (cw *consulWatcher) Stop() {
|
||||
if cw.wp == nil {
|
||||
return
|
||||
}
|
||||
cw.wp.Stop()
|
||||
}
|
||||
|
||||
func NewConsulWatcher(cr *ConsulRegistry) *ConsulWatcher {
|
||||
cw := &ConsulWatcher{
|
||||
Registry: cr,
|
||||
watchers: make(map[string]*watch.WatchPlan),
|
||||
}
|
||||
|
||||
wp, err := watch.Parse(map[string]interface{}{"type": "services"})
|
||||
if err == nil {
|
||||
wp.Handler = cw.Handle
|
||||
go wp.Run(cr.Address)
|
||||
cw.wp = wp
|
||||
}
|
||||
|
||||
return cw
|
||||
}
|
||||
|
139
registry/kubernetes/kubernetes.go
Normal file
139
registry/kubernetes/kubernetes.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package kubernetes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/myodc/go-micro/registry"
|
||||
|
||||
k8s "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
type kregistry struct {
|
||||
client *k8s.Client
|
||||
namespace string
|
||||
|
||||
mtx sync.RWMutex
|
||||
services map[string]registry.Service
|
||||
}
|
||||
|
||||
func (c *kregistry) Watch() {
|
||||
newWatcher(c)
|
||||
}
|
||||
|
||||
func (c *kregistry) Deregister(s registry.Service) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *kregistry) Register(s registry.Service) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *kregistry) GetService(name string) (registry.Service, error) {
|
||||
c.mtx.RLock()
|
||||
svc, ok := c.services[name]
|
||||
c.mtx.RUnlock()
|
||||
|
||||
if ok {
|
||||
return svc, nil
|
||||
}
|
||||
|
||||
selector := labels.SelectorFromSet(labels.Set{"name": name})
|
||||
|
||||
services, err := c.client.Services(c.namespace).List(selector)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(services.Items) == 0 {
|
||||
return nil, fmt.Errorf("Service not found")
|
||||
}
|
||||
|
||||
ks := &service{name: name}
|
||||
for _, item := range services.Items {
|
||||
ks.nodes = append(ks.nodes, &node{
|
||||
address: item.Spec.PortalIP,
|
||||
port: item.Spec.Ports[0].Port,
|
||||
})
|
||||
}
|
||||
|
||||
return ks, nil
|
||||
}
|
||||
|
||||
func (c *kregistry) ListServices() ([]registry.Service, error) {
|
||||
c.mtx.RLock()
|
||||
serviceMap := c.services
|
||||
c.mtx.RUnlock()
|
||||
|
||||
var services []registry.Service
|
||||
|
||||
if len(serviceMap) > 0 {
|
||||
for _, service := range serviceMap {
|
||||
services = append(services, service)
|
||||
}
|
||||
return services, nil
|
||||
}
|
||||
|
||||
rsp, err := c.client.Services(c.namespace).List(labels.Everything())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, svc := range rsp.Items {
|
||||
if len(svc.ObjectMeta.Labels["name"]) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
services = append(services, &service{
|
||||
name: svc.ObjectMeta.Labels["name"],
|
||||
})
|
||||
}
|
||||
|
||||
return services, nil
|
||||
}
|
||||
|
||||
func (c *kregistry) NewService(name string, nodes ...registry.Node) registry.Service {
|
||||
var snodes []*node
|
||||
|
||||
for _, nod := range nodes {
|
||||
if n, ok := nod.(*node); ok {
|
||||
snodes = append(snodes, n)
|
||||
}
|
||||
}
|
||||
|
||||
return &service{
|
||||
name: name,
|
||||
nodes: snodes,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *kregistry) NewNode(id, address string, port int) registry.Node {
|
||||
return &node{
|
||||
id: id,
|
||||
address: address,
|
||||
port: port,
|
||||
}
|
||||
}
|
||||
|
||||
func NewRegistry(addrs []string, opts ...registry.Option) registry.Registry {
|
||||
host := "http://" + os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT")
|
||||
if len(addrs) > 0 {
|
||||
host = addrs[0]
|
||||
}
|
||||
|
||||
client, _ := k8s.New(&k8s.Config{
|
||||
Host: host,
|
||||
})
|
||||
|
||||
kr := &kregistry{
|
||||
client: client,
|
||||
namespace: "default",
|
||||
services: make(map[string]registry.Service),
|
||||
}
|
||||
|
||||
kr.Watch()
|
||||
|
||||
return kr
|
||||
}
|
19
registry/kubernetes/node.go
Normal file
19
registry/kubernetes/node.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package kubernetes
|
||||
|
||||
type node struct {
|
||||
id string
|
||||
address string
|
||||
port int
|
||||
}
|
||||
|
||||
func (n *node) Id() string {
|
||||
return n.id
|
||||
}
|
||||
|
||||
func (n *node) Address() string {
|
||||
return n.address
|
||||
}
|
||||
|
||||
func (n *node) Port() int {
|
||||
return n.port
|
||||
}
|
24
registry/kubernetes/service.go
Normal file
24
registry/kubernetes/service.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package kubernetes
|
||||
|
||||
import (
|
||||
"github.com/myodc/go-micro/registry"
|
||||
)
|
||||
|
||||
type service struct {
|
||||
name string
|
||||
nodes []*node
|
||||
}
|
||||
|
||||
func (s *service) Name() string {
|
||||
return s.name
|
||||
}
|
||||
|
||||
func (s *service) Nodes() []registry.Node {
|
||||
var nodes []registry.Node
|
||||
|
||||
for _, node := range s.nodes {
|
||||
nodes = append(nodes, node)
|
||||
}
|
||||
|
||||
return nodes
|
||||
}
|
72
registry/kubernetes/watcher.go
Normal file
72
registry/kubernetes/watcher.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package kubernetes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/proxy/config"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||
)
|
||||
|
||||
type watcher struct {
|
||||
registry *kregistry
|
||||
}
|
||||
|
||||
func (k *watcher) OnUpdate(services []api.Service) {
|
||||
fmt.Println("got update")
|
||||
activeServices := util.StringSet{}
|
||||
for _, svc := range services {
|
||||
fmt.Printf("%#v\n", svc.ObjectMeta)
|
||||
name, exists := svc.ObjectMeta.Labels["name"]
|
||||
if !exists {
|
||||
continue
|
||||
}
|
||||
|
||||
activeServices.Insert(name)
|
||||
serviceIP := net.ParseIP(svc.Spec.PortalIP)
|
||||
|
||||
ks := &service{
|
||||
name: name,
|
||||
nodes: []*node{
|
||||
&node{
|
||||
address: serviceIP.String(),
|
||||
port: svc.Spec.Ports[0].Port,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
k.registry.mtx.Lock()
|
||||
k.registry.services[name] = ks
|
||||
k.registry.mtx.Unlock()
|
||||
}
|
||||
|
||||
k.registry.mtx.Lock()
|
||||
defer k.registry.mtx.Unlock()
|
||||
for name, _ := range k.registry.services {
|
||||
if !activeServices.Has(name) {
|
||||
delete(k.registry.services, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func newWatcher(kr *kregistry) *watcher {
|
||||
serviceConfig := config.NewServiceConfig()
|
||||
endpointsConfig := config.NewEndpointsConfig()
|
||||
|
||||
config.NewSourceAPI(
|
||||
kr.client.Services(api.NamespaceAll),
|
||||
kr.client.Endpoints(api.NamespaceAll),
|
||||
time.Second*10,
|
||||
serviceConfig.Channel("api"),
|
||||
endpointsConfig.Channel("api"),
|
||||
)
|
||||
|
||||
ks := &watcher{
|
||||
registry: kr,
|
||||
}
|
||||
|
||||
serviceConfig.RegisterHandler(ks)
|
||||
return ks
|
||||
}
|
@@ -1,19 +0,0 @@
|
||||
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
|
||||
}
|
@@ -1,137 +0,0 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
k8s "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
type KubernetesRegistry struct {
|
||||
Client *k8s.Client
|
||||
Namespace string
|
||||
|
||||
mtx sync.RWMutex
|
||||
services map[string]Service
|
||||
}
|
||||
|
||||
func (c *KubernetesRegistry) Watch() {
|
||||
NewKubernetesWatcher(c)
|
||||
}
|
||||
|
||||
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) {
|
||||
c.mtx.RLock()
|
||||
service, ok := c.services[name]
|
||||
c.mtx.RUnlock()
|
||||
|
||||
if ok {
|
||||
return service, nil
|
||||
}
|
||||
|
||||
selector := labels.SelectorFromSet(labels.Set{"name": name})
|
||||
|
||||
services, err := c.Client.Services(c.Namespace).List(selector)
|
||||
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.Ports[0].Port,
|
||||
})
|
||||
}
|
||||
|
||||
return ks, nil
|
||||
}
|
||||
|
||||
func (c *KubernetesRegistry) ListServices() ([]Service, error) {
|
||||
c.mtx.RLock()
|
||||
serviceMap := c.services
|
||||
c.mtx.RUnlock()
|
||||
|
||||
var services []Service
|
||||
|
||||
if len(serviceMap) > 0 {
|
||||
for _, service := range serviceMap {
|
||||
services = append(services, service)
|
||||
}
|
||||
return services, nil
|
||||
}
|
||||
|
||||
rsp, err := c.Client.Services(c.Namespace).List(labels.Everything())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, service := range rsp.Items {
|
||||
if len(service.ObjectMeta.Labels["name"]) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
services = append(services, &KubernetesService{
|
||||
ServiceName: service.ObjectMeta.Labels["name"],
|
||||
})
|
||||
}
|
||||
|
||||
return services, 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(addrs []string, opts ...Options) Registry {
|
||||
host := "http://" + os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT")
|
||||
if len(addrs) > 0 {
|
||||
host = addrs[0]
|
||||
}
|
||||
|
||||
client, _ := k8s.New(&k8s.Config{
|
||||
Host: host,
|
||||
})
|
||||
|
||||
kr := &KubernetesRegistry{
|
||||
Client: client,
|
||||
Namespace: "default",
|
||||
services: make(map[string]Service),
|
||||
}
|
||||
|
||||
kr.Watch()
|
||||
|
||||
return kr
|
||||
}
|
@@ -1,20 +0,0 @@
|
||||
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
|
||||
}
|
@@ -1,72 +0,0 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/proxy/config"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||
)
|
||||
|
||||
type KubernetesWatcher struct {
|
||||
Registry *KubernetesRegistry
|
||||
}
|
||||
|
||||
func (k *KubernetesWatcher) OnUpdate(services []api.Service) {
|
||||
fmt.Println("got update")
|
||||
activeServices := util.StringSet{}
|
||||
for _, service := range services {
|
||||
fmt.Printf("%#v\n", service.ObjectMeta)
|
||||
name, exists := service.ObjectMeta.Labels["name"]
|
||||
if !exists {
|
||||
continue
|
||||
}
|
||||
|
||||
activeServices.Insert(name)
|
||||
serviceIP := net.ParseIP(service.Spec.PortalIP)
|
||||
|
||||
ks := &KubernetesService{
|
||||
ServiceName: name,
|
||||
ServiceNodes: []*KubernetesNode{
|
||||
&KubernetesNode{
|
||||
NodeAddress: serviceIP.String(),
|
||||
NodePort: service.Spec.Ports[0].Port,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
k.Registry.mtx.Lock()
|
||||
k.Registry.services[name] = ks
|
||||
k.Registry.mtx.Unlock()
|
||||
}
|
||||
|
||||
k.Registry.mtx.Lock()
|
||||
defer k.Registry.mtx.Unlock()
|
||||
for name, _ := range k.Registry.services {
|
||||
if !activeServices.Has(name) {
|
||||
delete(k.Registry.services, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func NewKubernetesWatcher(kr *KubernetesRegistry) *KubernetesWatcher {
|
||||
serviceConfig := config.NewServiceConfig()
|
||||
endpointsConfig := config.NewEndpointsConfig()
|
||||
|
||||
config.NewSourceAPI(
|
||||
kr.Client.Services(api.NamespaceAll),
|
||||
kr.Client.Endpoints(api.NamespaceAll),
|
||||
time.Second*10,
|
||||
serviceConfig.Channel("api"),
|
||||
endpointsConfig.Channel("api"),
|
||||
)
|
||||
|
||||
ks := &KubernetesWatcher{
|
||||
Registry: kr,
|
||||
}
|
||||
|
||||
serviceConfig.RegisterHandler(ks)
|
||||
return ks
|
||||
}
|
@@ -11,12 +11,16 @@ type Registry interface {
|
||||
|
||||
type options struct{}
|
||||
|
||||
type Options func(*options)
|
||||
type Option func(*options)
|
||||
|
||||
var (
|
||||
DefaultRegistry = NewConsulRegistry([]string{})
|
||||
DefaultRegistry = newConsulRegistry([]string{})
|
||||
)
|
||||
|
||||
func NewRegistry(addrs []string, opt ...Option) Registry {
|
||||
return newConsulRegistry(addrs, opt...)
|
||||
}
|
||||
|
||||
func Register(s Service) error {
|
||||
return DefaultRegistry.Register(s)
|
||||
}
|
||||
|
Reference in New Issue
Block a user