Gin 框架: RPC 错误码设计-阿里云开发者社区

开发者社区> 尹东勋> 正文

Gin 框架: RPC 错误码设计

简介: 本文通过一个完整的例子,介绍如何在 Gin 框架下设计合理的 API 错误码。 我们将会使用 rk-boot 来启动 Gin 基于框架的微服务。
+关注继续查看

介绍

本文通过一个完整的例子,介绍如何在 Gin 框架下设计合理的 API 错误码。

我们将会使用 rk-boot 来启动 Gin 基于框架的微服务。

请访问如下地址获取完整教程:

考虑范围

一个合理的 RPC 错误,需要考虑如下几个方面。

  • 包含错误码,错误信息
  • 错误信息可扩展
  • 考虑可读性
  • 可解析性,即,用户可通过代码解析错误码,并采取有效行为
  • 避免内部错误益处,例如,Nil point error

错误码结构

{
    "error":{
        "code":500,
        "status":"Internal Server Error",
        "message":"Panic manually!",
        "details":[]
    }
}

安装

go get github.com/rookie-ninja/rk-boot

快速开始

通过 rk-boot ,用户可以轻松搭建 Gin 框架微服务,rk-boot 集成了 Panic 捕捉以及标准错误类型。

完整例子

1.创建 boot.yaml

boot.yaml 文件描述了 Gin 框架启动的原信息,rk-boot 通过读取 boot.yaml 来启动 Gin。

---
gin:
  - name: greeter
    port: 8080
    enabled: true

2.创建 main.go

让 /v1/greeter 返回一个错误。

// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

import (
    "context"
    "github.com/gin-gonic/gin"
    "github.com/rookie-ninja/rk-boot"
    "net/http"
)

// @title RK Swagger for Gin
// @version 1.0
// @description This is a greeter service with rk-boot.

// Application entrance.
func main() {
    // Create a new boot instance.
    boot := rkboot.NewBoot()

    // Register handler
    boot.GetGinEntry("greeter").Router.GET("/v1/greeter", Greeter)

    // Bootstrap
    boot.Bootstrap(context.Background())

    // Wait for shutdown sig
    boot.WaitForShutdownSig(context.Background())
}

// @Summary Greeter service
// @Id 1
// @version 1.0
// @produce application/json
// @Param name query string true "Input name"
// @Success 200 {object} GreeterResponse
// @Router /v1/greeter [get]
func Greeter(ctx *gin.Context) {
    err := rkerror.New(
        rkerror.WithHttpCode(http.StatusAlreadyReported),
        rkerror.WithMessage("Trigger manually!"),
        rkerror.WithDetails("This is detail.", false, -1, 0.1))

    ctx.JSON(http.StatusAlreadyReported, err)
}

// Response.
type GreeterResponse struct {
    Message string
}

3.启动 main.go

$ go run main.go

4.验证

$ curl "localhost:8080/v1/greeter?name=rk-dev"
{
    "error":{
        "code":208,
        "status":"Already Reported",
        "message":"Trigger manually!",
        "details":[
            "This is detail.",
            false,
            -1,
            0.1
        ]
    }
}

捕获 Panic(系统崩溃)

我们还是以 demo 代码为例子。

在 RPC 实现中,我们试着让系统崩溃,看看 rk-boot 会如何自动捕获,并且返回何种信息给用户。

1.修改 main.go

// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

import (
    "context"
    "github.com/gin-gonic/gin"
    "github.com/rookie-ninja/rk-boot"
)

// @title RK Swagger for Gin
// @version 1.0
// @description This is a greeter service with rk-boot.

// Application entrance.
func main() {
    // Create a new boot instance.
    boot := rkboot.NewBoot()

    // Register handler
    boot.GetGinEntry("greeter").Router.GET("/v1/greeter", Greeter)

    // Bootstrap
    boot.Bootstrap(context.Background())

    // Wait for shutdown sig
    boot.WaitForShutdownSig(context.Background())
}

// @Summary Greeter service
// @Id 1
// @version 1.0
// @produce application/json
// @Param name query string true "Input name"
// @Success 200 {object} GreeterResponse
// @Router /v1/greeter [get]
func Greeter(ctx *gin.Context) {
    panic("Panic manually!")
}

2.验证

$ curl "localhost:8080/v1/greeter?name=rk-dev"
{
    "error":{
        "code":500,
        "status":"Internal Server Error",
        "message":"Panic manually!",
        "details":[

        ]
    }
}

源代码

rk-boot 里对于错误的处理,实现于 rk-common/error 中。

更多例子

请参考:rk-demo 获取更多例子。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Error Handling 错误处理
很多操作符可用于对Observable发射的onError通知做出响应或者从错误中恢复,例如,你可以: 吞掉这个错误,切换到一个备用的Observable继续发射数据 吞掉这个错误然后发射默认值 吞掉这个错误并立即尝试重启...
609 0
函数设计之美--函数需要返回错误码吗(一)?
很久以前我就考虑这样一个问题:有这样一个函数,它的功能是从一个整数集合中返回最大的那个数,如何设计这个函数的签名了?当时没有得出令自己满意的答案,所以就搁浅了。今天重新思考,终于有所悟!现在把我思索的整个过程展现于此。
597 0
未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib 错误的解决办法
VS2010有时候莫名出现下面问题: 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib 错误 相关的工程出现这个问题,可能是使用同步盘同步的引起的。
2257 0
Data Migration 错误说明
本文介绍了 Data Migration (DM) 的错误系统,以及各种错误信息的详细含义。 DM 错误系统 DM 1.0.0-GA 版本中引入了新的错误系统。该系统: 增加了错误码机制。 增加了 class、scope、level 等错误信息。 优化了错误描述内容、错误调用链信息和调用堆栈信息。 错误系统的详细设计和实现,可参阅 RFC 文档: Proposal: Improve Error System。 错误信息示例 以下是 DM 实际输出的一条错误信息。本文根据这条信息,对各个字段作详细说明。 [code=38008:class=dm-master:scope=internal
14 0
nginx File not found 错误
使用php-fpm解析PHP,"No input file specified","File not found"是常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。
2258 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4350 0
美丽的错误:26个创意的404错误页面制作示例
  404错误并不常见,也因此很容易被忽略,但事实上用户在浏览页面的时候碰到404错误是会非常沮丧的,严重影响用户浏览内容的积极性。因此,很多网站都会设计一个新颖的错误页面,以吸引用户继续浏览网站中的其它内容。
644 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
370 0
+关注
尹东勋
点目科技创始人
60
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载