This is an automated email from the ASF dual-hosted git repository.

ruinova pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/dubbo-go-samples.git


The following commit(s) were added to refs/heads/main by this push:
     new a7cf061c optimize config_center sample (#914)
a7cf061c is described below

commit a7cf061cb97e7b90d82601047d44374cbf24c86e
Author: KamTo Hung <[email protected]>
AuthorDate: Fri Oct 17 21:58:59 2025 +0800

    optimize config_center sample (#914)
    
    * fix(config): improve error handling and logging in config center 
integration
---
 config_center/zookeeper/go-client/cmd/main.go | 75 +++++++++++++++++++++------
 config_center/zookeeper/go-server/cmd/main.go | 69 +++++++++++++++++-------
 2 files changed, 109 insertions(+), 35 deletions(-)

diff --git a/config_center/zookeeper/go-client/cmd/main.go 
b/config_center/zookeeper/go-client/cmd/main.go
index c6481dc3..e6d5a668 100644
--- a/config_center/zookeeper/go-client/cmd/main.go
+++ b/config_center/zookeeper/go-client/cmd/main.go
@@ -40,71 +40,112 @@ import (
 )
 
 func main() {
-       _ = writeRuleToConfigCenter()
+       // write configuration to config center
+       if err := writeRuleToConfigCenter(); err != nil {
+               logger.Errorf("Failed to write config to config center: %v", 
err)
+               panic(err)
+       }
+       logger.Info("Successfully wrote config to ZooKeeper")
 
-       time.Sleep(time.Second * 10)
+       // wait for config write to finish
+       time.Sleep(time.Second * 3)
 
+       // configure Dubbo instance
        zkOption := config_center.WithZookeeper()
        dataIdOption := 
config_center.WithDataID("dubbo-go-samples-configcenter-zookeeper-client")
        addressOption := config_center.WithAddress("127.0.0.1:2181")
        groupOption := config_center.WithGroup("dubbogo")
+
        ins, err := dubbo.NewInstance(
                dubbo.WithConfigCenter(zkOption, dataIdOption, addressOption, 
groupOption),
        )
        if err != nil {
+               logger.Errorf("Failed to create Dubbo instance: %v", err)
                panic(err)
        }
-       // configure the params that only client layer cares
+
+       // create client
        cli, err := ins.NewClient()
        if err != nil {
+               logger.Errorf("Failed to create Dubbo client: %v", err)
                panic(err)
        }
 
+       // create service proxy
        svc, err := greet.NewGreetService(cli)
        if err != nil {
+               logger.Errorf("Failed to create GreetService: %v", err)
                panic(err)
        }
 
-       resp, err := svc.Greet(context.Background(), &greet.GreetRequest{Name: 
"hello world"})
+       // call remote service
+       ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
+       defer cancel()
+
+       resp, err := svc.Greet(ctx, &greet.GreetRequest{Name: "hello world"})
        if err != nil {
-               logger.Error(err)
+               logger.Errorf("Failed to call Greet service: %v", err)
+               return
        }
        logger.Infof("Greet response: %s", resp)
 }
 
 func writeRuleToConfigCenter() error {
+       // connect to ZooKeeper
        c, _, err := zk.Connect([]string{"127.0.0.1:2181"}, time.Second*10)
        if err != nil {
-               panic(err)
+               return perrors.Wrap(err, "failed to connect to ZooKeeper")
        }
+       defer c.Close() // ensure resource cleanup
 
        valueBytes := []byte(configCenterZKClientConfig)
        path := 
"/dubbo/config/dubbogo/dubbo-go-samples-configcenter-zookeeper-client"
+
+       // ensure path starts with '/'
        if !strings.HasPrefix(path, "/") {
                path = "/" + path
        }
-       paths := strings.Split(path, "/")
-       for idx := 2; idx < len(paths); idx++ {
-               tmpPath := strings.Join(paths[:idx], "/")
-               _, err = c.Create(tmpPath, []byte{}, 0, zk.WorldACL(zk.PermAll))
-               if err != nil && err != zk.ErrNodeExists {
-                       panic(err)
-               }
+
+       // create parent paths
+       if err := createParentPaths(c, path); err != nil {
+               return perrors.Wrap(err, "failed to create parent paths")
        }
 
+       // create or update config node
        _, err = c.Create(path, valueBytes, 0, zk.WorldACL(zk.PermAll))
        if err != nil {
                if perrors.Is(err, zk.ErrNodeExists) {
-                       _, stat, _ := c.Get(path)
+                       // node exists, update its content
+                       _, stat, getErr := c.Get(path)
+                       if getErr != nil {
+                               return perrors.Wrap(getErr, "failed to get 
existing node")
+                       }
                        _, setErr := c.Set(path, valueBytes, stat.Version)
                        if setErr != nil {
-                               panic(err)
+                               return perrors.Wrap(setErr, "failed to update 
existing node")
                        }
+                       logger.Info("Updated existing config node")
                } else {
-                       panic(err)
+                       return perrors.Wrap(err, "failed to create config node")
+               }
+       } else {
+               logger.Info("Created new config node")
+       }
+
+       return nil
+}
+
+// helper function to create parent paths
+func createParentPaths(c *zk.Conn, path string) error {
+       paths := strings.Split(path, "/")
+       for idx := 2; idx < len(paths); idx++ {
+               tmpPath := strings.Join(paths[:idx], "/")
+               _, err := c.Create(tmpPath, []byte{}, 0, 
zk.WorldACL(zk.PermAll))
+               if err != nil && !perrors.Is(err, zk.ErrNodeExists) {
+                       return perrors.Wrapf(err, "failed to create path: %s", 
tmpPath)
                }
        }
-       return err
+       return nil
 }
 
 const configCenterZKClientConfig = `## set in config center, group is 
'dubbogo', dataid is 'dubbo-go-samples-configcenter-zookeeper-client', 
namespace is default
diff --git a/config_center/zookeeper/go-server/cmd/main.go 
b/config_center/zookeeper/go-server/cmd/main.go
index 26cb58fa..2e819aa5 100644
--- a/config_center/zookeeper/go-server/cmd/main.go
+++ b/config_center/zookeeper/go-server/cmd/main.go
@@ -43,12 +43,20 @@ type GreetTripleServer struct {
 }
 
 func (srv *GreetTripleServer) Greet(ctx context.Context, req 
*greet.GreetRequest) (*greet.GreetResponse, error) {
+       // reference ctx to avoid unused parameter warning
+       _ = ctx
        resp := &greet.GreetResponse{Greeting: req.Name}
        return resp, nil
 }
 
 func main() {
-       _ = writeRuleToConfigCenter()
+       // Write configuration to the config center
+       if err := writeRuleToConfigCenter(); err != nil {
+               logger.Errorf("Failed to write config to config center: %v", 
err)
+               panic(err)
+       }
+
+       // Wait for the configuration to take effect
        time.Sleep(time.Second * 10)
 
        ins, err := dubbo.NewInstance(
@@ -60,19 +68,24 @@ func main() {
                ),
        )
        if err != nil {
+               logger.Errorf("Failed to create dubbo instance: %v", err)
                panic(err)
        }
+
        srv, err := ins.NewServer()
        if err != nil {
+               logger.Errorf("Failed to create server: %v", err)
                panic(err)
        }
 
        if err = greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{}); 
err != nil {
+               logger.Errorf("Failed to register service: %v", err)
                panic(err)
        }
 
+       logger.Info("Starting Dubbo-Go server...")
        if err = srv.Serve(); err != nil {
-               logger.Error(err)
+               logger.Errorf("Server failed to serve: %v", err)
        }
 }
 
@@ -93,42 +106,62 @@ dubbo:
         interface: com.apache.dubbo.sample.basic.IGreeter
 `
 
-func ensurePath(c *zk.Conn, path string, data []byte, flags int32, acl 
[]zk.ACL) error {
-       _, err := c.Create(path, data, flags, acl)
-       return err
-}
+// ensurePath Ensure the path exists (removed because it is unused)
 
 func writeRuleToConfigCenter() error {
+       // Connect to Zookeeper
        c, _, err := zk.Connect([]string{"127.0.0.1:2181"}, time.Second*10)
        if err != nil {
-               panic(err)
+               return perrors.Wrap(err, "failed to connect to zookeeper")
        }
+       defer c.Close() // Ensure the connection is closed
 
        valueBytes := []byte(configCenterZKServerConfig)
        path := 
"/dubbo/config/dubbogo/dubbo-go-samples-configcenter-zookeeper-server"
+
+       // Ensure the path starts with '/'
        if !strings.HasPrefix(path, "/") {
                path = "/" + path
        }
-       paths := strings.Split(path, "/")
-       for idx := 2; idx < len(paths); idx++ {
-               tmpPath := strings.Join(paths[:idx], "/")
-               _, err = c.Create(tmpPath, []byte{}, 0, zk.WorldACL(zk.PermAll))
-               if err != nil && err != zk.ErrNodeExists {
-                       panic(err)
-               }
+
+       // Create parent paths
+       if err := createParentPaths(c, path); err != nil {
+               return perrors.Wrap(err, "failed to create parent paths")
        }
 
+       // Create or update configuration node
        _, err = c.Create(path, valueBytes, 0, zk.WorldACL(zk.PermAll))
        if err != nil {
                if perrors.Is(err, zk.ErrNodeExists) {
-                       _, stat, _ := c.Get(path)
+                       // Node already exists, update configuration
+                       _, stat, getErr := c.Get(path)
+                       if getErr != nil {
+                               return perrors.Wrap(getErr, "failed to get 
existing node")
+                       }
                        _, setErr := c.Set(path, valueBytes, stat.Version)
                        if setErr != nil {
-                               panic(err)
+                               return perrors.Wrap(setErr, "failed to update 
existing node")
                        }
+                       logger.Info("Updated existing configuration in config 
center")
                } else {
-                       panic(err)
+                       return perrors.Wrap(err, "failed to create 
configuration node")
+               }
+       } else {
+               logger.Info("Created new configuration in config center")
+       }
+
+       return nil
+}
+
+// createParentPaths Create parent paths
+func createParentPaths(c *zk.Conn, path string) error {
+       paths := strings.Split(path, "/")
+       for idx := 2; idx < len(paths); idx++ {
+               tmpPath := strings.Join(paths[:idx], "/")
+               _, err := c.Create(tmpPath, []byte{}, 0, 
zk.WorldACL(zk.PermAll))
+               if err != nil && !perrors.Is(err, zk.ErrNodeExists) {
+                       return perrors.Wrapf(err, "failed to create parent 
path: %s", tmpPath)
                }
        }
-       return err
+       return nil
 }

Reply via email to