chickenlj commented on code in PR #2502:
URL: https://github.com/apache/dubbo-go/pull/2502#discussion_r1394124420


##########
client/options.go:
##########
@@ -131,239 +130,542 @@ func (cliOpts *ClientOptions) init(opts 
...ClientOption) error {
        ref.RegistryIDs = commonCfg.TranslateIds(ref.RegistryIDs)
 
        // init graceful_shutdown
-       
graceful_shutdown.Init(graceful_shutdown.SetShutdown_Config(cliOpts.Shutdown))
+       
graceful_shutdown.Init(graceful_shutdown.SetShutdown_Config(refOpts.cliOpts.Shutdown))
 
-       return commonCfg.Verify(cliOpts)
+       return commonCfg.Verify(refOpts)
 }
 
-type ClientOption func(*ClientOptions)
+type ReferenceOption func(*ReferenceOptions)
 
 // ---------- For user ----------
 
-func WithCheck() ClientOption {
-       return func(opts *ClientOptions) {
+func WithCheck() ReferenceOption {
+       return func(opts *ReferenceOptions) {
                check := true
                opts.Reference.Check = &check
        }
 }
 
-func WithURL(url string) ClientOption {
-       return func(opts *ClientOptions) {
+func WithURL(url string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
                opts.Reference.URL = url
        }
 }
 
 // todo(DMwangnima): change Filter Option like Cluster and LoadBalance
-func WithFilter(filter string) ClientOption {
-       return func(opts *ClientOptions) {
+func WithFilter(filter string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
                opts.Reference.Filter = filter
        }
 }
 
 // todo(DMwangnima): think about a more ideal configuration style
-func WithRegistryIDs(registryIDs []string) ClientOption {
-       return func(opts *ClientOptions) {
+func WithRegistryIDs(registryIDs []string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
                if len(registryIDs) > 0 {
                        opts.Reference.RegistryIDs = registryIDs
                }
        }
 }
 
-func WithRegistry(opts ...registry.Option) ClientOption {
+func WithRegistry(opts ...registry.Option) ReferenceOption {
        regOpts := registry.NewOptions(opts...)
 
-       return func(cliOpts *ClientOptions) {
-               if cliOpts.Registries == nil {
-                       cliOpts.Registries = 
make(map[string]*global.RegistryConfig)
+       return func(refOpts *ReferenceOptions) {
+               if refOpts.Registries == nil {
+                       refOpts.Registries = 
make(map[string]*global.RegistryConfig)
                }
-               cliOpts.Registries[regOpts.ID] = regOpts.Registry
+               refOpts.Registries[regOpts.ID] = regOpts.Registry
+       }
+}
+
+// ========== Cluster Strategy ==========
+
+func WithClusterAvailable() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyAvailable
+       }
+}
+
+func WithClusterBroadcast() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyBroadcast
+       }
+}
+
+func WithClusterFailBack() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyFailback
+       }
+}
+
+func WithClusterFailFast() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyFailfast
+       }
+}
+
+func WithClusterFailOver() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyFailover
+       }
+}
+
+func WithClusterFailSafe() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyFailsafe
+       }
+}
+
+func WithClusterForking() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyForking
+       }
+}
+
+func WithClusterZoneAware() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyZoneAware
+       }
+}
+
+func WithClusterAdaptiveService() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Cluster = constant.ClusterKeyAdaptiveService
+       }
+}
+
+// ========== LoadBalance Strategy ==========
+
+func WithLoadBalanceConsistentHashing() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = 
constant.LoadBalanceKeyConsistentHashing
        }
 }
 
-func WithShutdown(opts ...graceful_shutdown.Option) ClientOption {
-       sdOpts := graceful_shutdown.NewOptions(opts...)
+func WithLoadBalanceLeastActive() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = constant.LoadBalanceKeyLeastActive
+       }
+}
+
+func WithLoadBalanceRandom() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = constant.LoadBalanceKeyRandom
+       }
+}
+
+func WithLoadBalanceRoundRobin() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = constant.LoadBalanceKeyRoundRobin
+       }
+}
+
+func WithLoadBalanceP2C() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = constant.LoadBalanceKeyP2C
+       }
+}
+
+func WithLoadBalanceXDSRingHash() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Loadbalance = constant.LoadBalanceKeyLeastActive
+       }
+}
+
+func WithRetries(retries int) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Retries = strconv.Itoa(retries)
+       }
+}
+
+func WithGroup(group string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Group = group
+       }
+}
+
+func WithVersion(version string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Version = version
+       }
+}
+
+func WithJSON() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Serialization = constant.JSONSerialization
+       }
+}
+
+func WithProvidedBy(providedBy string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.ProvidedBy = providedBy
+       }
+}
+
+// todo(DMwangnima): implement this functionality
+//func WithAsync() ReferenceOption {
+//     return func(opts *ReferenceOptions) {
+//             opts.Reference.Async = true
+//     }
+//}
+
+func WithParams(params map[string]string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Params = params
+       }
+}
+
+// todo(DMwangnima): implement this functionality
+//func WithGeneric(generic bool) ReferenceOption {
+//     return func(opts *ReferenceOptions) {
+//             if generic {
+//                     opts.Reference.Generic = "true"
+//             } else {
+//                     opts.Reference.Generic = "false"
+//             }
+//     }
+//}
+
+func WithSticky(sticky bool) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Sticky = sticky
+       }
+}
+
+// ========== Protocol to consume ==========
+
+func WithProtocolDubbo() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Protocol = constant.Dubbo
+       }
+}
+
+func WithProtocolTriple() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Protocol = "tri"
+       }
+}
+
+func WithProtocolJsonRPC() ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.Protocol = "jsonrpc"
+       }
+}
+
+func WithProtocol(protocol string) ReferenceOption {

Review Comment:
   Yeah, I think we should provide both for flexibility.



-- 
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]

Reply via email to