这个项目到了今天和文章中的内容有较大差异,由于作者在23年中就开始了实习,没有太多时间维护该项目,所以一直没太关心和更新。这个项目我准备作为毕业论文的项目 到时应该会更新到3.0版本,也是我理想中的项目,敬请期待。
写在2024.5.28
FreeCar
FreeCar 是一个基于 Hertz 与 Kitex 的全栈微服务项目,欢迎 Star。
项目地址:CyanAsterisk/FreeCar
Hertz
Hertz 是一个超大规模的企业级微服务 HTTP 框架,具有高易用性、易扩展、低时延等特点。
Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景中,相较于 go net,Hertz 在 QPS、时延上均具有一定优势。
在内部实践中,某些典型服务,如框架占比较高的服务、网关等服务,迁移 Hertz 后相比 Gin 框架,资源使用显著减少,CPU 使用率随流量大小降低 30%—60% 。
关于 Hertz 更多的信息可移步至 cloudwego/hertz
技术栈
功能 | 实现 |
---|---|
HTTP 框架 | Hertz |
RPC 框架 | Kitex |
数据库 | MongoDB、MySQL |
配置中心 | Nacos |
服务发现中心 | Nacos |
消息队列 | RabbitMQ |
链路追踪 | Jaeger |
集群监控 | Prometheus |
限流中间件 | hertz-contrib/limiter |
部署 | docker-compose |
对象存储 | 腾讯云 COS |
CI | GitHub Actions |
项目架构
调用关系
技术架构
服务关系
页面展示
目录介绍
目录 | 介绍 |
---|---|
Server | 项目核心部分 |
Shared | 可复用代码 |
Static | 微信小程序代码 |
服务介绍
目录 | 介绍 |
---|---|
API | 基于 Hertz 的网关服务 |
Auth | 用户认证服务 |
Blob | 与图片和腾讯云 COS 相关的服务 |
Car | 汽车服务 |
Profile | 主页与图片识别服务 |
Trip | 行程服务 |
快速开始
启动基础环境
make start
配置 Nacos
在浏览器上访问
http://127.0.0.1:8848/nacos/index.html#/login
进行登录。默认命名空间以及配置组等请参考各个
config.yaml
配置文件。
关于配置中心的详细配置,详见。
生成数据表
make migrate
启动 HTTP 服务
make api
启动微服务
make auth
make blob
make car
make profile
make trip
Jaeger
在浏览器上访问
http://127.0.0.1:16686/
Prometheus
在浏览器上访问
http://127.0.0.1:3000/
API 请求
项目的 API 请求示例详见。
开发指南
通过直接阅读源码来了解此项目是非常困难的,在此提供开发指南方便开发者快速了解并上手此项目包括 Kitex、Hertz 等框架。
前置准备
通过快速开始中的命令快速启动所需的工具与环境,若需要特殊定制请修改 docker-compose.yaml
与 Nacos 配置中的内容。
IDL
在开发之前我们需要定义好 IDL 文件,其中 hz 为开发者提供了许多定制化的 api 注解。
示例代码:
namespace go auth
struct LoginRequest {
1: string code
}
struct LoginResponse {
1: i64 accountID
}
service AuthService {
LoginResponse Login(1: LoginRequest req)
}
代码生成
Kitex
在新增服务目录下执行,每次仅需更改服务名与 IDL 路径。
服务端
kitex -service auth -module github.com/CyanAsterisk/FreeCar ./../../idl/auth.thrift
客户端
kitex -module github.com/CyanAsterisk/FreeCar ./../../idl/auth.thrift
注意项:
- 用
-module github.com/CyanAsterisk/FreeCar
该参数用于指定生成代码所属的 Go 模块,避免路径问题。 - 当前服务需要调用其他服务时需生成客户端文件。
Hertz
初始化
hz new -idl ./../../idl/api.proto -mod github.com/CyanAsterisk/FreeCar/server/cmd/api
更新
hz update -I -idl ./../../idl/api.proto
注意项:
- 用
-module github.com/CyanAsterisk/FreeCar/server/cmd/api
该参数用于指定生成代码所属的 Go 模块,避免路径问题。
业务开发
在代码生成完毕后需要先将一些必须组件添加到项目中。由于 api 层不必再次添加,因此以下主要讲解关于 Kitex-Server
部分,代码位于 server/cmd
下。
Config
参考 server/cmd/auth/config
,为微服务的配置结构体。
Global
参考 server/cmd/auth/global
,为微服务提供可全局调用的方法。
Initialize
参考 server/cmd/auth/initialize
,提供必要组件的初始化功能,其中 nacos.go
flag.go
logger.go
为必须项。
Tool
参考 server/cmd/auth/tool
,提供微服务的工具函数,其中 port.go
为必须项。
API
在写网关层的业务逻辑时,仅需要每次更新 IDL 与新的微服务客户端代码,若需要添加新的组件直接添加即可,项目高度可拔插,架构与微服务层相似。
网关层的业务逻辑在 server/cmd/api/biz
下,大部分代码会自动生成。若需要单独新增路由需要到 server/cmd/api/router.go
中。
关于中间件的使用,只需要在 server/cmd/api/biz/router/api/middleware.go
中添加中间件逻辑即可。
许可证
FreeCar 在 GNU General Public 许可证 3.0 版下开源。
总结
这个项目还是花费的不少时间,欢迎大家学习,如果 Star 是对我们最大的鼓励!