一分钟使用高性能框架 Hertz

点击上方蓝色字体,选择“设为星标”

回复”云原生“获取基础架构实践

92c2a005193a21acf378de15624f5a32.jpeg

Hertz 是什么

Hertz[həːts] 是字节 CloudWeGo 团队一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

环境

基础依赖

在开发、部署运行该项目之前,需要有一定的基础环境:

  • go v1.16 +

  • hz 脚手架工具 v0.6.3

  • 支持 win、mac、linux

安装 go

直接参考官方文档:https://go.dev/doc/install

安装命令行脚手架工具 hz

hz 是 Hertz 框架提供的一个用于生成代码的命令行工具。目前,hz 可以基于 thrift 和 protobuf 的 IDL 生成 Hertz 项目的脚手架。

注意:

  • 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将 添加到环境变量之中例如GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录

  • 安装 hz:go install github.com/cloudwego/hertz/cmd/hz@latest

安装完成后执行命令:

hz -version

出现如下结果,即为安装成功:

hz version v0.6.4

生成代码与运行代码

代码目录确定位置
  1. 若将代码放置于 下,需在GOPATH/src 下创建代码目录,进入该目录后再进行操作

  2. 直接新建一个项目目录

生成代码

我们选择方式二:在任一目录新建一个项目uranus,如下图:

19be19dc652a921115d6018a530614c0.png

由于我们是做一个大的项目工程,类似 Java 的父子工程,所以我们需要先建立一个依赖,新建一个go.mod文件:

go 1.20

由于这边用的是最新的 go 版本,所以直接用 v1.20。

然后我们新建今天的第一个项目:kronos,由于我们后面的编解码都是通过 idl 文件进行生成,所以这里需要用到idl目录,然后我们再创建一个 pkg 目录,来专门存放工具库,综合目录情况如下:

4ccd2be9d0b69d45aa16a2e5d78c08f0.png

参考 go 项目基本布局:https://github.com/golang-standards/project-layout/blob/master/README_zh.md

最后,我们需要对当前项目进行环境配置:

设置 go 环境

8511ad3adf852287e6e538bcb84b0358.png ffc9ff87333fe6d7f76d8b1fb513ec2f.png da593077c28a1f3033a19cbacf643d6f.png

注:在配置代理时,选择国内的域名进行配置。

插曲

在使用 hz 工具生成代码之前,我们需要先了解下编解码序列化工具:thrift、protobuf

  • protocol buffers,谷歌开发的数据序列号格式。以二进制形式有效而紧凑地存储结构化数据,允许在网络连接上更快传输。

  • thrift 不仅仅提供全套 rpc 解决方案,包括序列化机制、传输层、并发处理框架等的 rpc 服务框架。利用 idl 文件来定义接口和数据类型。通过 thrift 提供的编译器编译成不同语言代码,以此实现跨语言调用。

protobuf 和 json 的区别

  • 速度:在序列化和反序列化数据方面,Protobuf 比 JSON 快得多。由于格式是二进制的,json 是文本格式,Protobuf 中读写结构化数据所需的时间比在 JSON 中要短。

  • 大小:Protobuf 比 JSON 小得多,在网络带宽有限的情况下,由于二进制数据流的紧凑性,存储和传输 Protobuf 信息所占用的空间比 JSON 信息要少。

  • 数据类型:Protobuf 支持更复杂的数据类型,如枚举和 map

  • 平台兼容性:由于 Protobuf 是一种开源格式,语言和平台独立的,它可以在多个平台上使用而没有困难或兼容性问题。

手写一个 IDL 文件

在前面,我们了解到 thrift、protobuf 是什么之后,我们先来手写一个 IDL 文件:

namespace go hello

struct Request {
 1: string name
 2: string age
}

struct Response {
 1: i8 code
    2: string msg
 3: map<string,string> data
}

service HelloApi {
    Response echo(1: Request req)
}

上面写的是一个基于 thrift 的 IDL,同样,我们也可以基于:

syntax = "proto3";
package elena;
option go_package = "elena";

message BaseResp {
    int16 code = 1;
    string msg = 2;
}

message Elena {
    int64 id = 1;
    string name = 2;
    string pthone = 3;
    string password = 4;
}

message CreateRequest {
    string name = 1;
    string password = 2;
    string pthone = 3;
}

message CreateResponse {
    BaseResp result = 1;
    string data = 2;
}

service ElenaService {
    rpc CreateElena (CreateRequest) returns (CreateResponse) {}
}

当然,由于 thrift、protobuf 在不同场景下具有不同的特性与性能,一般:

  • 基于 Streaming 场景下,基于 Protobuf 编码,有两种:Kitex Protobuf 和 gRPC。性能较快

  • 其它场景基本基于 thrift 进行序列化编解码即可

代码生成

我们按照前面写的 thrift 模板文件 idl,来依赖 hz 工具生成,在生成代码之前,需要安装相应的编译器 thriftgo、protoc:

go install github.com/cloudwego/thriftgo@latest

对于 protoc,可以参考:

// brew 安装
$ brew install protobuf

// 官方镜像安装,以 macos 为例
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip
$ unzip protoc-3.19.4-osx-x86_64.zip
$ cp bin/protoc /usr/local/bin/protoc
// 确保 include/google 放入 /usr/local/include下
$ cp -r include/google /usr/local/include/google

也可以参考官方:https://github.com/protocolbuffers/protobuf

安装完成编译器后,我们进入目录kronos,执行:

hz new -module kronos --idl ../idl/hello.thrift -t=template=slim

hz update ../idl/hello.thrift -t=template=slim

go mod tidy
78b41d65a80dbcf5378cebd43183c834.png

注意,在生成代码后,需要进行微调,目录结构、go.mod 等不同,会出现一些小问题,同时需要执行:go mod tidy进行整理。

运行项目

执行文件:main.go

291c91df66b9c8e9a93ae67d4dbde084.png

启动之后,看控制台:

8b13efb2d768930d78325f2a85ecb13f.png

可以看到有几个接口,同时当前服务默认监听端口:8888。

打开一个web ui,访问API接口:

002577e0039d71ba4705157b1a826dec.png

到此,本次分享的实战性项目第一节就结束了,源码可以后台联系号主赠送,如想学习更多内容,请加入星球:《交个朋友之猿田地》,后台私信群主进入星球群,同时,优惠券发放。

29fd54b6daeda7a10d6e8dc512a71cbc.png

e8dfcf7c966db3c4f3697f5ea763b766.png

下面给大家介绍几本好书,目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。

开源项目

  实践项目代码开源:https://gitee.com/damon_one/microservice-k8s

欢迎大家star、fork,欢迎联系我,一起学习。

号内回复“云原生”,获取云原生基础架构实践

56070dcf6cba08f58a02c0c28fcf3d3b.png

云原生社区合肥站

云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~

详情参见Issue:https://github.com/cloudnativeto/community/issues/107

欢迎关注个站

733b519ecb384f9ae72971c44d7af2e2.png

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList&nbsp;你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈&nbsp;Java&nbsp;集合&nbsp;|&nbsp;底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

35c1e6a02192dea7af1e091109507808.gif

4bafd12dcf320e276574b43f7ff2d492.gif

点击 "damon8.cn" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值