W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
建議使用最新版 go 1.17
go version >= go 1.15
構(gòu)建如下文件目錄,使用命令 go mod init dubbo3-demo 初始化 go module。
quickstart ├── api │ └── api.go ├── client │ ├── client.go │ └── dubbogo.yml ├── go.mod └── server ├── dubbogo.yml └── server.go
選擇您喜歡的方式啟動zk,如您安裝docker-compose可直接從文件啟動:
zookeeper.yml:
version: '3' services: zookeeper: image: zookeeper ports: - 2181:2181 restart: on-failure
docker-compose -f ./zookeeper.yml up -d
package api import ( "context" "dubbo.apache.org/dubbo-go/v3/config" hessian "github.com/apache/dubbo-go-hessian2" "time" ) //1. 定義傳輸結(jié)構(gòu), 如需 Java 互通,字段需要與 Java 側(cè)對應(yīng),首字母大寫 type User struct { ID string Name string Age int32 Time time.Time } func (u *User) JavaClassName() string { return "org.apache.dubbo.User" // 如果與 Java 互通,需要與 Java 側(cè) User class全名對應(yīng), } var ( UserProviderClient = &UserProvider{} // 客戶端指針 ) // 2。 定義客戶端存根類:UserProvider type UserProvider struct { // dubbo標(biāo)簽,用于適配go側(cè)客戶端大寫方法名 -> java側(cè)小寫方法名,只有 dubbo 協(xié)議客戶端才需要使用 GetUser func(ctx context.Context, req int32) (*User, error) //`dubbo:"getUser"` } func init(){ hessian.RegisterPOJO(&User{}) // 注冊傳輸結(jié)構(gòu)到 hessian 庫 // 注冊客戶端存根類到框架,實例化客戶端接口指針 userProvider config.SetConsumerService(UserProviderClient) }
server/dubbogo.yml
dubbo: registries: demoZK: # 定義服務(wù)注冊發(fā)現(xiàn)中心 protocol: zookeeper address: 127.0.0.1:2181 protocols: dubbo: name: dubbo # 協(xié)議名 dubbo port: 20000 # 監(jiān)聽端口 provider: services: UserProvider: # 服務(wù)提供結(jié)構(gòu)類名 interface: org.apache.dubbo.UserProvider # 接口需要與 go/java 客戶端對應(yīng)
server/server.go
package main import ( "context" "dubbo.apache.org/dubbo-go/v3/common/logger" // dubbogo 框架日志 "dubbo.apache.org/dubbo-go/v3/config" _ "dubbo.apache.org/dubbo-go/v3/imports" // dubbogo 框架依賴,所有dubbogo進程都需要隱式引入一次 "dubbo3-demo/api" "strconv" "time" ) type UserProvider struct { } // 實現(xiàn)接口方法 func (u *UserProvider) GetUser(ctx context.Context, req int32) (*api.User, error) { var err error logger.Infof("req:%#v", req) user := &api.User{} user.ID = strconv.Itoa(int(req)) user.Name = "laurence" user.Age = 22 user.Time = time.Now() return user, err } //// MethodMapper 定義方法名映射,從 Go 的方法名映射到 Java 小寫方法名,只有 dubbo 協(xié)議服務(wù)接口才需要使用 //// go -> go 互通無需使用 //func (s *UserProvider) MethodMapper() map[string]string { // return map[string]string{ // "GetUser": "getUser", // } //} func init(){ config.SetProviderService(&UserProvider{}) // 注冊服務(wù)提供者類,類名與配置文件中的 service 對應(yīng) } // export DUBBO_GO_CONFIG_PATH=dubbogo.yml 運行前需要設(shè)置環(huán)境變量,指定配置文件位置 func main() { if err := config.Load(); err != nil { panic(err) } select {} }
client/dubbogo.yml
dubbo: registries: demoZK: # 定義服務(wù)注冊發(fā)現(xiàn)中心 protocol: zookeeper address: 127.0.0.1:2181 consumer: references: UserProvider: # 存根類名 protocol: dubbo # dubbo 協(xié)議,默認(rèn) hessian2 序列化方式 interface: org.apache.dubbo.UserProvider # 接口需要與 go/java 客戶端對應(yīng)
client/client.go
package main import ( "context" "dubbo.apache.org/dubbo-go/v3/common/logger" // dubbogo 框架日志 "dubbo.apache.org/dubbo-go/v3/config" _ "dubbo.apache.org/dubbo-go/v3/imports" // dubbogo 框架依賴,所有dubbogo進程都需要隱式引入一次 "dubbo3-demo/api" ) // export DUBBO_GO_CONFIG_PATH=dubbogo.yml 運行前需要設(shè)置環(huán)境變量,指定配置文件位置 func main(){ // 啟動框架 if err := config.Load(); err != nil{ panic(err) } var i int32 = 1 // 發(fā)起調(diào)用 user, err := api.UserProviderClient.GetUser(context.TODO(), i) if err != nil { panic(err) } logger.Infof("response result: %+v", user) }
開啟兩個終端,分別進入server client 目錄
分別執(zhí)行;
export DUBBO_GO_CONFIG_PATH=dubbogo.yml go run .
先后啟動服務(wù)端和客戶端, 可在客戶端看到輸出:
response result: &{ID:1 Name:laurence Age:22 Time:2021-11-12 17:59:39.185 +0800 CST}
獲得調(diào)用結(jié)果成功
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: