快速開始

2022-04-14 09:58 更新

快速上手dubbo-go,編寫一個簡單的hellowworld應用

快速開始

通過一個 hellowworld 例子帶領大家快速上手Dubbo-go框架。

協議:Dubbo編碼:Hessian2注冊中心:Zookeeper

環(huán)境

  • Go編程環(huán)境
  • 啟動zookeeper服務,也可以使用遠程實例

從服務端開始

第一步:編寫 Provider 結構體和提供服務的方法

https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/user.go
  1. 編寫需要被編碼的結構體,由于使用 Hessian2 作為編碼協議,User 需要實現 JavaClassName 方法,它的返回值在dubbo中對應User類的類名。
type User struct {
	Id   string
	Name string
	Age  int32
	Time time.Time
}

func (u User) JavaClassName() string {
	return "com.ikurento.user.User"
}
  1. 編寫業(yè)務邏輯,UserProvider 相當于dubbo中的一個服務實現。需要實現 Reference 方法,返回值是這個服務的唯一標識,對應dubbo的 beans 和 path 字段。
type UserProvider struct {
}

func (u *UserProvider) GetUser(ctx context.Context, req []interface{}) (*User, error) {
	println("req:%#v", req)
	rsp := User{"A001", "hellowworld", 18, time.Now()}
	println("rsp:%#v", rsp)
	return &rsp, nil
}

func (u *UserProvider) Reference() string {
	return "UserProvider"
}
  1. 注冊服務和對象
func init() {
	config.SetProviderService(new(UserProvider))
	// ------for hessian2------
	hessian.RegisterPOJO(&User{})
}

第二步:編寫主程序

https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/server.go
  1. 引入必需的dubbo-go包
import (
	hessian "github.com/apache/dubbo-go-hessian2"
	"github.com/apache/dubbo-go/config"
	_ "github.com/apache/dubbo-go/registry/protocol"
	_ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
	_ "github.com/apache/dubbo-go/filter/impl"
	_ "github.com/apache/dubbo-go/cluster/cluster_impl"
	_ "github.com/apache/dubbo-go/cluster/loadbalance"
	_ "github.com/apache/dubbo-go/registry/zookeeper"

	_ "github.com/apache/dubbo-go/protocol/dubbo"
)
  1. main 函數
func main() {
	config.Load()
}

第三步:編寫配置文件并配置環(huán)境變量

  1. 參考 log 和 server 編輯配置文件。

主要編輯以下部分:

  • registries 結點下需要配置zk的數量和地址
  • services 結點下配置服務的具體信息,需要配置 interface 配置,修改為對應服務的接口名,服務的key對應第一步中 Provider 的 Reference 返回值
  1. 把上面的兩個配置文件分別配置為環(huán)境變量
export CONF_PROVIDER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"

接著是客戶端

第一步:編寫客戶端 Provider

https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/user.go
  1. 參考服務端第一步的第一點。
  2. 與服務端不同的是,提供服務的方法作為結構體的參數,不需要編寫具體業(yè)務邏輯。另外,Provider 不對應dubbo中的接口,而是對應一個實現。
type UserProvider struct {
	GetUser func(ctx context.Context, req []interface{}, rsp *User) error
}

func (u *UserProvider) Reference() string {
	return "UserProvider"
}
  1. 注冊服務和對象
func init() {
	config.SetConsumerService(userProvider)
	hessian.RegisterPOJO(&User{})
}

第二步:編寫客戶端主程序

https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/client.go
  1. 引入必需的dubbo-go包
import (
	hessian "github.com/apache/dubbo-go-hessian2"
	"github.com/apache/dubbo-go/config"
	_ "github.com/apache/dubbo-go/registry/protocol"
	_ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
	_ "github.com/apache/dubbo-go/filter/impl"
	_ "github.com/apache/dubbo-go/cluster/cluster_impl"
	_ "github.com/apache/dubbo-go/cluster/loadbalance"
	_ "github.com/apache/dubbo-go/registry/zookeeper"

	_ "github.com/apache/dubbo-go/protocol/dubbo"
)
  1. main 函數
func main() {
	config.Load()
	time.Sleep(3e9)

	println("\n\n\nstart to test dubbo")
	user := &User{}
	err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user)
	if err != nil {
		panic(err)
	}
	println("response result: %v\n", user)
}
func println(format string, args ...interface{}) {
	fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
}

第三步:編寫配置文件并配置環(huán)境變量

  1. 參考 log 和 client 編輯配置文件。

主要編輯以下部分:

  • registries 結點下需要配置zk的數量和地址
  • references 結點下配置服務的具體信息,需要配置 interface 配置,修改為對應服務的接口名,服務的key對應第一步中 Provider 的 Reference 返回值
  1. 把上面的兩個配置文件費別配置為環(huán)境變量,為防止log的環(huán)境變量和服務端的log環(huán)境變量沖突,建議所有的環(huán)境變量不要做全局配置,在當前起效即可。
export CONF_CONSUMER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號