让我们从将 HTTP 请求转换为 Dubbo2 请求的案例来快速展示 Pixiu 的能力。
Pixiu 将 Client 的 HTTP 请求转换为 Dubbo2 请求,然后转发给背后的 Dubbo Server,然后将 Dubbo Server 的响应转换为 HTTP 响应,最后返回给 Client。
案例路径请查看 /samples/dubbogo/simple/resolve
Dubbo Server 提供用户增删改查的相关接口,其具体的代码实现见案例路径下的 server
Dubbo Server 的配置如下所示,注册了 Dubbo2 协议的 interface com.dubbogo.pixiu.UserService
。
dubbo:
registries:
zk:
protocol: zookeeper
timeout: 3s
address: 127.0.0.1:2181
protocols:
dubbo:
name: dubbo
port: 20000
provider:
registry-ids: zk
services:
UserProvider:
group: test
version: 1.0.0
cluster: test_dubbo
serialization: hessian2
interface: com.dubbogo.pixiu.UserService
为了用例的场景,Pixiu 需要启动对应的 HTTP Listener 进行 HTTP 请求的监听,所以就会使用到 httpconnectionmanager
。
然后因为要将 HTTP 请求转换为 Dubbo请求,所以需要使用 dgp.filter.http.dubboproxy
,这里我们将其auto_resolve
设置为true,表示开启 HTTP to Dubbo 默认转换协议(具体定义请看附录)。
Pixiu 的具体配置如下所示
static_resources:
listeners:
- name: "net/http"
protocol_type: "HTTP"
address:
socket_address:
address: "0.0.0.0"
port: 8883
filter_chains:
filters:
- name: dgp.filter.httpconnectionmanager
config:
route_config:
routes:
- match:
prefix: "*"
http_filters:
- name: dgp.filter.http.dubboproxy
config:
dubboProxyConfig:
auto_resolve: true
registries:
"zookeeper":
protocol: "zookeeper"
timeout: "3s"
address: "127.0.0.1:2181"
username: ""
password: ""
Client 就是简单的 HTTP Client 实现,但是需要按照前文提及的 HTTP to Dubbo 默认转换协议在 HTTP 请求的 Path 和 Header 中填入对应的数据,具体如下所示。
url := "http://localhost:8883/UserService/com.dubbogo.pixiu.UserService/GetUserByName"
data := "{\"types\":\"string\",\"values\":\"tc\"}"
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("POST", url, strings.NewReader(data))
req.Header.Set("x-dubbo-http1.1-dubbo-version", "1.0.0")
req.Header.Set("x-dubbo-service-protocol", "dubbo")
req.Header.Set("x-dubbo-service-version", "1.0.0")
req.Header.Set("x-dubbo-service-group", "test")
assert.NoError(t, err)
req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
项目提供了快速启动脚本,需要本地先安装有 Go 语言开发环境。
# cd 到案例总目录
cd samples/dubbogo/simple/
# 进行环境准备,启动 zk 和准备对应配置文件
./start.sh prepare resolve
# 启动 dubbo server
./start.sh startServer resolve
# 启动 pixiu
./start.sh startPixiu resolve
# 启动 Client 测试用例
./start.sh startTest resolve
# 或者使用 curl
curl -X POST 'http://localhost:8883/UserService/com.dubbogo.pixiu.UserService/GetUserByName' -d '{"types":"string","values":"tc"}' -H 'Content-Type: application/json' -H 'x-dubbo-http1.1-dubbo-version':'1.0.0' -H 'x-dubbo-service-protocol':"dubbo" -H 'x-dubbo-service-version':'1.0.0' -H 'x-dubbo-service-group':'test'
# 返回值 {"age":15,"code":1,"iD":"0001","name":"tc","time":"2021-08-01T18:08:41+08:00"}
docker pull phial3/dubbo-go-pixiu:latest
docker run --name pixiuname -p 8883:8883 \
-v /yourpath/conf.yaml:/etc/pixiu/conf.yaml \
-v /yourpath/log.yml:/etc/pixiu/log.yml \
apache/dubbo-go-pixiu:latest
# http请求调用dubbo服务转换,首先启动provider,这里使用zookeeper作为注册中心
cd samples/dubbogo/simple/resolve/server
# 添加需要的环境变量,指定provider的配置文件位置
export DUBBO_GO_CONFIG_PATH="../profiles/dev/server.yml"
export APP_LOG_CONF_FILE="../profiles/dev/log.yml"
# 启动provider
go run server.go user.go
# 进入到test目录下,启动test示例
cd samples/dubbogo/simple/resolve/test
go test pixiu_test.go