likes
comments
collection
share

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

作者站长头像
站长
· 阅读数 17

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
CIGitHub Actions

项目架构

调用关系

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

技术架构

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

服务关系

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

页面展示

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

目录介绍

目录介绍
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 配置文件。

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐 基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

关于配置中心的详细配置,详见

生成数据表

make migrate

启动 HTTP 服务

make api

启动微服务

make auth
make blob
make car
make profile
make trip

Jaeger

在浏览器上访问 http://127.0.0.1:16686/

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

Prometheus

在浏览器上访问 http://127.0.0.1:3000/

基于 Hertz 和 Kitex 的 Go 微服务项目 | 开源项目推荐

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 是对我们最大的鼓励!

参考

转载自:https://juejin.cn/post/7191844660145946683
评论
请登录