[Go 微服务] Kratos 验证码业务
文章目录
- 1.环境准备
- 2.验证码服务
- 2.1 kratos 初始化验证码服务项目
- 2.2 使用 Protobuf 定义验证码生成接口
- 2.3 业务逻辑代码实现
1.环境准备
protoc和protoc-gen-go插件安装和kratos工具安装
-
protoc下载
- 下载二进制文件:https://github.com/protocolbuffers/protobuf/releases 下拉到最下方下载系统对应的版本,将解压出来bin目录下的protoc.exe拷贝到GOPATH的bin目录下。
- 查看protoc版本:protoc --version。

-
protoc-gen-go插件安装
- protoc是针对所有语言开发的,protoc-gen-go是专门针对go语言开发,因为是使用go语言开发的,所以直接使用go install就可以进行安装,安装后在GOPATH的bin沐目录下就会有对应的二进制文件。
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest,版本验证protoc-gen-go --versiongo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest,版本验证protoc-gen-go-grpc --version

-
kratos工具安装
- kratos也是go语言编写的,帮助我们快速生成代码的,直接go install安装即可,安装完成也会在GOPATH的bin目录中生成二进制文件。
- 安装命令:
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest - 版本验证:
kratos -v 

2.验证码服务
2.1 kratos 初始化验证码服务项目
kratos new kratos-demo03

