Go语言——kratos微服务框架使用
文章目录
- 一、安装依赖
- 二、创建项目
- 三、初始化项目
- 四、使用git_bash命令终端运行命令
- 五、创建自己的项目
- 1、修改app.proto
- 3、internal/service/app.go
- 4、修改internal/service/service.go文件
- 5、创建internal/biz/content.go文件
- 6、修改internal/biz/biz.go文件
- 7、创建internal/data/content.go文件
- 8.修改internal/data/data.go文件
- 9、修改ContentManage/configs/config.yaml文件
- 12、创建ContentManage/cmd/client/client.go,来rpc调用方法
一、安装依赖
- 1、设置代理
- 2、安装依赖
# 安装Kratos tool
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
二、创建项目
# 然后在GOPATH\bin目录下能找到kratos.exe,在需要创建项目的目录下执行,即可创建项目
kratos new helloworld
# 如果默认的github不通的话,可以用gitee拉取
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git
三、初始化项目
# 进入helloworld目录
cd helloworld
# 初始化项目
make init
如果没有make命令,可以在网盘中下载
如果没有protoc命令,也可以在网盘中下载,并配置其环境变量
四、使用git_bash命令终端运行命令
# 初始化
make init
# 生成api
make api
# 构建
make build
# 所有操作
make all
# 启动kracos
kracos run
# 测试
curl 'http://127.0.0.1:8000/kracos'
五、创建自己的项目
# 创建内容管理项目
kratos new ContentManage -r https://gitee.com/go-kratos/kratos-layout.git# 进入目录
cd ./ContentManage# 拉取依赖
go mod download# 1.添加我们的自定义协议,并修改为我们自定义的接口,如下
kratos proto add api/operate/app.proto# 2.修改完成之后,重新生成go文件
make api# 3.在internal/service下创建app.go文件。代码如下
# 4.修改internal/service/service.go文件
# 5.创建internal/biz/content.go文件
# 6.修改internal/biz/biz.go文件
# 7.创建internal/data/content.go文件
# 8.修改internal/data/data.go文件
# 9.修改ContentManage/configs/config.yaml文件
# 10.执行命令,重新生成代码
make all
# 11.启动
kratos run
# 12.创建ContentManage/cmd/client/client.go,来rpc调用方法
1、修改app.proto
syntax = "proto3";import "google/api/annotations.proto";package api.operate;option go_package = "ContentManage/api/operate;operate";
option java_multiple_files = true;
option java_package = "api.operate";service App {// 创建内容rpc CreateContent (CreateContentReq) returns (CreateContentResp) {option (google.api.http) = {post: "/api/cms/content/create",body: "content"};};
}message Content {// 内容idint64 id = 1;// 内容标题string title = 2;// 视频播放urlstring videoUrl = 3;// 作者string author = 4;// 内容描述string description =5;// 封面图urlstring thumbnail = 6;// 内容分类string category = 7;// 内容时长int64 duration = 8;// 分辨率string resolution = 9;// 文件大小int64 fileSize = 10;// 文件格式string format = 11;// 视频质量1-高清 2-标清int32 quality = 12;// 审核状态 1-审核中 2-审核通过 3-审核不通过int32 approvalStatus = 13;
}message CreateContentReq {// 内容Content content = 1;
}
message CreateContentResp {}
3、internal/service/app.go
package serviceimport ("ContentManage/api/operate""ContentManage/internal/biz"
)type AppService struct {operate.UnimplementedAppServeruc *biz.ContentUsecase
}// NewAppService new a app service.
func NewAppService(uc *biz.ContentUsecase) *AppService {return &AppService{uc: uc}
}
4、修改internal/service/service.go文件
package serviceimport "github.com/google/wire"// ProviderSet is service providers.
var ProviderSet = wire.NewSet(NewAppService)
5、创建internal/biz/content.go文件
package bizimport ("context""github.com/go-kratos/kratos/v2/log""time"
)type Content struct {Id int `gorm:"column:id;primary_key"` // 内容idTitle string `gorm:"column:title"` // 内容标题Description string `gorm:"column:description"` // 内容描述Author string `gorm:"column:author"` // 作者VideoUrl string `gorm:"column:video_url"` // 视频播放URLThumbnail string `gorm:"column:thumbnail"` // 封面页URLCategory string `gorm:"column:category"` // 内容分类Duration time.Duration `gorm:"column:duration"` // 内容时长Resolution string `gorm:"column:resolution"` // 分辨率FileSize int64 `gorm:"column:file_size"` // 文件大小Format string `gorm:"column:format"` // 文件格式 如MP4等Quality int32 `gorm:"column:quality"` // 视频质量 1-高清 2-标清ApprovalStatus int32 `gorm:"column:approval_status"` // 审核状态 1-审核中 2-审核通过 3-审核不通过CreatedAt time.Time `gorm:"column:created_at"` // 内容创建时间UpdatedAt time.Time `gorm:"column:updated_at"` // 内容更新时间
}func (c Content) TableName() string {return "cms_content.t_content_detail"
}type ContentRepo interface {Create(context.Context, *Content) error
}type ContentUsecase struct {repo ContentRepolog *log.Helper
}// NewContentUsecase new a Content usecase.
func NewContentUsecase(repo ContentRepo, logger log.Logger) *ContentUsecase {return &ContentUsecase{repo: repo, log: log.NewHelper(logger)}
}func (uc *ContentUsecase) CreateContext(ctx context.Context, content *Content) error {uc.log.WithContext(ctx).Infof("CreateContext: %v+v", content)return uc.repo.Create(ctx, content)
}
6、修改internal/biz/biz.go文件
package bizimport "github.com/google/wire"// ProviderSet is biz providers.
var ProviderSet = wire.NewSet(NewContentUsecase)
7、创建internal/data/content.go文件
package dataimport ("ContentManage/internal/biz""context""github.com/go-kratos/kratos/v2/log"
)type contentRepo struct {data *Datalog *log.Helper
}func NewContentRepo(data *Data, logger log.Logger) biz.ContentRepo {return &contentRepo{data: data,log: log.NewHelper(logger),}
}func (r *contentRepo) Create(ctx context.Context, content *biz.Content) error {r.log.Infof("contentRepo Create content = %+v", content)return r.data.db.Save(content).Error
}
8.修改internal/data/data.go文件
package dataimport ("ContentManage/internal/conf""gorm.io/driver/mysql""gorm.io/gorm""github.com/go-kratos/kratos/v2/log""github.com/google/wire"
)// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewContentRepo)// Data .
type Data struct {db *gorm.DB
}// NewData .
func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) {cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}mysqlDB, err := gorm.Open(mysql.Open(c.GetDatabase().Source))if err != nil {log.Error("[data] failed to connect database", "error", err)panic(err)}db, err := mysqlDB.DB()if err != nil {log.Error("[data] failed to connect database", "error", err)panic(err)}db.SetMaxOpenConns(4)db.SetMaxIdleConns(2)return &Data{db: mysqlDB,}, cleanup, nil
}
9、修改ContentManage/configs/config.yaml文件
server:http:addr: 0.0.0.0:8000timeout: 1sgrpc:addr: 0.0.0.0:9000timeout: 1s
data:database:driver: mysqlsource: root:p@ssw0rd@tcp(127.0.0.1:3306)/?charset=utf8mb4&parseTime=True&loc=Localredis:addr: 127.0.0.1:6379read_timeout: 0.2swrite_timeout: 0.2s
12、创建ContentManage/cmd/client/client.go,来rpc调用方法
package mainimport ("ContentManage/api/operate""context""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/grpc"
)func main() {conn, err := grpc.DialInsecure(context.Background(),grpc.WithEndpoint("127.0.0.1:9000"),grpc.WithMiddleware(recovery.Recovery()),)if err != nil {panic(err)}defer conn.Close()client := operate.NewAppClient(conn)reply, err := client.CreateContent(context.Background(), &operate.CreateContentReq{Content: &operate.Content{Title: "test content_manage create",VideoUrl: "https://example.com/video.mp4",Author: "lucky",Description: "test",},})if err != nil {log.Fatal(err)}log.Infof("[grpc] CreateContent %v\n", reply)
}
相关文章:

