# Direct 示例

### 背景

在开发及测试环境下，经常需要绕过注册中心，测试指定服务提供者，这时候可能需要点对点直连，
点对点直连方式，将以服务接口为单位，忽略注册中心的提供者列表，A 接口配置点对点，不影响 B 接口从注册中心获取列表。

本示例提供基于 Dubbo-go 的`Consumer`点对点直连`Provider`完成服务调用，帮助更好理解 Dubbo-go 的连通性。


### 目录

```
├── go-client     
│   ├── cmd       启动入口
│   ├── conf      消费者配置：dubbo 服务属性配置、日志属性配置
│   └── pkg       业务包  
└── go-server     
    ├── cmd       启动入口
    ├── conf      服务提供者配置：dubbo 服务属性配置、日志属性配置
    ├── docker    docker compose： Zookeeper 
    ├── pkg
    └── tests
        └── integration
```

- go-server: 服务提供者
- go-client: 服务消费者

#### 服务提供者

直连示例代码说明：

1. 配置dubbo 服务协议，注册中心，服务信息等，具体参阅 [server.yml](go-server/conf/server.yml)

```yaml
services:
  "UserProvider":
    registry: "demoZk"
    protocol : "dubbo"
    interface : "org.apache.dubbo.UserProvider"
    loadbalance: "random"
    warmup: "100"
    cluster: "failover"
    methods:
    - name: "GetUser"
      retries: 1
      loadbalance: "random"
```

2. 应用启动：注册服务

```go
hessian.RegisterPOJO(&pkg.User{})
config.Load()
initSignal()
```

- 基于`hessian`序列化协议，使用[apache/dubbo-go-hessian2](https://github.com/apache/dubbo-go-hessian2) RegisterPOJO注册一个POJO实例
- Dubbo Init：注册服务，详情参考[apache/dubbo-go/../config_loader.go](https://github.com/apache/dubbo-go/blob/master/config/config_loader.go)
    - init router
    - init the global event dispatcher
    - start the metadata report if config set
    - reference config
    - service config
    - init the shutdown callback
- 初始化 signal 包：将输入信号（对应信号）转发到 `chan`， signal包不会为了向`chan`发送信息而阻塞，调用者应该保证`chan`有足够的缓存空间可以跟上期望的信号频率，此处单一信号用于通知的通道，缓存为设置 `1`
    
    ```go
    func initSignal() {
        signals := make(chan os.Signal, 1)
        // It is not possible to block SIGKILL or syscall.SIGSTOP
        signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
        for {
            sig := <-signals
            logger.Infof("get signal %s", sig.String())
            switch sig {
            case syscall.SIGHUP:
                // reload()
            default:
                time.AfterFunc(time.Duration(survivalTimeout), func() {
                    logger.Warnf("app exit now by force...")
                    os.Exit(1)
                })
    
                // The program exits normally or timeout forcibly exits.
                fmt.Println("provider app exit now...")
                return
            }
        }
    }
    ```

#### 服务消费者

1. 在程序启动之初设置需要订阅的 `dubbo` 服务，
   确保配置文件 `client.yml` 已配置订阅服务相关信息，可自定义设置服务属性等，覆盖 Provider 的属性配置，详情参阅 [client.yml](go-client/conf/client.yml),
   保留最少配置 `application` 和 `references` 验证点对点直连效果，无需注册中心等配置

```go
var userProvider = new(pkg.UserProvider)

func init() {
    config.SetConsumerService(userProvider)
    hessian.RegisterPOJO(&pkg.User{})
}
```

```yaml
application:
  organization: "dubbo.io"
  name: "UserInfoClient"
  module: "dubbo-go user-info client"
  version: "0.0.1"
  environment: "dev"
references:
  "UserProvider":
    registry: "demoZk"
    protocol: "dubbo"
    interface: "org.apache.dubbo.UserProvider"
    cluster: "failover"
    # this is necessary to enable direct-invoking.
    url: "dubbo://127.0.0.1:20000"
    methods:
      - name: "GetUser"
        retries: 3
```

注意，如果想调用 gRPC 服务，只需要把上面的 url 改为 ”grpc://127.0.0.1:20000" 即可。

2. 应用启动：直连服务，完成一次服务调用

```go
hessian.RegisterPOJO(&pkg.User{})
config.Load()
user := &pkg.User{}
err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user)
```


### 如何运行
请参阅根目录中的 [HOWTO.md](../HOWTO_zh.md) 来运行本例。

#### 1. 环境配置

配置环境变量，指定服务加载所需配置文件路径

- go-server:

```shell
APP_LOG_CONF_FILE=direct/go-server/conf/log.yml;
CONF_PROVIDER_FILE_PATH=direct/go-server/conf/server.yml
```

- go-client:

```shell
APP_LOG_CONF_FILE=direct/go-client/conf/log.yml;
CONF_CONSUMER_FILE_PATH=direct/go-client/conf/client.yml
```

详情请参阅 [dubbo-go/.../env.go](https://github.com/apache/dubbo-go/blob/master/common/constant/env.go)


#### 2. 启动注册中心

本示例使用 Zookeeper 做注册中心， 可以直接运行 docker zookeeper 环境，配置详情请参阅 `docker-compose.yml`

#### 3. 启动服务提供者
#### 4. 启动服务消费者


请参阅根目录中的 [HOWTO.md](../HOWTO_zh.md) 来运行本例。

