[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…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
