client
快速上手dubbo-go,编写一个简单的hellowworld应用
此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅最新版本。
client
第一步:编写消费端的服务
编写需要被编码的结构体,由于使用
Hessian2
作为编码协议,User
需要实现JavaClassName
方法,它的返回值在dubbo中对应User类的类名。type User struct { Id string Name string Age int32 Time time.Time } func (u User) JavaClassName() string { return "org.apache.dubbo.User" }
与服务端不同的是,提供服务的方法作为结构体的参数,不需要编写具体业务逻辑。另外,
Provider
不对应dubbo中的实现,而是对应一个接口。type UserProvider struct { GetUser func(ctx context.Context, req []interface{}, rsp *User) error } func (u *UserProvider) Reference() string { return "UserProvider" }
注册服务和对象
func init() { config.SetConsumerService(userProvider) hessian.RegisterPOJO(&User{}) }
第二步:编写消费端主程序
引入必需的dubbo-go包
import ( hessian "github.com/apache/dubbo-go-hessian2" _ "github.com/apache/dubbo-go/cluster/cluster_impl" _ "github.com/apache/dubbo-go/cluster/loadbalance" _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" "github.com/apache/dubbo-go/config" _ "github.com/apache/dubbo-go/filter/filter_impl" _ "github.com/apache/dubbo-go/protocol/dubbo" _ "github.com/apache/dubbo-go/registry/protocol" _ "github.com/apache/dubbo-go/registry/zookeeper" gxlog "github.com/dubbogo/gost/log" )
main 函数
func main() { config.Load() time.Sleep(3 * time.Second) gxlog.CInfo("\n\n\nstart to test dubbo") user := &pkg.User{} err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user) if err != nil { gxlog.CError("error: %v\n", err) os.Exit(1) return } gxlog.CInfo("response result: %v\n", user) }
第三步:编写配置文件并配置环境变量
编辑配置文件 log.yml, client.yml
- log.yml
level: "debug" development: true disableCaller: false disableStacktrace: false sampling: encoding: "console" # encoder encoderConfig: messageKey: "message" levelKey: "level" timeKey: "time" nameKey: "logger" callerKey: "caller" stacktraceKey: "stacktrace" lineEnding: "" levelEncoder: "capital" timeEncoder: "iso8601" durationEncoder: "seconds" callerEncoder: "short" nameEncoder: "" outputPaths: - "stderr" errorOutputPaths: - "stderr" initialFields:
- log.yml
# dubbo client yaml configure file check: true # client request_timeout: "3s" # connect timeout connect_timeout: "3s" # application config application: organization: "dubbo.io" name: "UserInfoClient" module: "dubbo-go user-info client" version: "0.0.1" environment: "dev" # registry config registries: "demoZk": protocol: "zookeeper" timeout: "3s" address: "127.0.0.1:2181" username: "" password: "" # reference config references: "UserProvider": registry: "demoZk" protocol: "dubbo" interface: "org.apache.dubbo.UserProvider" cluster: "failover" methods: - name: "GetUser" retries: 3 # protocol config protocol_conf: dubbo: reconnect_interval: 0 connection_number: 1 heartbeat_period: "5s" session_timeout: "180s" pool_size: 64 pool_ttl: 600 getty_session_param: compress_encoding: false tcp_no_delay: true tcp_keep_alive: true keep_alive_period: "120s" tcp_r_buf_size: 262144 tcp_w_buf_size: 65536 pkg_rq_size: 1024 pkg_wq_size: 512 tcp_read_timeout: "1s" tcp_write_timeout: "5s" wait_timeout: "1s" max_msg_len: 1024000 session_name: "client"
把上面的两个配置文件分别配置为环境变量,为防止log的环境变量和服务端的log环境变量冲突,建议所有的环境变量不要做全局配置,在当前起效即可。
export CONF_CONSUMER_FILE_PATH="xxx" export APP_LOG_CONF_FILE="xxx"
本文章源码详情见git:https://github.com/apache/dubbo-go-samples/tree/1.5/helloworld/go-client
最后修改 April 3, 2023: update links (#2495) (f74ef4dc40)