使用 Nacos 作為註冊中心

1. 準備工作

  • 已安裝 dubbo-go cli 工具和相關工具
  • 建立新的 demo 應用程式

2. 使用 grpc_cli 工具除錯 Dubbo 服務

2.1 啟動伺服器

範例:user.go

func (u *UserProvider) GetUser(ctx context.Context, userStruct *CallUserStruct) (*User, error) {
fmt.Printf("=========================\nreq:%#v\n", userStruct)
rsp := User{"A002", "Alex Stocks", 18, userStruct.SubInfo}
fmt.Printf("========================\nrsp:%#v\n", rsp)
return &rsp, nil
}

伺服器開啟一個名為 GetUser 的服務,傳入 CallUserStruct 參數,並返回 User 參數
CallUserStruct 參數定義

type CallUserStruct struct {
ID string
Male bool
SubInfo SubInfo // nested substructure
}
func (cs CallUserStruct) JavaClassName() string {
return "com.ikurento.user.CallUserStruct"
}

type SubInfo struct {
SubID string
SubMale bool
SubAge int
}

func (s SubInfo) JavaClassName() string {
return "com.ikurento.user.SubInfo"
}

User 結構定義

type User struct {
Id string
name string
Age int32
SubInfo SubInfo // Nest the above substructure SubInfo
}

func (u *User) JavaClassName() string {
return "com.ikurento.user.User"
}

啟動服務

cd server
source builddev.sh
go run.

2.2 定義請求主體(解封裝協定)

請求主體定義為 json 檔案,約定的鍵值為字串
鍵對應 go 語言 struct 的欄位名稱,例如「ID」和「Name」,值對應「type@val」
其中 type 支援 string int bool time,val 以字串初始化。如果只填寫 type,則初始化為零值。約定每個 struct 必須有一個 JavaClassName 欄位,必須與伺服器端嚴格對應

參見 userCall.json

{
  "ID": "string@A000",
  "Male": "bool@true",
  "SubInfo": {
    "SubID": "string@A001",
    "SubMale": "bool@false",
    "SubAge": "int@18",
    "JavaClassName": "string@com.ikurento.user.SubInfo"
  },
  "JavaClassName": "string@com.ikurento.user.CallUserStruct"
}

userCall.json 定義了參數 CallUserStruct 和子結構 SubInfo 的結構,並賦值給請求參數。

同樣,user.json 作為返回值不需要賦初始值,但 JavaClassName 欄位必須與伺服器端嚴格對應

{
  "ID": "string",
  "Name": "string",
  "Age": "int",
  "JavaClassName": "string@com.ikurento.user.User",
  "SubInfo": {
    "SubID": "string",
    "SubMale": "bool",
    "SubAge": "int",
    "JavaClassName": "string@com.ikurento.user.SubInfo"
  }
}

2.3 執行請求

dubbogo-cli call --h=localhost --p 20001 --proto=dubbo --i=com.ikurento.user.UserProvider --method=GetUser --sendObj="./userCall.json" --recvObj= "./user.json"

客戶端列印結果

2020/10/26 20:47:45 Created pkg:
2020/10/26 20:47:45 &{ID:A000 Male:true SubInfo:0xc00006ea20 JavaClassName:com.ikurento.user.CallUserStruct}
2020/10/26 20:47:45 SubInfo:
2020/10/26 20:47:45 &{SubID:A001 SubMale:false SubAge:18 JavaClassName:com.ikurento.user.SubInfo}


2020/10/26 20:47:45 Created pkg:
2020/10/26 20:47:45 &{ID: Name: Age:0 JavaClassName:com.ikurento.user.User SubInfo:0xc00006ec90}
2020/10/26 20:47:45 SubInfo:
2020/10/26 20:47:45 &{SubID: SubMale:false SubAge:0 JavaClassName:com.ikurento.user.SubInfo}


2020/10/26 20:47:45 connected to localhost:20001!
2020/10/26 20:47:45 try calling interface: com.ikurento.user.UserProvider.GetUser
2020/10/26 20:47:45 with protocol: dubbo

2020/10/26 20:47:45 After 3ms , Got Rsp:
2020/10/26 20:47:45 &{ID:A002 Name:Alex Stocks Age:18 JavaClassName: SubInfo:0xc0001241b0}
2020/10/26 20:47:45 SubInfo:
2020/10/26 20:47:45 &{SubID:A001 SubMale:false SubAge:18 JavaClassName:}```

可以看到詳細的請求主體賦值,以及返回的結果和耗時。支援巢狀結構

伺服器端列印結果

=========================
req:&main.CallUserStruct{ID:"A000", Male:true, SubInfo:main.SubInfo{SubID:"A001", SubMale:false, SubAge:18}}
=========================

可以看到已收到來自 cli 的資料


最後修改日期:2023 年 1 月 2 日:增強 Dubbogo 文件 (#1800) (71c8e722740)