Go语言——kratos微服务框架使用
文章目录 一、安装依赖二、创建项目三、初始化项目四、使用git_bash命令终端运行命令五、创建自己的项目1、修改app.proto3、internal/service/app.go4、修改internal/service/service.go文件5、创建internal/biz/content.go文件6、修改internal/biz/biz.go文件7、创建internal…...
动作识别笔记
一些casual paper review 动作识别Input 从前:RGB,然后 RGB+2D pose 接着各种手工modalities,现在是纯pose 但是包含了 多人 interactive的pose Graph from skeleton verticies: keypoints,Edges: just joint btw keypoints一个训练的sample 是一个 panoramic graph, con…...

hiveserver2与beeline进行远程连接hive配置及遇到的问题
1、hiveserver2 参与用户模拟功能,因为开启后才能保证各用户之间的权限隔离。 1.1、配置 $HADOOP_HOME/etc/hadoop/core-site.xml <!--配置所有节点的root用户都可作为代理用户--> <property><name>hadoop.proxyuser.root.hosts</name>&…...

Stable Diffusion进阶之Controlnet插件使用
前面已经对Stable Diffusion的文生图和图生图的操作界面做了详细的介绍,接下来会介绍Stable Diffusion的进阶部分Controlnet插件的使用。往期文章详见: 爆肝整理!Stable Diffusion的完全使用手册(一)爆肝整理ÿ…...
解决vue create 创建项目,不能使用上下键选择模板的问题
使用 git bash 创建vue项目时候,无法使用上下键盘按键选择创建模板 处理: 1.当前界面,按CTR C终止创建命令; 2.使用 alias vuewinpty vue.cmd,更新命令环境; 3.再次使用 vue create demo创建项目…...

