项目简介
PsyWeb 是基于 Go 语言的微服务框架,仿照极客兔兔的 geeweb、geeorm 和 geerpc 实现。该框架涵盖 Web、ORM 和 RPC 三大模块,内置丰富工具类库,封装了 Go 语言标准库,还具备高性能协程池、日志记录、错误处理、JWT 认证等功能,为开发者提供完整的微服务解决方案,助力快速构建高效、可靠的微服务应用。
项目的主要特性和功能
Web 框架部分
- 路由管理:用前缀树算法存储路由节点,支持路由分组控制。
- 中间件支持:可自定义中间件,实现静态资源服务,支持多种数据格式返回。
- 参数处理:利用反射和验证器验证 POST 参数合法性。
- 日志记录:有分级日志记录工具,支持日志输出到文件。
- 错误处理:提供错误记录工具和对外开放的错误处理接口。
- 协程池:参考 ants 提供高性能协程池管理工具。
- HTTPS 支持:支持 HTTPS,有基于 Basic 和 JWT 的 Token 认证工具。
ORM 框架部分
- 数据库支持:封装
database/sql
标准库,支持 MySQL 连接,用接口隔离不同数据库差异。 - CRUD 操作:通过反射将结构体映射为数据库表,提供链式操作的 CRUD 接口。
- 钩子机制:支持在 CRUD 操作前后调用钩子函数。
- 事务支持:封装事务,支持自定义回调函数实现原子操作。
- 自动迁移:支持数据库表字段的自动迁移。
RPC 框架部分
- 消息编解码:使用
encoding/gob
实现消息的序列化与反序列化。 - 高性能客户端和服务端:支持异步和并发,有连接超时和服务端处理超时机制。
- 负载均衡:通过随机选择和 Round Robin 轮询调度算法实现。
- 服务注册与发现:有简易注册中心,支持服务注册和心跳检测,客户端可基于此实现服务发现。
- 服务容错:有限流和熔断机制,用 Jaeger 进行单节点链路追踪。
安装使用步骤
1. 安装依赖
- 确保已安装 Go 1.21 或更高版本。
- 安装 Jaeger v2.30.0 或更高版本用于链路追踪。
2. 安装 PsyWeb
使用 Go module 支持(Go 1.11+),在项目中引入 PsyWeb 包,然后运行以下命令自动导入依赖:
bash
go mod tidy
3. 使用示例
Web 框架部分
```go package main
import ( "net/http" "psygo" )
func main() { r := psygo.Default() r.GET("/hello", func(c *psygo.Context) { c.String(http.StatusOK, "Hello, PsyWeb!") }) r.Run(":9999") } ```
ORM 框架部分
使用前确保本地已开启 MySQL 服务。 ```go package main
import ( "log" "psyorm" )
type User struct { Name string Age int }
func main() { engine, _ := psyorm.NewEngine("mysql", "root:password@tcp(127.0.0.1:3306)/test") defer engine.Close()
s := engine.NewSession()
_ = s.Model(&User{}).DropTable()
_ = s.Model(&User{}).CreateTable()
_, err := s.Insert(&User{"Tom", 18}, &User{"Sam", 25})
if err != nil {
log.Fatal(err)
}
} ```
RPC 框架部分
服务端: ```go package main
import ( "net" "rpc" "service" )
type GoodsService struct{}
func (g GoodsService) Sum(args service.Args, reply int) error { reply = args.Price1 + args.Price2 return nil }
func main() { l, _ := net.Listen("tcp", ":9999") server := rpc.NewServer() _ = server.Register(&GoodsService{}) server.Accept(l) } ```
客户端: ```go package main
import ( "log" "rpc" "service" )
func main() { client, _ := rpc.Dial("tcp", "localhost:9999") var reply int err := client.Call("GoodsService.Sum", &service.Args{Price1: 10, Price2: 20}, &reply) if err != nil { log.Fatal(err) } log.Printf("Sum: %d", reply) } ```
注意事项
- 使用 RPC 框架时,确保服务端和客户端的编解码器一致。
- 使用 Jaeger 进行链路追踪时,确保 Jaeger 服务已启动并配置正确。
- 在分布式系统中,合理配置负载均衡和熔断机制,以提高系统的稳定性和容错性。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】