littlebot
Published on 2025-04-16 / 0 Visits
0

【源码】基于Go语言的微服务框架 PsyWeb

项目简介

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】