从战神到微服务:用Go-Kratos v2快速搭建你的第一个‘Hello World’服务
从战神到微服务用Go-Kratos v2快速搭建你的第一个‘Hello World’服务在游戏《战神》中奎托斯Kratos从凡人成长为弑神者的故事令人热血沸腾。而今天我们将借用这份战斗精神在Go语言的微服务战场上完成一次从零到一的弑神之旅——用Kratos框架快速构建你的第一个微服务。1. 为什么选择Kratos开启你的微服务征程当Go语言成为云原生时代的基础设施语言时各种微服务框架如雨后春笋般涌现。Kratos之所以能从众多框架中脱颖而出离不开它的几个核心特质轻量但完整不像某些全家桶框架强制捆绑特定技术栈Kratos提供了可插拔的组件体系符合工程实践内置了符合Google API设计规范的proto生成工具学习曲线平缓通过清晰的目录结构和代码生成工具降低入门门槛提示虽然Kratos名字来源于游戏角色但它的设计哲学更接近希腊语中力量的本义——通过合理的架构设计赋予开发者真正的能力2. 搭建你的开发环境2.1 基础工具准备在开始前请确保你的系统已经安装# 检查Go版本需要1.16 go version # 安装Protocol Buffers编译器 brew install protobuf # macOS sudo apt install protobuf-compiler # Ubuntu2.2 安装Kratos CLI工具框架提供了强大的命令行工具来简化开发流程# 最新安装方式Go 1.16 go install github.com/go-kratos/kratos/cmd/kratos/v2latest # 验证安装 kratos -v3. 创建第一个微服务项目3.1 初始化项目骨架执行以下命令创建项目模板kratos new hello-kratos cd hello-kratos go mod download生成的项目结构遵循了清晰的领域划分原则├── api/ # 接口定义层Protobuf文件 ├── cmd/ # 程序入口 ├── configs/ # 配置文件 ├── internal/ # 核心业务逻辑 │ ├── biz/ # 业务实体 │ ├── data/ # 数据访问 │ └── service/ # 服务实现3.2 定义你的第一个API使用Kratos提供的proto工具快速生成接口定义kratos proto add api/helloworld/helloworld.proto编辑生成的proto文件定义一个简单的问候服务syntax proto3; package helloworld.v1; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name 1; } message HelloReply { string message 1; }4. 实现业务逻辑4.1 生成服务代码Kratos可以自动生成服务端骨架代码kratos proto server api/helloworld/helloworld.proto -t internal/service4.2 编写核心业务在internal/service/greeter.go中实现具体逻辑func (s *GreeterService) SayHello(ctx context.Context, req *v1.HelloRequest) (*v1.HelloReply, error) { return v1.HelloReply{ Message: Hello req.Name, }, nil }4.3 依赖注入配置Kratos使用Wire进行依赖管理。在cmd/server/wire.go中var serviceSet wire.NewSet( service.NewGreeterService, ) func initApp() (*kratos.App, func(), error) { wire.Build( server.ProviderSet, serviceSet, newApp, ) return kratos.App{}, nil, nil }5. 运行与测试5.1 启动服务执行以下命令编译并运行服务go generate ./... kratos run5.2 测试接口使用grpcurl工具测试服务grpcurl -plaintext -d {name:Kratos} localhost:9000 helloworld.v1.Greeter/SayHello应该会收到响应{ message: Hello Kratos }6. 进阶配置与优化6.1 添加HTTP网关Kratos支持同时暴露gRPC和HTTP接口。在internal/server/http.go中httpSrv : http.NewServer( http.Address(:8000), http.Middleware( middleware.Chain( recovery.Recovery(), tracing.Server(), logging.Server(), ), ), ) v1.RegisterGreeterHTTPServer(httpSrv, greeter)6.2 配置热加载创建configs/config.yaml配置文件server: http: addr: :8000 timeout: 1s grpc: addr: :9000 timeout: 1s在代码中加载配置// internal/conf/conf.proto message Server { message HTTP { string network 1; string addr 2; google.protobuf.Duration timeout 3; } message GRPC { string network 1; string addr 2; google.protobuf.Duration timeout 3; } HTTP http 1; GRPC grpc 2; }7. 部署到生产环境7.1 容器化部署项目已自带DockerfileFROM golang:1.18 AS builder WORKDIR /app COPY . . RUN make build FROM debian:stable-slim COPY --frombuilder /app/bin /app CMD [/app/hello-kratos]构建并运行容器docker build -t hello-kratos . docker run -p 8000:8000 -p 9000:9000 hello-kratos7.2 添加监控指标Kratos内置了Prometheus指标收集// cmd/server/main.go import github.com/go-kratos/kratos/contrib/metrics/prometheus/v2 prometheus.New()然后在internal/server/http.go中添加中间件http.Middleware( middleware.Chain( // ... metrics.Server( metrics.WithSeconds(prometheus.NewHistogram()), ), ), )在本地开发中最常遇到的问题往往是proto文件修改后没有正确生成代码。记住每次修改proto后都要执行kratos proto client api/helloworld/helloworld.proto kratos proto server api/helloworld/helloworld.proto -t internal/service go generate ./...
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2448302.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!