Multisim14使用教程详尽版--(2025最新版)
一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim:NI开发的SPICE标准仿真工具,支持模拟/数字电路混合仿真,内置丰富的元件库和虚拟仪器(示波器、频谱仪等),适合教学和竞赛设计。官网:艾…...

使用Stable Diffusion(SD)中,步数(Steps)指的是什么?该如何使用?
Ⅰ定义: 在Stable Diffusion(SD)中,步数(Steps) 指的是采样过程中的迭代次数,也就是模型从纯噪声一步步“清晰化”图像的次数。你可以理解为模型在画这张图时“润色”的轮数。 Ⅱ步数的具体作…...
《Asp.net Mvc 网站开发》复习试题
一.选择题(注:每题2分,共 54分,只能在下列表格中,填写每个题目相应的正确字母选项) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: :27: 1. Mvc让软件…...

【se-res模块学习】结合CIFAR-10分类任务学习
继CIFAR-10图像分类:【Res残差连接学习】结合CIFAR-10任务学习-CSDN博客 再优化 本次训练结果在测试集上的准确率表现可达到90%以上 1.训练模型(MyModel.py) import torch import torch.nn as nnclass SENet(nn.Module): # SE-Net模块def…...

【C++设计模式之Template Method Pattern】
C设计模式之Template Method Pattern 模式定义核心思想动机(Motivation)结构(Structure)实现步骤应用场景要点总结 模式定义 模式定义: 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子…...
JVM对象头中的锁信息机制详解
JVM对象头中的锁信息机制详解 Java中的对象锁机制是高性能并发的基石,而这一切的底层实现都离不开对象头中的 Mark Word 字段。本文将系统梳理JVM对象头中锁信息的存储与演化机制,解析锁升级与批量重偏向优化原理,并通过JOL工具实战验证对象…...
Java设计模式之适配器模式:从入门到精通
适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…...

英伟达Blackwell架构重构未来:AI算力革命背后的技术逻辑与产业变革
——从芯片暴力美学到分布式智能体网络,解析英伟达如何定义AI基础设施新范式 开篇:当算力成为“新石油”,英伟达的“炼油厂”如何升级? 2025年3月,英伟达GTC大会上,黄仁勋身披标志性皮衣,宣布了…...
【自定义指令】(el-table表格内容自动轮播)
// el-table 自动轮播 import { nextTick } from vue; export default {bind(el, binding) {const time binding.value?.time || 100;let speed binding.value?.speed || 1;const loop binding.value?.loop || true;const timeLoop binding.value?.timeLoop || true;co…...

