快速开始

cwgo 是 CloudWeGo All in one 代码生成工具,整合了各个组件的优势,提高开发者提体验。

准备 Golang 开发环境

  1. 如果您之前未搭建 Golang 开发环境, 可以参考 Golang 安装
  2. 推荐使用最新版本的 Golang,我们保证最新两个正式版本的兼容性(现在 >= v1.18)。
  3. 确保打开 go mod 支持 (Golang >= 1.15 时,默认开启)
  4. cwgo 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2

在完成环境准备后,接下来将帮助你快速上手 cwgo。

安装 cwgo 工具

$ go install github.com/cloudwego/cwgo@latest

用 go 命令来安装是最简单的,你也可以选择自己从源码构建和安装。要查看 cwgo 的安装位置,可以用:

$ go list -f {{.Target}} github.com/cloudwego/cwgo

要使用 thrift 或 protobuf 的 IDL 生成代码,需要安装相应的编译器:thriftgoprotoc

thriftgo 安装:

$ GO111MODULE=on go install github.com/cloudwego/thriftgo@latest

protoc 安装

# brew 安装
$ brew install protobuf
# 官方镜像安装,以 macos 为例
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip
$ unzip protoc-3.19.4-osx-x86_64.zip
$ cp bin/protoc /usr/local/bin/protoc
# 确保 include/google 放入 /usr/local/include下
$ cp -r include/google /usr/local/include/google

首先,我们需要安装使用本示例所需要的命令行代码生成工具:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
  2. 安装 cwgo:go install github.com/cloudwego/cwgo@latest
  3. 安装 thriftgo:go install github.com/cloudwego/thriftgo@latest

安装成功后,执行 cwgo --versionthriftgo --version 应该能够看到具体版本号的输出(版本号有差异,以 x.x.x 示例):

$ cwgo --version
vx.x.x

$ thriftgo --version
vx.x.x

$ protoc --version
libprotoc x.x.x

确定代码放置位置

  1. 若将代码放置于 $GOPATH/src 下,需在 $GOPATH/src 下创建额外目录,进入该目录后再获取代码:

    $ mkdir -p $(go env GOPATH)/src/github.com/cloudwego
    $ cd $(go env GOPATH)/src/github.com/cloudwego
    
  2. 若将代码放置于 GOPATH 之外,可直接获取

注意事项

cwgo 底层使用 kitexhzgen 工具,所以其相应的工具规范也需要遵守,如 kitex 的注意事项hz 的注意事项

使用

cwgo 的具体使用请参考命令行工具

下面以 thrift 为例

  1. 首先创建一个目录

    $ mkdir -p $GOPATH/src/local/cwgo_test
    $ cd $GOPATH/src/local/cwgo_test
    
  2. 创建一个 idl 目录

    $ mkdir idl
    
  3. 编写 idl/hello.thrift 文件

    # idl/hello.thrift
    namespace go hello.example
    
    struct HelloReq {
        1: string Name (api.query="name"); // 添加 api 注解为方便进行参数绑定
    }
    
    struct HelloResp {
        1: string RespBody;
    }
    
    service HelloService {
        HelloResp HelloMethod(1: HelloReq request) (api.get="/hello");
    }
    
  4. 生成项目 layout

    静态命令行

    $ cwgo server -service=a.b.c -type HTTP  -idl=idl/hello.thrift
    

    动态命令行

    动态命令行

  5. 编译运行

    $ go mod tidy && go mod verify
    $ sh build.sh && sh output/bootstrap.sh
    
  6. 发起调用

    $ curl http://127.0.0.1:8080/ping
    pong
    

恭喜你!至此你成功编写了一个 Cwgo 的服务端,并完成了一次调用!