PhilYue commented on a change in pull request #255:
URL: https://github.com/apache/dubbo-go-pixiu/pull/255#discussion_r720122034
##########
File path: pkg/adapter/springcloud/cloud.go
##########
@@ -64,58 +80,259 @@ func (p *CloudPlugin) Kind() string {
}
// CreateAdapter create adapter
-func (p *CloudPlugin) CreateAdapter(config interface{}, bs *model.Bootstrap)
(adapter.Adapter, error) {
- return &CloudAdapter{cfg: &Config{}}, nil
+func (p *CloudPlugin) CreateAdapter(ad *model.Adapter) (adapter.Adapter,
error) {
+ return &CloudAdapter{cfg: &Config{}, stopChan: make(chan struct{}),
currentService: make(map[string]*Service)}, nil
}
// Start start the adapter
-func (a *CloudAdapter) Start() {
+func (a *CloudAdapter) Start(adapter *model.Adapter) {
// do not block the main goroutine
- go func() {
- // fetch service instance from consul
-
- // transform into endpoint and cluster
- endpoint := &model.Endpoint{}
- endpoint.ID = "user-mock-service"
- endpoint.Address = model.SocketAddress{
- Address: "127.0.0.1",
- Port: 8080,
- }
- cluster := &model.Cluster{}
- cluster.Name = "userservice"
- cluster.Lb = model.Rand
- cluster.Endpoints = []*model.Endpoint{
- endpoint,
- }
- // add cluster into manager
- cm := server.GetClusterManager()
- cm.AddCluster(cluster)
-
- // transform into route
- routeMatch := model.RouterMatch{
- Prefix: "/user",
- }
- routeAction := model.RouteAction{
- Cluster: "userservice",
- }
- route := &model.Router{Match: routeMatch, Route: routeAction}
+ // init get all service instance
+ err := a.firstFetch()
+ if err != nil {
+ logger.Errorf("init fetch service fail", err.Error())
+ return
+ }
- server.GetRouterManager().AddRouter(route)
+ // background sync service instance from remote
+ err = a.backgroundSyncPeriod()
+ if err != nil {
+ logger.Errorf("init periodicity fetch service task fail",
err.Error())
+ return
+ }
- }()
+ // watch then fetch is more safety for consistent but there is
background fresh mechanism
+ err = a.watch()
+ if err != nil {
+ logger.Errorf("init watch the register fail", err.Error())
+ return
+ }
}
// Stop stop the adapter
func (a *CloudAdapter) Stop() {
-
+ err := a.stop()
+ if err != nil {
+ logger.Errorf("stop the adapter fail", err.Error())
+ return
+ }
}
// Apply init
func (a *CloudAdapter) Apply() error {
+ //registryUsed := ad.Config["registry"].(map[string]interface{})
+ switch a.cfg.Registry.Protocol {
+ case "nacos":
+ sd, err := nacos.NewNacosServiceDiscovery(a.cfg.Services,
a.cfg.Registry, a)
+ if err != nil {
+ logger.Errorf("Apply NewNacosServiceDiscovery",
err.Error())
+ return err
+ }
+ a.sd = sd
+ case "consul":
+ case "zookeeper":
+ default:
+ return errors.New("adapter init error registry not recognise")
+ }
return nil
}
+func (a *CloudAdapter) OnAddServiceInstance(instance
*servicediscovery.ServiceInstance) {
+ cm := server.GetClusterManager()
+ endpoint := instance.ToEndpoint()
+
+ a.mutex.Lock()
+ defer a.mutex.Unlock()
+
+ // endpoint name should equal with cluster name
+ cm.SetEndpoint(endpoint.Name, endpoint)
+ if a.checkHasExistService(endpoint.Name) {
+ return
+ }
+ // new service, so add route and into CurrentService map
+ a.addNewService(instance)
+ // route ID is cluster name, so equal with endpoint name
+ rm := server.GetRouterManager()
+ route := instance.ToRoute()
+ rm.AddRouter(route)
+}
+
+func (a *CloudAdapter) OnDeleteServiceInstance(instance
*servicediscovery.ServiceInstance) {
+ cm := server.GetClusterManager()
+ endpoint := instance.ToEndpoint()
+
+ cm.DeleteEndpoint(endpoint.Name, endpoint.ID)
+
+}
+
+func (a *CloudAdapter) OnUpdateServiceInstance(instance
*servicediscovery.ServiceInstance) {
+ cm := server.GetClusterManager()
+ endpoint := instance.ToEndpoint()
+ a.mutex.Lock()
+ defer a.mutex.Unlock()
+ cm.SetEndpoint(endpoint.Name, endpoint)
+}
+
+func (a *CloudAdapter) GetServiceNames() []string {
+ a.mutex.Lock()
+ defer a.mutex.Unlock()
+
+ var res []string
Review comment:
done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]