深度拆解!MES如何重构生产计划与排产调度全流程?
☂引言 在制造业数字化转型浪潮中,生产计划与排产调度的精准性直接决定企业竞争力。深蓝易网MES系统通过智能化调度与全流程管控,帮助企业破解排产难题,实现资源高效协同与生产透明化管理,为制造企业打造柔性化、敏捷化的生产体系…...

信息系统项目管理师-软考高级(软考高项)2025最新(十八)
个人笔记整理---仅供参考 第十八章项目绩效域 18.1干系人绩效域 18.2团队绩效域 18.3开发方法和生命周期绩效域 18.5项目工作绩效域 18.6交付绩效域 18.7度量绩效域 18.8不确定绩效域...

UniDevTools - UniApp(前端app)调试工具使用
使用介绍 | UniDevTools 兼容框架: Vue2jsvuexVue3tsvuex(pinia)√√ 兼容平台: H5APP微信小程序APP-NVUE其他小程序UniAppX√√√√(大部分功能支持)未测试 (待办中) 下载安装 将下载好的源码解压至项目根目录,文件夹命名为 devTools …...
WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍
简介 WebRTC(Web Real-Time Communication)是一项允许在网页浏览器之间进行音视频通信的技术,基本不需要安装额外的插件。它的核心特点是支持低延迟的点对点(P2P)通讯,常用于视频聊天、实时文件共享、多人…...
Docker快速入门与应用
1. 什么是 Docker? Docker 就像一个“魔法箱子”,可以把你开发的应用(代码、环境、配置)打包成一个标准化的容器,这个容器可以在任何支持 Docker 的系统上运行,无需担心环境差异导致的问题。 类比…...
Spring Boot 启动原理的核心机制
一、核心启动流程概览 Spring Boot 的启动流程可概括为 7 个关键阶段: 1. 加载启动类 (Main Class) 2. 初始化 SpringApplication 实例 3. 加载配置 & 准备环境 (Environment) 4. 创建 ApplicationContext(容器) 5. 刷新容器&#…...

spring中的@Lazy注解详解
一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具,通过将 Bean 的创建推迟到首次使用时,优化资源利用和启动性能。其核心功能包括: 延迟初始化 默认情况下,Spring 在容器启动时立即初始化所有单例 …...

视觉-语言-动作模型:概念、进展、应用与挑战(上)
25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…...

语义分割模型部署到嵌入式终端的通用操作流程
以下是语义分割模型部署到嵌入式终端的通用操作流程,结合不同硬件平台(如华为Atlas、地平线J5、树莓派等)的共性需求整理而成: 一、环境准备与工具链配置 1. 嵌入式开发环境搭建 安装交叉编译工具链(如ARM-GCC&…...

R1-Searcher:用强化学习解锁大语言模型检索新能力!
R1-Searcher:用强化学习解锁大语言模型检索新能力! 大语言模型(LLMs)发展迅猛,却常因依赖内部知识而在复杂问题上“栽跟头”。今天解读的论文提出R1-Searcher框架,通过强化学习提升LLMs检索能力。它表现超…...

第一篇 世界观安全
目录 STRIDE模型 五大原则 一黑白名单 二最小权限原则 三纵深防御原则 四数据和代码分离 五不可预测原则 安全的问题本质是信任问题。 并且安全是一个持续的过程。 安全的三要素:机密性,完整性(可以采用数字签名)&#x…...
RNN(循环神经网络)原理与结构
1 RNN(循环神经网络)原理与结构 循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据(如时间序列、文本、语音等)的深度学习模型。与传统的前馈神经网络不同,RNN在每个时间…...

mac M2能安装的虚拟机和linux系统系统
目前网上的资料大多错误,能支持M2的很少。 推荐安装的改造过的centos7也无法进行yum操作,建议安装centos8 VMware Fusion下载地址: https://pan.baidu.com/s/14v3Dy83nuLr2xOy_qf0Jvw 提取码: jri4 centos8下载地址: https://…...

无偿帮写毕业论文
以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行,脱产学习这么多年,终于熬出头了,完成毕设后有空就去多看看亲人好友,祝好! 一、找一个论文模板(最好是overleaf) 废话不多说&#…...

智能网联汽车“内外协同、虚实共生”的通信生态
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界…...

Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载
Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载 前言一、 软件包管理器1.1 传统安装方式的麻烦:从源代码说起1.2 软件包&…...