基于 xorm 的服务端框架 XGoServer
时间:2022-04-28
本文章向大家介绍基于 xorm 的服务端框架 XGoServer,主要内容包括你可以使用它、具备的、使用流程、从一个最基础的例子开始:、多路 gorutine 设计,增加并发性能、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
作者:林冠宏 / 指尖下的幽灵
掘金: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
你可以使用它
- 简单快速搭建自己的服务端
- 高级模块拓展,例如 jwt,token模块。数据加密传输等
具备的
- 日志模块,
alecthomas/log4go
- 路由模块,
gorilla/mux
- 硬存储 / 软存储 采用
xorm
框架 - 多路 gorutine 设计,增加并发性能
- 服务端通用的输出数据结构的整合,例如 json
如果你想直接输出一条 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"}
与数据库交互
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"
}
使用流程
目录如下
---- config
---- core
---- model
---- threeLibs
---- util
---- server.go
1 在 config
放置配置文件
-
服务端配置 json 文件
-- server.json, -
日志配置文件
-- log.json 例如下面的,他们都会在运行程序后会自动解析和读取
2 threeLibs
目录放置了依赖的第三方库,例如 xorm,不需要你再去 go get
3 model
放置数据实体 struct
{
"Host": "127.0.0.1",
"Port": ":8884",
"FilePort":":8885",
"DbName":"lgh",
"DbUser":"root",
"DbPw":"123456",
"DbPort":"3306"
}
{
"EnableConsole": true,
"ConsoleLevel": "DEBUG",
"EnableFile": true,
"FileLevel": "INFO",
"FileFormat": "",
"FileLocation": ""
}
从一个最基础的例子开始:
func main() {
router := new (mux.Router)
router.HandleFunc("/",test).Methods("GET")
/** 在下面添加你的路由 */
/** add your routine func below */
core.HttpListen(router) // 简单的 http 监听,当然也提供了 https
}
func test(w http.ResponseWriter,r *http.Request) {
fmt.Fprintf(w,"======= hello world! =======")
}
// http 监听
func HttpListen(router *mux.Router) {
SimpleInit() // 此处自动初始化 ---------- ①
url := config.ServerConfig.Host+config.ServerConfig.Port
util.LogInfo("服务启动于 : "+url)
err := http.ListenAndServe(url,router)
if err !=nil {
util.LogInfo("http error ===> : "+err.Error())
return
}
}
// 绑定配置 json 的信息 以及 初始化 xorm mysql数据库引擎
func SimpleInit() bool {
if config.BindServerConfig() {
fmt.Println("BindServerConfig ==================> success")
config.ConfigureLog(&config.LogConfig)
CreateDefaultMysqlEngine(
"mysql",
config.ServerConfig.DbUser,
config.ServerConfig.DbPw,
config.ServerConfig.DbName)
return true
}else{
fmt.Println("BindServerConfig ===> failed")
return false
}
}
多路 gorutine 设计,增加并发性能
type FinalResult struct {
Data interface{}
}
type RetChannel chan FinalResult
func HandlerStruct(handle func() interface{}) *interface{} {
RetChannel := make(RetChannel, 1)
go func() {
result := FinalResult{}
data := handle()
result.Data = &data
RetChannel <- result
close(RetChannel)
}()
ret := <-RetChannel
return ret.Data.(*interface{})
}
func HandlerMap(handle func() map[string]interface{}) *map[string]interface{} {
RetChannel := make(RetChannel, 1)
go func() {
result := FinalResult{}
data := handle()
result.Data = &data
RetChannel <- result
close(RetChannel)
}()
ret := <-RetChannel
return ret.Data.(*map[string]interface{})
}
func HandlerStructWithOutputJson(w http.ResponseWriter,handle func() interface{}) {
RetChannel := make(RetChannel, 1)
go func() {
result := FinalResult{}
data := handle()
result.Data = &data
RetChannel <- result
close(RetChannel)
}()
ret := <-RetChannel
mapRet := ret.Data.(*interface{})
util.RenderJson(w,mapRet)
}
func HandlerMapWithOutputJson(w http.ResponseWriter,handle func() map[string]interface{}){
RetChannel := make(RetChannel, 1)
go func() {
result := FinalResult{}
data := handle()
result.Data = &data
RetChannel <- result
close(RetChannel)
}()
ret := <-RetChannel
mapRet := ret.Data.(*map[string]interface{})
util.RenderJson(w,mapRet)
}
就介绍这么多了
- Java Web中JSP的include 指令知识点总结——每日一语法学习
- Java反序列化漏洞从理解到实践
- ORM查询语言(OQL)简介--高级篇(续):庐山真貌
- Java中使用Hibernate系列之映射关联启动工作学习(第五节)
- Java中使用Hibernate系列之单向Set-based的关联学习(第四节)
- Java中使用Hibernate系列之加载并存储对象学习(第三节)
- Java中使用Hibernate系列之启动方法学习(第二节)
- Java中使用Hibernate系列之映射文件学习(第一节)
- Java中为图片添加水印效果的方法——实例代码
- Java中使用Hibernate系列之过滤器(filters)学习
- Node.js中的内存泄漏分析
- Java实现把整数转换为英语单词的方法,实用代码
- Chrome XSS审计之SVG标签绕过
- Java实现的一个简单计算器,有字符分析功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go 语言学习之变量
- Go 泛型的括号选择:[ ] or ( )?
- 如何使用GitLab CI/CD 触发多项目管道
- 使用docker数据卷持久化容器数据
- 面向初学者的Docker快速入门指南
- TypeScript:React、拖拽、实践!
- 太慢不能忍!CPU又拿硬盘和网卡开刀了!
- 懂了!VMware/KVM/Docker原来是这么回事儿
- CPU明明8个核,网卡为啥拼命折腾一号核?
- 2020-07-22-腾讯云-slb-kubeadm高可用集群搭建
- 2020-07-23-kubernetes集群使用腾讯云cbs块存储
- 十一、详解面向对象
- 十二、面向对象实战之封装拖拽对象
- 数组reduce方法的高级用法
- 十七、详解 ES6 Modules