PS E:\java\go_code> kratos new kratos-demo03
🚀 Creating service kratos-demo03, layout repo is https://github.com/go-kratos/kratos-layout.git, please wait a moment.Already up to date.CREATED E:\java\go_code\kratos-demo03\.gitignore (590 bytes)
CREATED E:\java\go_code\kratos-demo03\Dockerfile (483 bytes)
CREATED E:\java\go_code\kratos-demo03\LICENSE (1087 bytes)
CREATED E:\java\go_code\kratos-demo03\Makefile (2608 bytes)
CREATED E:\java\go_code\kratos-demo03\README.md (1113 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\error_reason.pb.go (5126 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\error_reason.proto (306 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter.pb.go (8299 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter.proto (711 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter_grpc.pb.go (3667 bytes)
CREATED E:\java\go_code\kratos-demo03\api\helloworld\v1\greeter_http.pb.go (2213 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\main.go (1834 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\wire.go (645 bytes)
CREATED E:\java\go_code\kratos-demo03\cmd\kratos-demo03\wire_gen.go (1121 bytes)
CREATED E:\java\go_code\kratos-demo03\configs\config.yaml (306 bytes)
CREATED E:\java\go_code\kratos-demo03\go.mod (1301 bytes)
CREATED E:\java\go_code\kratos-demo03\go.sum (9022 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\README.md (7 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\biz.go (134 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\biz\greeter.go (1285 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\conf\conf.pb.go (21434 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\conf\conf.proto (805 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\README.md (8 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\data.go (500 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\data\greeter.go (880 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\grpc.go (867 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\http.go (872 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\server\server.go (158 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\README.md (11 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\greeter.go (723 bytes)
CREATED E:\java\go_code\kratos-demo03\internal\service\service.go (142 bytes)
CREATED E:\java\go_code\kratos-demo03\openapi.yaml (1169 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\README.md (15 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\errors\errors.proto (428 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\annotations.proto (1082 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\client.proto (3495 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\field_behavior.proto (3090 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\http.proto (15515 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\api\httpbody.proto (2748 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\any.proto (6067 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\api.proto (7942 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\compiler\plugin.proto (8937 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\descriptor.proto (39418 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\duration.proto (5011 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\empty.proto (2481 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\field_mask.proto (8430 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\source_context.proto (2389 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\struct.proto (3874 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\timestamp.proto (6606 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\type.proto (6313 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\google\protobuf\wrappers.proto (4165 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\openapi\v3\annotations.proto (2254 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\openapi\v3\openapi.proto (22754 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\validate\README.md (84 bytes)
CREATED E:\java\go_code\kratos-demo03\third_party\validate\validate.proto (32133 bytes)🍺 Project creation succeeded kratos-demo03
$ cd kratos-demo03
$ go generate ./...
$ go build -o ./bin/ ./...
$ ./bin/kratos-demo03 -conf ./configs🤝 Thanks for using Kratos📚 Tutorial: https://go-kratos.dev/docs/getting-started/start🤝 Thanks for using Kratos📚 Tutorial: https://go-kratos.dev/docs/getting-started/start

# 进入项目目录,拉取依赖\
cd kratos-demo03
go mod tidy# 安装wire工具:kratos使用了依赖注入来生成相关的代码,所以运行项目前也需要安装
go get github.com/google/wire/cmd/wire# 生成了wire_gen.go
go generate ./...

# 项目运行
kratos run


以上的layout的目录布局,仅仅是kratos推荐的项目目录布局方式
2.2 使用 Protobuf 定义验证码生成接口
- 定义 protobuf 文件说明接口
- 利用 protoc 基于 protobuf 生成必要代码
- 将生成的代码整合到项目中
- 完善业务逻辑
kratos proto add api/verifyCode/verifyCode.proto

syntax = "proto3";package api.verifyCode;
// 生成的go代码所在的包
option go_package = "kratos-demo03/api/verifyCode;verifyCode";
// 定义 VerifyCode 服务
service VerifyCode {rpc GetVerifyCode (GetVerifyCodeRequest) returns (GetVerifyCodeReply);
}
// 类型常量
enum TYPE {DEFAULT = 0;DIGIT = 1;LETTER = 2;MIXED = 3;
};
// 定义 GetVerifyCodeRequest 消息
message GetVerifyCodeRequest {// 验证码长度uint32 length = 1;// 验证码类型TYPE type = 2;}
// 定义 GetVerifyCodeReply 消息
message GetVerifyCodeReply {// 生成的验证码string code = 1;
}
基于verifyCode.proto生成 client(Stub)相关代码
kratos proto client api/verifyCode/verifyCode.proto- api/verifyCode/verifyCode.pb.go:类型定义代码
- api/verifyCode/verifyCode_grpc.pb.go:gRPC服务定义代码

基于verifyCode.proto文件生成 grpc服务代码
kratos proto server api/verifyCode/verifyCode.proto -t internal/service- -t 选项指定生成文件所在位置,代码会生成在internal/service目录中的
internal/service/verifycode.go internal/service/verifycode.go该文件定义了最基本的 VerifyCode 服务和对应的 GetVerifyCode 方法


package serviceimport ("context"pb "kratos-demo03/api/verifyCode"
)type VerifyCodeService struct {pb.UnimplementedVerifyCodeServer
}func NewVerifyCodeService() *VerifyCodeService {return &VerifyCodeService{}
}func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {return &pb.GetVerifyCodeReply{}, nil
}
将生成的服务代码注册到 gRPC 服务中
- 更新 internal/service/service.go 文件

- 告知 wire 依赖注入系统,如果需要 VerifyCodeService 的话,使用NewVerifyCodeService 函数来构建
将 VerifyCodeService 注册到 gRPC 服务中
- 更新 internal/server/grpc.go 文件

package serverimport (v1 "kratos-demo03/api/helloworld/v1""kratos-demo03/api/verifyCode""kratos-demo03/internal/conf""kratos-demo03/internal/service""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/grpc"
)// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, greeter *service.GreeterService, verifyCodeService *service.VerifyCodeService, logger log.Logger) *grpc.Server {var opts = []grpc.ServerOption{grpc.Middleware(recovery.Recovery(),),}if c.Grpc.Network != "" {opts = append(opts, grpc.Network(c.Grpc.Network))}if c.Grpc.Addr != "" {opts = append(opts, grpc.Address(c.Grpc.Addr))}if c.Grpc.Timeout != nil {opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))}srv := grpc.NewServer(opts...)v1.RegisterGreeterServer(srv, greeter)verifyCode.RegisterVerifyCodeServer(srv, verifyCodeService)return srv
}
生成依赖注入代码:go generate ./...

kratos run

建立ApiPost的项目

2.3 业务逻辑代码实现
- GetVerifyCode方法中添加code返回
- 添加RandCode方法,返回测试字符串"result"
- kratos启动测试
package serviceimport ("context"pb "kratos-demo03/api/verifyCode"
)type VerifyCodeService struct {pb.UnimplementedVerifyCodeServer
}func NewVerifyCodeService() *VerifyCodeService {return &VerifyCodeService{}
}func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {return &pb.GetVerifyCodeReply{Code: RandCode(int(req.Length), req.Type),}, nil
}func RandCode(l int, t pb.TYPE) string {return "result"
}

// RandCode 开放的被调用的方法,用于区分类型
func RandCode(l int, t pb.TYPE) string {switch t {case pb.TYPE_DEFAULT:fallthroughcase pb.TYPE_DIGIT:return randCode("0123456789", l)case pb.TYPE_LETTER:return randCode("abcdefghijklmnopqrstuvwxyz", l)case pb.TYPE_MIXED:return randCode("0123456789abcdefghijklmnopqrstuvwxyz", l)}return ""
}// randCode 随机的核心方法
func randCode(chars string, l int) string {charsLen := len(chars)result := make([]byte, l)for i := 0; i < l; i++ {// 核心函数 生成[0,n]的整型随机数randIndex := rand.Intn(charsLen)result[i] = chars[randIndex]}return string(result)
}

相关文章:
[Go 微服务] Kratos 验证码业务
文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件:https://github.com/protocolbuffers/protobu…...
等保2.0安全计算环境解读
等保2.0,即网络安全等级保护2.0制度,是中国为了适应信息技术的快速发展和安全威胁的新变化而推出的网络安全保护标准。相较于等保1.0,等保2.0更加强调主动防御、动态防御和全面审计,旨在实现对各类信息系统的全面保护。 安全计算环…...
Qt视频播放器(二)
文章目录 1. 安装FFmpeg库2. 创建Qt项目3. 配置项目文件CMakeLists.txt4. 实现核心FFmpeg功能`videoplayer.h``videoplayer.cpp`5. 实现QML界面`main.qml`6. 主函数`main.cpp`运行项目详细说明结合FFmpeg进行视频播放的核心部分,并使用QML进行界面设计,您可以实现一个功能强大…...
普元EOS学习笔记-创建精简应用
前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中,我们了解到普元预编译好的EOS的精简版压缩包,安装后,只能进行低开,而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE,创建一个…...
观察者模式在金融业务中的应用及其框架实现
引言 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象同时监听某一个主题对象。当这个主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新。…...
最新docker仓库镜像
目前下面的docker仓库镜像源还能使用。 vi /etc/docker/daemon.json添加如下配置{"registry-mirrors": ["https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu&…...
springboot 3.x相比之前版本有什么区别
Spring Boot 3.x相比之前的版本(尤其是Spring Boot 2.x),主要存在以下几个显著的区别和新特性: Java版本要求: Spring Boot 3.x要求至少使用Java 17作为最低版本,同时已经通过了Java 19的测试,…...
Python逻辑控制语句 之 判断语句--if语句的基本结构
1.程序执行的三大流程 顺序 分支(判断) 循环 2.if 语句的介绍 单独的 if 语句,就是 “如果 条件成⽴,做什么事” 3.if 语句的语法 if 判断条件: 判断条件成立,执行的代码…...
LeetCode 算法:翻转二叉树 c++
原题链接🔗:翻转二叉树 难度:简单⭐️ 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 …...
七天速通javaSE:第五天 数组进阶
文章目录 前言一、二维数组二、Arrays类1.toString打印数组内各元素1.1 示例1.2 自己实现内部逻辑 2. sort升序排列3. fill数组填充(重新赋值)4.equals比较数组元素是否相等 三、冒泡排序 前言 本文将学习二维数组、arrays类以及冒泡排序 一、二维数组 …...
游戏心理学Day28
独立游戏团队架构 独立游戏工作室是一个包括编程美术设计院校项目管理和运营等各种职能的团队找到可以共同奋斗。数月甚至数年的合适人选并不是一件容易的事情。游戏开发过程中要涉及多种常规工作。小团队的每个成员通常都要身兼数职,而且有些角色常由多人担任。 …...
鸿蒙开发设备管理:【@ohos.multimodalInput.inputEventClient (注入按键)】
注入按键 InputEventClient模块提供了注入按键能力。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。本模块接口均为系统接口,三方应用不支持调用。 导入模块 import inputEventCli…...
C++:std::function的libc++实现
std::function是个有点神奇的模板,无论是普通函数、函数对象、lambda表达式还是std::bind的返回值(以上统称为可调用对象(Callable)),无论可调用对象的实际类型是什么,无论是有状态的还是无状态…...
DM 的断点续传测试
作者: 大鱼海棠 原文来源: https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三种数据迁移同步方式(task-mode),在all同步模式下,因一些特殊情况,需要变更上游MySQL的数…...
力扣每日一题 6/30 记忆化搜索/动态规划
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 494.目标和【中等】 题目: 给你一个非负整数数组 nums 和一个…...
图像基础知识入门【图像概念不同图像格式】
图像基础知识入门【图像概念&不同图像格式】 最近有在处理图像转换,因此稍微补足了一下图像相关知识,特在此记录。下面汇总是我根据自己理解和网上查阅资料而来。如有错误,欢迎大家指正。 1 基础概念 像素/分辨率 像素(Pixel)ÿ…...
HP服务器基于SNMP-ilo4的硬件监控指标解读
监控易是一款功能全面的IT基础设施监控软件,它通过SNMP协议与HP服务器内置的ilo4远程管理卡进行通信,实现对HP服务器硬件状态的实时监控。本文将针对监控易中基于SNMP-ilo4的HP服务器硬件监控指标进行解读,帮助运维团队更好地理解和应用这些监…...
Android13系统导航栏添加音量加减键按钮功能
不知道为什么拿到芯片原厂发布给我们的Android13系统源码编译后,导航栏没有音量加减键,客户有反馈这个问题,所以特意加了一下,修改记录如下:frameworks/base目录下 commit 9cb2244d61a237cab03c540bfcca6e4fac2bea2c …...
普及GIS知识,推动产业发展
915 GIS节:普及GIS知识,推动产业发展 自2008年起,每年的9月15日被定为“GIS节”,这一特殊的节日由超图首次发起倡议,旨在打造一个普及和传播GIS(地理信息系统)知识的平台,促进大众对…...
第2章-Python编程基础
#本章目标 1,了解什么是计算机程序 2,了解什么是编程语言 3,了解编程语言的分类 4,了解静态语言与脚本语言的区别 5,掌握IPO程序编写方法 6,熟练应用输出函数print与输入函数input 7,掌握Python…...
OpenClaw+Qwen3.5-4B-Claude:个人知识库自动更新系统
OpenClawQwen3.5-4B-Claude:个人知识库自动更新系统 1. 为什么需要自动化知识管理 作为一个技术从业者,我每天都会接触到大量信息——技术博客、论文摘要、行业动态、代码库更新等等。过去三年里,我尝试过各种笔记工具和知识管理方法&#…...
PostgreSQL 模式级权限迁移:一键批量修改所有表与对象的所有者
1. 为什么需要批量修改PostgreSQL对象所有者? 在实际的数据库运维工作中,经常会遇到需要批量修改数据库对象所有者的情况。我遇到过不少这样的场景:公司部门重组后,原先由开发团队A负责的项目转交给团队B维护;或者某个…...
FOC算法避坑指南:克拉克变换的‘等幅值’与‘等功率’到底怎么选?基于STM32的实测对比
FOC算法避坑指南:克拉克变换的‘等幅值’与‘等功率’到底怎么选?基于STM32的实测对比 在STM32平台上实现磁场定向控制(FOC)时,克拉克变换系数的选择往往让工程师陷入两难:究竟该用2/3(等幅值&…...
ROS Noetic下大陆ARS408雷达点云数据解析:从CAN原始帧到RVIZ可视化,一个脚本全搞定
ROS Noetic下大陆ARS408雷达点云数据全链路解析与自动化实践 毫米波雷达在自动驾驶、机器人导航等领域扮演着关键角色。大陆ARS408作为一款高性价比的毫米波雷达,其点云数据的获取与可视化是许多开发者需要掌握的核心技能。本文将带您从底层CAN总线通信开始…...
OpCore-Simplify智能构建:OpenCore EFI自动化生成的效率提升实践
OpCore-Simplify智能构建:OpenCore EFI自动化生成的效率提升实践 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 用户场景:黑苹…...
全网最详细的AI产品经理学习路线,非常详细收藏这一篇就够了
前言 AI产品经理作为一个新兴且热门的职业,不仅需要具备传统产品经理的能力,还需要对AI技术有深入的理解和应用。本学习路线旨在帮助有志于成为AI产品经理的学习者系统地掌握所需的知识和技能。 前排提示,文末有大模型AGI-CSDN独家资料包哦…...
Qwen3.5-4B-Claude-Opus行业落地:高校编程教学辅助与算法解题思路生成
Qwen3.5-4B-Claude-Opus行业落地:高校编程教学辅助与算法解题思路生成 1. 模型介绍与教育场景适配性 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专为推理任务优化的轻量级AI模型,特别适合教育领域的应用场景。该模型基于Qwen3.5-4B架…...
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现
YOLOv7剪枝实战:5种高效剪枝方法对比与代码实现 在目标检测领域,YOLOv7以其卓越的速度-精度平衡成为工业界宠儿。但当我们将模型部署到边缘设备或需要高吞吐量的生产环境时,原始模型的计算量和参数量往往成为瓶颈。这时,模型剪枝技…...
使用Dependency Check命令行工具高效检测Java项目中的安全漏洞
1. 为什么Java开发者需要关注依赖库安全? 如果你是一名Java开发者,可能经常遇到这样的情况:项目运行得好好的,突然某天系统被入侵了,排查半天才发现是某个第三方库存在安全漏洞。这种情况在现实开发中并不少见…...
基于Hunyuan-MT-7B的算法竞赛题解翻译系统
基于Hunyuan-MT-7B的算法竞赛题解翻译系统 1. 引言 算法竞赛是全球程序员和算法爱好者展示实力的舞台,但语言障碍常常成为知识共享的壁垒。一道优秀的解题思路,可能因为语言不通而无法被更多人学习借鉴。传统的机器翻译工具在面对算法题解中的专业术语…...
