Skip to content
Snippets Groups Projects
Commit 90a5a804 authored by zhangym's avatar zhangym
Browse files
parent e699840c
No related branches found
No related tags found
No related merge requests found
# [dubbo-go 快速开始](https://github.com/dubbogo/dubbo-go-website/blob/master/docs/zh-cn/user/quick-start.md)
---
title: 快速开始
keywords: 快速开始, hellowworld, Provider
description: 快速上手dubbo-go,编写一个简单的hellowworld应用
---
| title | keywords | description |
| -------- | ------------------------------- | -------------------------------------------------- |
| 快速开始 | 快速开始, hellowworld, Provider | 快速上手 dubbo-go,编写一个简单的 hellowworld 应用 |
# 快速开始
# [快速开始](<(https://github.com/dubbogo/dubbo-go-website/blob/master/docs/zh-cn/user/quick-start.md)>)
通过一个 `hellowworld` 例子带领大家快速上手 Dubbo-go 框架。
协议:Dubbo
编码:Hessian2
协议:Dubbo
编码:Hessian2
注册中心:Zookeeper
## 环境
......@@ -21,79 +21,80 @@
### 第一步:编写 `Provider` 结构体和提供服务的方法
> https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/user.go
> <https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/user.go>
1. 编写需要被编码的结构体,由于使用 `Hessian2` 作为编码协议,`User` 需要实现 `JavaClassName` 方法,它的返回值在 dubbo 中对应 User 类的类名。
```go
type User struct {
Id string
Name string
Age int32
Time time.Time
}
func (u User) JavaClassName() string {
return "com.ikurento.user.User"
}
```
1. 编写业务逻辑,`UserProvider` 相当于 dubbo 中的一个服务实现。需要实现 `Reference` 方法,返回值是这个服务的唯一标识,对应 dubbo 的 `beans``path` 字段。
```go
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. 注册服务和对象
```go
func init() {
config.SetProviderService(new(UserProvider))
// ------for hessian2------
hessian.RegisterPOJO(&User{})
}
```
```go
type User struct {
Id string
Name string
Age int32
Time time.Time
}
func (u User) JavaClassName() string {
return "com.ikurento.user.User"
}
```
2. 编写业务逻辑,`UserProvider` 相当于 dubbo 中的一个服务实现。需要实现 `Reference` 方法,返回值是这个服务的唯一标识,对应 dubbo 的 `beans``path` 字段。
```go
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"
}
```
3. 注册服务和对象
```go
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
> <https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-server/app/server.go>
1. 引入必需的 dubbo-go 包
```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 函数
```go
func main() {
config.Load()
}
```
```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"
)
```
2. main 函数
```go
func main() {
config.Load()
}
```
### 第三步:配置
......@@ -104,14 +105,15 @@
主要编辑以下部分:
- `registries` 结点下需要配置 zk 的数量和地址
- `services` 结点下配置服务的具体信息,需要配置 `interface` 配置,修改为对应服务的接口名,服务的 key 对应第一步中 `Provider``Reference` 返回值
1. 把上面的两个配置文件分别配置为环境变量
2. 把上面的两个配置文件分别配置为环境变量
```sh
export CONF_PROVIDER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"
```
```shell
export CONF_PROVIDER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"
```
#### 2.自定义配置文件
......@@ -121,89 +123,90 @@
2.`config.Load()`之前设置配置
```go
func main() {
hessian.RegisterPOJO(&User{})
providerConfig := config.ProviderConfig{}
yaml.Unmarshal([]byte(providerConfigStr), &providerConfig)
config.SetProviderConfig(providerConfig)
defaultServerConfig := dubbo.GetDefaultServerConfig()
dubbo.SetServerConfig(defaultServerConfig)
logger.SetLoggerLevel("warn") // info,warn
config.Load()
select {
}
}
```
```go
func main() {
hessian.RegisterPOJO(&User{})
providerConfig := config.ProviderConfig{}
yaml.Unmarshal([]byte(providerConfigStr), &providerConfig)
config.SetProviderConfig(providerConfig)
defaultServerConfig := dubbo.GetDefaultServerConfig()
dubbo.SetServerConfig(defaultServerConfig)
logger.SetLoggerLevel("warn") // info,warn
config.Load()
select {
}
}
```
## 接着是客户端
### 第一步:编写客户端 `Provider`
> https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/user.go
> <https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/user.go>
1. 参考服务端第一步的第一点。
2. 与服务端不同的是,提供服务的方法作为结构体的参数,不需要编写具体业务逻辑。另外,`Provider` 不对应 dubbo 中的接口,而是对应一个实现。
```go
type UserProvider struct {
GetUser func(ctx context.Context, req []interface{}, rsp *User) error
}
```go
type UserProvider struct {
GetUser func(ctx context.Context, req []interface{}, rsp *User) error
}
func (u *UserProvider) Reference() string {
return "UserProvider"
}
```
func (u *UserProvider) Reference() string {
return "UserProvider"
}
```
3. 注册服务和对象
```go
func init() {
config.SetConsumerService(userProvider)
hessian.RegisterPOJO(&User{})
}
```
```go
func init() {
config.SetConsumerService(userProvider)
hessian.RegisterPOJO(&User{})
}
```
### 第二步:编写客户端主程序
> https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/client.go
> <https://github.com/dubbogo/dubbo-samples/blob/master/golang/helloworld/dubbo/go-client/app/client.go>
1. 引入必需的 dubbo-go 包
```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 函数
```go
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...)
}
```
```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"
)
```
2. main 函数
```go
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...)
}
```
### 第三步:配置
......@@ -214,14 +217,15 @@
主要编辑以下部分:
- `registries` 结点下需要配置 zk 的数量和地址
- `references` 结点下配置服务的具体信息,需要配置 `interface` 配置,修改为对应服务的接口名,服务的 key 对应第一步中 `Provider``Reference` 返回值
1. 把上面的两个配置文件费别配置为环境变量,为防止 log 的环境变量和服务端的 log 环境变量冲突,建议所有的环境变量不要做全局配置,在当前起效即可。
2. 把上面的两个配置文件费别配置为环境变量,为防止 log 的环境变量和服务端的 log 环境变量冲突,建议所有的环境变量不要做全局配置,在当前起效即可。
```sh
export CONF_CONSUMER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"
```
```shell
export CONF_CONSUMER_FILE_PATH="xxx"
export APP_LOG_CONF_FILE="xxx"
```
#### 2.自定义配置文件
......@@ -231,22 +235,22 @@
2.`config.Load()`之前设置配置
```go
func main() {
p := config.ConsumerConfig{}
yaml.Unmarshal([]byte(consumerConfigStr), &p)
config.SetConsumerConfig(p)
defaultClientConfig := dubbo.GetDefaultClientConfig()
dubbo.SetClientConf(defaultClientConfig)
logger.SetLoggerLevel("warn") // info,warn
config.Load()
user := &User{}
err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user)
if err != nil {
log.Print(err)
return
}
log.Print(user)
}
```
```go
func main() {
p := config.ConsumerConfig{}
yaml.Unmarshal([]byte(consumerConfigStr), &p)
config.SetConsumerConfig(p)
defaultClientConfig := dubbo.GetDefaultClientConfig()
dubbo.SetClientConf(defaultClientConfig)
logger.SetLoggerLevel("warn") // info,warn
config.Load()
user := &User{}
err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user)
if err != nil {
log.Print(err)
return
}
log.Print(user)
}
```
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment