美文网首页
go-zero 快速上手

go-zero 快速上手

作者: daydaygo | 来源:发表于2020-12-30 18:05 被阅读0次

    官网文档 其实说得很详细, 作为一个写几年代码, 但是接手 go 项目不久的 go 新手, 来聊聊我跑 demo 遇到的问题

    • 解决环境问题一: etcd, mysql, redis
    • 解决环境问题二: go mod
    • 编码中遇到的配置问题
    • 加速开发的一些工具
      • goland 配置 run/debug
      • http client 插件: 编码化实现 api test
      • goreman 轻松管理多服务

    环境准备一: 安装etcd, mysql, redis

    官网就一句话, 至于背后要怎么折腾, 就看开发者自己了, 当然目前最简单最推荐的方式 -- docker, 直接使用 docker-composer 启动

    version: '3.1'
    services:
      mysql:
        image: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      redis:
        image: redis:alpine
        volumes:
          - ./config/redis.conf:/etc/redis/redis.conf
          - ./data/redis:/data
        ports:
          - "6379:6379"
      etcd:
        image: quay.io/coreos/etcd
        environment: 
          ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
          ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
          ETCDCTL_API: "3"
        ports: 
          - 2379:2379 # http
    

    启动的话也超级简单, 就一行:

    docker-compose up -d
    

    启动好了后一定要 check, 避免环境的问题一直遗留到代码才发现

    # redis-client
    brew install redis
    redis-cli -h localhost
    
    # mysql-client
    brew install mycli # mycli 和 mysql 兼容, 会有代码提示, 推荐
    mysql -hlocalhost -uroot -proot
    
    # etcd-client
    brew install etcd
    etcdctl --endpoints <url> # 后面接相应的命令
    member list # 查看 etcd server
    put foo bar
    get foo
    del foo
    

    PS: 建议做笔记, 这种入门级的内容往往最常用, 但是一段时间不接触, 又最容易遗忘, 比如 etcdctl, 不翻笔记真不记得

    当然, 直接使用 docker 也行, docker-compose 只是 docker run 的 trick:

    # 最近切换到了 podman, 感兴趣可以看文后的连接, 有 podman 快速上手
    alias docker=podman
    podman run -d -p6379:6379 redis:alpine
    podman run -d -p3306:3306 -e TZ='Asia/Shanghai' -e MYSQL_ROOT_PASSWORD=root mysql
    podman run -d -p2379:2379 -e ETCD_ADVERTISE_CLIENT_URLS='http://0.0.0.0:2379' -e ETCD_LISTEN_CLIENT_URLS='http://0.0.0.0:2379' -e ETCDCTL_API='3' quay.io/coreos/etcd
    

    环境准备二: go mod

    接触 go 比较早但是一直不深, 就会对 go 的环境停留在似懂非懂的状态, 然后经常遇到一些奇奇怪怪的问题, 这里简单总结了下 go 项目使用 go mod:

    go mod init xxx # 初始化, 后续在项目执行 go run/build 就都会使用到 go mod
    go mod vendor # copy 依赖到项目下的 vendor 目录, 方便 IDE 代码提示
    go env -w GOPROXY=https://goproxy.cn/,direct # 设置代理, 这样 go mod 下载包才快
    export GOPROXY=https://goproxy.cn/,direct # 也可以设置到环境变量里
    go env # 检查 go env
    
    # 下面的 env 可设可不设
    GO111MODULE="on" # 现在默认是 auto, 后续默认是 on, 有 go.mod 的项目下执行 go 命令, 都会是 go mod 模式下
    GOFLAGS="-mod=vendor" # 默认值, 配合 go mod vendor 使用
    

    有了这些后, 基本就能无障碍跑官方 demo 了, enjoy

    编码中遇到的配置问题

    add.yaml 为例:

    # go 中 mysql dsn 的示例: user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
    DataSource: root:root@tcp(localhost:3306)/gozero # 这里需要加上 pass 部分
    Table: book
    Cache:
      - Host: localhost:6379
        Pass: "123" # 需要注意, yaml 中会自动识别 int/string 类型, 这里 Pass 需要使用 string 类型, 需要加 "" 指定
    

    这里遇到的几个问题:

    • 需要熟悉 go 中 dsn 的配置, go-zero 中的配置 DataSource 其实是复用
    • 配置的问题还不够完善, 需要有一定的源码阅读能力, yaml 文件会初始化到 config.go 中, 配置项和里面的 struct 可以对应起来
    • yaml 中数据类型自动识别的小细节, 详情见上面的注释

    加速开发的一些工具

    goland 配置 run/debug

    以 api gateway 为例, 要运行, 在 api 目录下执行 go run 即可:

    go run bookstore.go -f etc/bookstore-api.yaml # -f 可以不加, bookstore.go 有设置默认值
    

    可以在 goland 中轻松配置 run/debug:

    • menu > run > edit configurations...
    • 使用 template 中的 go build 模板, 改一下项目执行的目录即可
    goland 配置 run/debug
    • 配置好后, 可以直接使用 ⌃R 运行 ⌃D debug

    详细文档: goland > run/debug

    http client 插件: 编码化实现 api test

    通常进行 api test 有 2 种方式:

    • 简单情况下, 直接使用 curl 测试, 比如 curl -i baidu.com
    • 复杂情况下, 使用图形化工具, 比如 postman 等

    但是这些方案, 都在 编码性 方面很一般, 如果不能编码, 复用和修改 能力都大打折扣

    所以我推荐:

    2 者基本大同小异, 以 demo 中的 api 为例:

    ###
    http://localhost:8888/check?book=go-zero
    
    ###
    http://localhost:8888/add?book=go-zero&price=10
    
    • ### 表示一个 api case
    • coding 过程中会有代码提示, 自动处理 http 相关的细节
    • 执行(run) 非常简单, 图形界面/快捷键 都有支持

    运行的结果如下, 轻松查看请求细节:

    GET http://localhost:8888/check?book=go-zero
    
    HTTP/1.1 200 OK
    Content-Type: application/json
    Date: Wed, 30 Dec 2020 05:53:47 GMT
    Content-Length: 25
    
    {
      "found": true,
      "price": 10
    }
    
    Response code: 200 (OK); Time: 49ms; Content length: 25 bytes
    

    goreman 轻松管理多服务

    拿 demo 举例, 有 api add check 3 个服务, 要同时运行 3 个服务才能体验完整流程, 在 goreman 下可以这样做:

    • 安装 goreman
    brew install goreman
    
    • 编写 Procfile 文件
    # 定义好每个服务
    api: cd api; go run bookstore.go
    add: cd rpc/add; go run add.go
    check: cd rpc/check; go run check.go
    
    • run
    goreman start add check api
    

    写在最后

    当然要秀一下 QPS 啦: Requests/sec: 44110.50

    ➜  bookstore wrk -t10 -c1000 -d40s --latency 'http://localhost:8888/check?book=go-zero'
    Running 40s test @ http://localhost:8888/check?book=go-zero
      10 threads and 1000 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    19.91ms    9.06ms 103.27ms   63.78%
        Req/Sec     4.44k   575.52     5.57k    80.67%
      Latency Distribution
         50%   20.29ms
         75%   26.22ms
         90%   31.21ms
         99%   42.30ms
      1766254 requests in 40.04s, 224.03MB read
      Socket errors: connect 0, read 1062, write 0, timeout 0
    Requests/sec:  44110.50
    Transfer/sec:      5.59MB
    

    附本机配置:

    本机黑苹果配置

    相关文章

      网友评论

          本文标题:go-zero 快速上手

          本文链接:https://www.haomeiwen.com/subject/jgnhoktx.html