XGoServer 一个基础性、模块完整且安全可靠的服务端框架

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 作者:林冠宏 / 指尖下的幽灵掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8博客:http://www.cnblogs.com/linguanh/GitHub : https://github.

作者:林冠宏 / 指尖下的幽灵

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities


一个基础性、模块完整且安全可靠的服务端框架

开源地址:https://github.com/af913337456/XGoServer

第一版介绍文章:基于 xorm 的服务端框架 XGoServer


新添加模块

  • 自定义路由接口
  • Token模块,jwt
  • 加解密模块,cipher-AES,可自行拓展其他
  • 各模块对应的单元测试例子

共具备的

  • 自定义路由接口
  • Token模块,jwt
  • 加解密模块,cipher-AES,可自行拓展其他
  • 日志模块,alecthomas/log4go
  • 路由模块,gorilla/mux
  • 硬存储 / 软存储 采用 xorm 框架
  • 服务端通用的输出数据结构的整合,例如 json
  • 各模块对应的单元测试例子

自定义路由接口

requireToken 标识该路由是否需要 token 验证

TokenData 是我们要组合到 token 里面的数据结构 struct

type Context struct {
    TokenData TokenData
    TokenStr  string    `json:"tokenStr"`
    IpAddress string    `json:"ipAddress"`  // client 的 ip
    RoutePath string    `json:"routePath"`
}
type XHandler struct {
    handleFunc   func(*Context, http.ResponseWriter, *http.Request)
    requireToken bool
}
func (x XHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)  {
    tokenStr := r.Header.Get(TokenAuth)
    c := &Context{}
    c.IpAddress = util.GetIpAddress(r)
    c.RoutePath = r.URL.Path
    if x.requireToken {
        tokenData,err := ParseToken(tokenStr) // 使用 token 模块进行解析
        if err != nil {
            util.RenderJson(w,util.GetCommonErr(err.Error()))
            return
        }
        c.TokenData = *tokenData
        c.TokenStr  = tokenStr
        // util.RenderJson(w,c)
        x.handleFunc(c,w,r)
        return
    }
    // 不需要 token
    util.LogInterface(c)
    x.handleFunc(c,w,r)
}

用法

  • router.Handle("/get1",core.ApiNormalHandler(getToken)).Methods("GET")
  • router.Handle("/get2",core.ApiRequestTokenHandler(handleToken)).Methods("GET")
  • 搭配使用:
router.Handle("/getToken",core.ApiNormalHandler(getToken)).Methods("GET")
router.Handle("/handleToken",core.ApiRequestTokenHandler(handleToken)).Methods("GET")
router.HandleFunc("/enc",encOutput).Methods("GET")
router.HandleFunc("/dec",decOutput).Methods("POST")

例子集合

  • 直接输出一条 json 给客户端
  • 登陆成功生成 token 返回
  • 直接输出解析后的 Context
  • 加密输出
  • 与数据库交互 ----- important

直接输出一条 json 给客户端

func main()  {
    router := new (mux.Router)
    router.HandleFunc("/",test2).Methods("GET")
    core.HttpListen(router)
}
func test2(w http.ResponseWriter,r *http.Request)  {
    // 非常简单的例子, 操作放在内部 , 可以使用 request 来获取自己的参数,再直接组织输出
    core.HandlerMapWithOutputJson(w, func() map[string]interface{} {
        m :=  map[string]interface{}{}
        m["msg"] = "blow me a kiss"
        return m
    })
}
// 结果 : {"msg":"blow me a kiss"}

登陆成功生成 token 返回

token 是具备过期时间的,皆可自定义

func getToken(c *core.Context, w http.ResponseWriter, r *http.Request)  {
    core.HandlerMapWithOutputJson(w, func() map[string]interface{} {
        tokenStr,err := core.BuildDefaultToken(func(tokenData *core.TokenData) {
            tokenData.UserId = "123456"  // 用户 id
            tokenData.Roles  = "normal"  // 用户角色
        })
        if err != nil {
            return util.GetCommonErr(err.Error())
        }
        return util.GetCommonSuccess(tokenStr)
    })
}
结果:
{
    "msg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDU2Iiwicm9sZXMiOiJub3JtYWwiLCJwcm9wcyI6bnVsbCwiZXhwIjoxNTE5MDA2Njg4LCJpYXQiOjE1MTkwMDY2Mjh9.NsBsQ3xpOJNZUXO5Dc-Yk4p4m6p4EeDWgEfc5BaNKd4",
    "ret": "success"
}

直接输出解析后的 Context

tokenStr 是 Context 一变量

handleToken 方法对于的是 ApiRequestTokenHandler

func handleToken(c *core.Context, w http.ResponseWriter, r *http.Request)  {
    util.RenderJson(w,context)
}

输出加密的数据

tokenStr 是 Context 一变量

handleToken 方法对于的是 ApiRequestTokenHandler

