快速開始

2022-04-14 09:58 更新

快速上手dubbo-go,編寫一個(gè)簡單的hellowworld應(yīng)用

快速開始

通過一個(gè) hellowworld 例子帶領(lǐng)大家快速上手Dubbo-go框架。

協(xié)議:Dubbo編碼:Hessian2注冊(cè)中心:Zookeeper

環(huán)境

  • Go編程環(huán)境
  • 啟動(dòng)zookeeper服務(wù),也可以使用遠(yuǎn)程實(shí)例

從服務(wù)端開始

第一步:編寫 Provider 結(jié)構(gòu)體和提供服務(wù)的方法

https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/user.go
  1. 編寫需要被編碼的結(jié)構(gòu)體,由于使用 Hessian2 作為編碼協(xié)議,User 需要實(shí)現(xiàn) JavaClassName 方法,它的返回值在dubbo中對(duì)應(yīng)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è)務(wù)邏輯,UserProvider 相當(dāng)于dubbo中的一個(gè)服務(wù)實(shí)現(xiàn)。需要實(shí)現(xiàn) Reference 方法,返回值是這個(gè)服務(wù)的唯一標(biāo)識(shí),對(duì)應(yīng)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. 注冊(cè)服務(wù)和對(duì)象
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 函數(shù)
func main() {
	config.Load()
}

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

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

主要編輯以下部分:

  • registries 結(jié)點(diǎn)下需要配置zk的數(shù)量和地址
  • services 結(jié)點(diǎn)下配置服務(wù)的具體信息,需要配置 interface 配置,修改為對(duì)應(yīng)服務(wù)的接口名,服務(wù)的key對(duì)應(yīng)第一步中 Provider 的 Reference 返回值
  1. 把上面的兩個(gè)配置文件分別配置為環(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. 參考服務(wù)端第一步的第一點(diǎn)。
  2. 與服務(wù)端不同的是,提供服務(wù)的方法作為結(jié)構(gòu)體的參數(shù),不需要編寫具體業(yè)務(wù)邏輯。另外,Provider 不對(duì)應(yīng)dubbo中的接口,而是對(duì)應(yīng)一個(gè)實(shí)現(xiàn)。
type UserProvider struct {
	GetUser func(ctx context.Context, req []interface{}, rsp *User) error
}

func (u *UserProvider) Reference() string {
	return "UserProvider"
}
  1. 注冊(cè)服務(wù)和對(duì)象
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 函數(shù)
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 結(jié)點(diǎn)下需要配置zk的數(shù)量和地址
  • references 結(jié)點(diǎn)下配置服務(wù)的具體信息,需要配置 interface 配置,修改為對(duì)應(yīng)服務(wù)的接口名,服務(wù)的key對(duì)應(yīng)第一步中 Provider 的 Reference 返回值
  1. 把上面的兩個(gè)配置文件費(fèi)別配置為環(huán)境變量,為防止log的環(huán)境變量和服務(wù)端的log環(huán)境變量沖突,建議所有的環(huán)境變量不要做全局配置,在當(dāng)前起效即可。
export CONF_CONSUMER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)