ServiceComb/go-chassis 开发REST服务全指南

ServiceComb/go-chassis 开发REST服务全指南

go-chassis go-chassis 项目地址: https://gitcode.com/gh_mirrors/go/go-chassis

前言

ServiceComb/go-chassis是一个基于Go语言的微服务框架,它提供了完整的微服务开发能力。本文将详细介绍如何使用go-chassis开发REST风格的微服务,包括服务提供者和消费者的完整实现。

服务提供者开发

项目结构

首先创建一个标准的项目结构:

server
├── main.go
└── conf
    ├── chassis.yaml
    └── microservice.yaml

1. 定义REST处理结构体

创建一个结构体来封装HTTP处理逻辑:

type RestFulHello struct {}

func (r *RestFulHello) SayHello(b *rf.Context) {
    b.Write([]byte("获取用户ID: " + b.ReadPathParameter("userid")))
}

关键点:

  • 方法名必须大写字母开头
  • 方法参数必须是*restful.Context类型
  • 通过ReadPathParameter获取路径参数

2. 定义URL路由模式

实现URLPatterns()方法定义路由规则:

func (r *RestFulHello) URLPatterns() []rf.Route {
    return []rf.RouteSpec{
        {
            Method: http.MethodGet, 
            Path: "/sayhello/{userid}", 
            ResourceFunc: r.SayHello,
            Returns: []*rf.Returns{{Code: 200}}
        },
    }
}

路由配置说明:

  • Method: HTTP方法(GET/POST/PUT/DELETE等)
  • Path: URL路径,支持路径参数
  • ResourceFunc: 处理函数
  • Returns: 定义返回状态码

3. 配置文件设置

chassis.yaml配置服务协议和注册中心:

servicecomb:
  registry:
    address: http://127.0.0.1:30100 
  protocols:
    rest: 
      listenAddress: 127.0.0.1:5001

microservice.yaml定义服务名称:

servicecomb:
  service:
    name: RESTServer

4. 注册服务并启动

在main.go中完成初始化和启动:

func main() {
    chassis.RegisterSchema("rest", &RestFulHello{})
    
    if err := chassis.Init(); err != nil {
        openlog.Error("初始化失败: "+err.Error())
        return
    }
    chassis.Run()
}

服务消费者开发

项目结构

消费者项目结构类似:

client
├── main.go
└── conf
    ├── chassis.yaml
    └── microservice.yaml

1. 配置文件设置

chassis.yaml配置注册中心:

servicecomb:
  registry:
    address: http://127.0.0.1:30100

microservice.yaml定义消费者名称:

servicecomb:
  service:
    name: RESTClient

2. 调用服务

在main.go中实现服务调用:

func main() {
    if err := chassis.Init(); err != nil {
        openlog.Error("初始化失败: " + err.Error())
        return
    }
    
    req, err := rest.NewRequest("GET", "http://RESTServer/sayhello/world", nil)
    if err != nil {
        openlog.Error("创建请求失败")
        return
    }
    
    resp, err := core.NewRestInvoker().ContextDo(context.TODO(), req)
    if err != nil {
        openlog.Error("请求执行失败")
        return
    }
    defer resp.Body.Close()
    
    openlog.Info("服务响应: " + string(httputil.ReadBody(resp)))
}

高级路由配置

URLPatterns支持更丰富的配置:

func (d *Data) URLPatterns() []rf.Route {
    return []rf.Route{
        {
            Method: http.MethodGet,
            Path: "/price/{id}",
            ResourceFunc: d.GetPrice,
            Consumes: []string{goRestful.MIME_JSON, goRestful.MIME_XML},
            Produces: []string{goRestful.MIME_JSON},
            Returns: []*rf.Returns{
                {Code: http.StatusOK, Message: "成功", Model: Data{}}
            },
            Parameters: []*rf.Parameters{
                {"x-auth-token", "string", goRestful.HeaderParameterKind, "认证令牌"},
            },
        },
    }
}

参数类型支持:

  • PathParameterKind: 路径参数
  • QueryParameterKind: 查询参数
  • BodyParameterKind: 请求体参数
  • HeaderParameterKind: 头部参数
  • FormParameterKind: 表单参数

API文档生成

启动服务后,可以通过以下方式访问API文档:

  • 访问http://ip:port/apidocs.json获取OpenAPI格式文档
  • 将返回内容复制到Swagger Editor中查看可视化文档

配置说明

禁用自动生成schema

chassis.yaml中添加配置可禁用自动生成schema:

servicecomb:
  noRefreshSchema: true

环境变量配置

如果配置文件不在工作目录下,可通过环境变量指定:

  • CHASSIS_HOME: 配置文件父目录
  • CHASSIS_CONF_DIR: 配置文件目录

总结

本文详细介绍了使用ServiceComb/go-chassis开发REST服务的完整流程,包括服务提供者和消费者的实现、路由配置、API文档生成等关键内容。通过go-chassis,开发者可以快速构建高性能的微服务应用,并享受框架提供的服务注册、发现等微服务核心能力。

go-chassis go-chassis 项目地址: https://gitcode.com/gh_mirrors/go/go-chassis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

基于51单片机仿真设计的零基础DIY制作表白利器—8x8LED矩阵显示(仿真电路+程序) 小圈圈、小爱心、囧字脸……只要是你想得到的,表情矩阵都能摆给你看,是不是很Cool呢~如果你不幸见到心仪的女孩就舌头打结,不妨考虑这个哦~ 现在很流行汽车表情仪(16×16的LED阵列),淘宝上,固定几个表情的(非阵列)要150左右,可以自定义表情的,16×16的要200多小300块。感觉自己DIY一个成本很低,于是先做一个8×8的表情矩阵,汽车上装着太小了,可以放在上班时候的工位上。哈哈哈。一般控制LED阵列的话,每一片8×8的阵列,使用一片max7219(约5元1片,美信公司的芯片都是很贵的)矩阵控制,或者使用两片 74HC595锁存器(约0.5元1片)。我买好了两片74HC595,不过想到一片8×8的阵列理论上应该可以直接使用一个89c51来控制(89c51有32个数据脚,arduino脚不够),仿真实验成功,省下了1块钱(2片595),哈哈。下面是成品图及我录的视频,我自己画了6个图切换。你发挥想象,可以做出更多的图来。我断断续续地在2天时间里抽时间把它做出来的(仿真实验和原理图我在N天前就已经做好了。本次DIY手工实际估算花费焊接40分钟,调试1小时)。 1 工具和材料 ○ 8x8 LED阵列,淘宝购得,单价4.7元(后来在diytrade.com上发现,一次性买32片的话,只需要0.7元一片); ○ STC89C52RC单片机一片, 淘宝购得,单价3.7元; ○ 51最小系统板一个,淘宝购得,单价3.9(此为亏本赚信用价,现在卖家已经涨价到9.9元。另有5.8元价格的,小一些,没有串口和 232芯片,做工也差一个级别。不如买9.9元的系统划算。); ○ 洞洞板一片,淘宝购得,单价0.4元; ○ 点触开关一个,淘宝购得价格0.4元(一定要买带盖子的,手感要好很多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛言广Red-Haired

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值