type IEncrypt interface {
    AesEncrypt(origData, key []byte) ([]byte, error)   // 加密
    AesDecrypt(encrypted, key []byte) ([]byte, error)  // 解密
}
// 加密输出
func encOutput(w http.ResponseWriter, r *http.Request)  {
    core.HandlerMapWithOutputJson(w, func() map[string]interface{} {
        d := "狗年平安"
        aes := encrypt.DefaultAES{}
        return util.GetCommonSuccess(aes.AesEncryptStr(d))
    })
}
输出:
{
    "msg": "\ufffd\u0002\ufffd\u001eu\ufffd\u001c\ufffd\u0013m\ufffdM\\\ufffd\ufffd\u0011",
    "ret": "success"
}

与数据库交互

func test3(w http.ResponseWriter,r *http.Request)  {
    core.HandlerMapWithOutputJson(w, func() map[string]interface{} {
        // 插入一条评论
        item := &model.Comment{
            Id  :util.NewId(),         // 评论 id
            UserId  :"123456",             // 评论人 id
            Name    :"LinGuanHong",        // 评论人名称
            Content :"hello word",         // 评论内容
        }
        affect,_ := core.Engine.Insert(item)  // 执行插入,传入 struct 引用
        m :=  map[string]interface{}{}
        if affect > 0 {
            m["ret"] = "insert success"
            comments := make([]model.Comment, 0)
            core.Engine.Find(&comments)   // select 出来,获取所有评论输出
            m["msg"] = comments
        }else{
            m["ret"] = "insert failed"
        }
        return m
    })
}

输出的结果是:
{
  "msg": [
    {
      "id": "1kubpgh9pprrucy11e456fyytw",
      "UserId": "123456",
      "name": "LinGuanHong",
      "content": "hello word"
    }
  ],
  "ret": "insert success"
}

上述的功能结合使用,便可做到牢固的安全性。此外,可以再结合 https 级别的路由使用。

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
目录
相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
143 3
|
2月前
|
监控 关系型数据库 Serverless
探索后端技术:构建高效、可靠的服务器端应用
本文将深入探讨后端开发的核心概念和关键技术,从服务器架构到数据库管理,再到安全防护,为读者提供全面的后端技术指南。无论是初学者还是经验丰富的开发者,都能从中汲取灵感,提升自己的技术水平。
|
22天前
|
存储 安全 区块链
《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
C++智能合约在区块链技术中扮演关键角色,其与区块链底层的交互是实现去中心化应用的核心。本文介绍了区块链底层的关键要素,如分布式账本、共识机制等,并详细阐述了C++智能合约从部署到运行过程中如何与这些要素交互,强调了数据读写、加密验证、网络感知、性能优化及安全保障等方面的重要性,旨在帮助开发者构建高效、安全的去中心化应用。
|
2月前
|
JavaScript Java API
探索后端技术:构建高效、可靠的服务端应用
本文将深入探讨后端开发的关键概念和技巧,旨在帮助读者理解如何构建高效、可靠的服务端应用。通过阐述常见的后端技术和框架,以及实际应用中的注意事项,我们将一步步揭示后端开发的精髓,助力你在技术领域迈向新的高度。
|
3月前
|
安全 关系型数据库 API
深入理解后端技术:构建高效、可靠的服务器端应用
本文将深入探讨后端技术的核心概念和最佳实践,包括服务器端编程、数据库管理、API设计与开发等方面。我们将从基础开始,逐步深入,帮助读者建立起对后端开发的全面理解,从而能够独立构建高效、可靠的服务器端应用。
106 0
|
4月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
66 0
|
4月前
|
Java Spring 开发者
掌握Spring事务管理,打造无缝数据交互——实用技巧大公开!
【8月更文挑战第31天】在企业应用开发中,确保数据一致性和完整性至关重要。Spring框架提供了强大的事务管理机制,包括`@Transactional`注解和编程式事务管理,简化了事务处理。本文深入探讨Spring事务管理的基础知识与高级技巧,涵盖隔离级别、传播行为、超时时间等设置,并介绍如何使用`TransactionTemplate`和`PlatformTransactionManager`进行编程式事务管理。通过合理设计事务范围和选择合适的隔离级别,可以显著提高应用的稳定性和性能。掌握这些技巧,有助于开发者更好地应对复杂业务需求,提升应用质量和可靠性。
49 0
|
5月前
|
运维 架构师 测试技术
建立互联网可靠性工程体系框架的思路
【7月更文挑战第13天】构建互联网SRE的可靠性工程框架探讨了如何将传统软件可靠性工程应用于互联网场景。
|
7月前
|
缓存 网络协议 数据库连接
【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点
【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点
96 0
|
安全 API 数据处理
API接口技术:架构、设计、安全性与实践
随着数字化和信息化进程的加速,应用程序接口(API)在软件开发和数据处理中扮演着越来越重要的角色。API不仅是不同软件应用程序之间的桥梁,也是软件开发人员和数据科学家进行数据交换和功能调用的关键工具。本文将深入探讨API接口的技术,包括架构、设计、安全性以及实践应用。