FreeCar
FreeCar 是一个基于 Hertz 与 Kitex 的全栈微服务项目,欢迎 Star。
业务背景
FreeCar 的开发初衷是通过同享出行,处理新能源轿车充电时间长的问题,当轿车快要没电时能够进行轿车的更换防止因为没电导致行程延误。
关于 FreeCar 更多的信息可移步至 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 的 API 服务 |
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 是对咱们最大的鼓励!
参阅
- CyanAsterisk/FreeCar
- cloudwego/hertz
- cloudwego/kitex