Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记

概述

如果您没有Golang的基础,应该学习如下前置课程。

  • Golang零基础入门
  • Golang面向对象编程
  • Go Web 基础
  • Go语言开发REST API接口_20240728
  • Go语言操作MySQL开发用户管理系统API教程_20240729
  • Redis零基础快速入门_20231227
  • Go+Redis开发用户管理系统API实战_20240730
  • MongoDB快速入门_20240411
  • Go语言+MongoDB用户管理系统实战_20240730

基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。

课程特色

本教程录制于2024年7月31日,使用Go1.22版本,基于Goland2024进行开发,采用的技术栈比较新。

每节课控制在十分钟以内,课时精简,每节课都是一个独立的知识点,如果有遗忘,完全可以当做字典来查询,绝不浪费大家的时间。

整个课程从如何搭建Go语言gRPC环境讲起,然后如何创建proto文件,如何实现基本的gRPC为辅,如何开发增删改查的用户微服务,层层递进,学习路径平缓。

Golang是当前国内越来越多的企业正在全面转的一门系统级别的高性能的编程语言,比C语言写法更加的简单,比Python性能更加的好,是新时代的C语言,建议每个程序员都掌握!

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第10部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。

课程目录

  • 01 概述
  • 02 搭建Go语言gRPC微服务开发环境
  • 03 下载go-grpc官方的示例代码
  • 04 编写简单的proto文件
  • 05 根据proto文件自动生成Go代码
  • 06 创建grpc的服务端
  • 07 创建grpc的客户端
  • 08 定义用户微服务的proto文件
  • 09 生成用户微服务的go代码
  • 10 开发用户微服务服务端基本代码
  • 11 开发用户微服务客户端的基本代码
  • 12 创建用户表
  • 13 连接到MySQL数据库
  • 14 实现新增用户的微服务方法并测试
  • 15 实现查询所有用户的微服务方法并测试
  • 16 实现根据ID查询用户的微服务方法并测试
  • 17 实现修改用户的微服务方法并测试
  • 18 实现删除用户的微服务方法并测试
  • 19 总结

完整代码

04 编写简单的proto文件

syntax = "proto3";// go项目包的位置
option go_package = "grpc_demo/helloworld";// 包名
package helloworld;// 服务:微服务
service Greeter {// 方法rpc SayHello(HelloRequest) returns (HelloReply) {}
}// 请求对象
message  HelloRequest{// 参数string name = 1; // 1 表示的是参数在第几个位置,从1开始
}// 响应对象
message HelloReply{string message = 1;
}

05 根据proto文件自动生成Go代码

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto

06 创建grpc的服务端

package mainimport ("context""fmt""google.golang.org/grpc"pb "grpc_demo/helloworld""net"
)// 服务对象
type server struct {pb.UnimplementedGreeterServer
}// SayHello 实现方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {fmt.Println("接收到的名字是:", in.Name)return &pb.HelloReply{Message: "你好 " + in.Name}, nil
}func main() {// 创建监听器lis, err := net.Listen("tcp", ":8080")if err != nil {fmt.Printf("failed to listen: %v", err)return}// 构建grpc服务grpcServer := grpc.NewServer()pb.RegisterGreeterServer(grpcServer, &server{})// 启动微服务err = grpcServer.Serve(lis)if err != nil {fmt.Printf("failed to serve: %v", err)}
}

07 创建grpc的客户端

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/helloworld""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewGreeterClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()helloReply, err := client.SayHello(ctx, &pb.HelloRequest{Name: "李四"})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(helloReply.GetMessage())}

08 定义用户微服务的proto文件

syntax = "proto3";// go项目包的位置
option go_package = "grpc_demo/c02_user/proto";// 包名
package proto;// 服务:微服务
service UserMicroService {rpc Add(AddRequest) returns (CommonReply) {}rpc Delete(IdRequest) returns (CommonReply) {}rpc Update(UpdateRequest) returns (CommonReply) {}rpc GetByID(IdRequest) returns (CommonReply) {}rpc GetAll(EmptyRequest) returns (CommonReply) {}
}message  AddRequest{string name = 1;int64 age = 2;
}
message  UpdateRequest{int64 id = 1;string name = 2;int64 age = 3;
}
message  IdRequest{int64 id = 1;
}
message  EmptyRequest{
}message CommonReply{bool status = 1; // 成功或者失败string  message = 2; // 详细信息string  data = 3; // 返回的数据,JSON格式
}

12 创建用户表

drop table if exists user;
create table user
(id   int primary key auto_increment,name varchar(36),age  int
);

14 实现新增用户的微服务方法并测试

这里是微服务服务端的完整代码,后续的只是客户端测试代码。

服务端代码:

package mainimport ("context""database/sql""encoding/json""fmt""github.com/zhangdapeng520/zdpgo_mcrud"_ "github.com/zhangdapeng520/zdpgo_mysql""google.golang.org/grpc"pb "grpc_demo/c02_user/proto""net""strconv"
)var (db  *sql.DBerr error
)func initMySQL() {dbUrl := "root:root@tcp(127.0.0.1:3306)/test"db, err = sql.Open("mysql", dbUrl)if err != nil {fmt.Println(err)return}
}func closeMySQL() {db.Close()
}type User struct {Id   int64  `json:"id"`Name string `json:"name"`Age  int    `json:"age"`
}// 服务对象
type server struct {pb.UnimplementedUserMicroServiceServer
}func (s *server) Add(ctx context.Context, in *pb.AddRequest) (*pb.CommonReply, error) {fmt.Println("接收到的名字是:", in.Name, in.Age)zdpgo_mcrud.Add(db,"user",[]string{"name", "age"},[]interface{}{in.Name, in.Age},)result := &pb.CommonReply{Status:  true,Message: "success",}return result, nil
}func (s *server) GetAll(ctx context.Context, in *pb.EmptyRequest) (*pb.CommonReply, error) {data, _ := zdpgo_mcrud.GetBy(db,"user",[]string{"id", "name", "age"},nil,)jsonData, _ := json.Marshal(data)result := &pb.CommonReply{Status:  true,Message: "success",Data:    string(jsonData),}return result, nil
}func (s *server) GetByID(ctx context.Context, in *pb.IdRequest) (*pb.CommonReply, error) {data, _ := zdpgo_mcrud.GetBy(db,"user",[]string{"id", "name", "age"},map[string]interface{}{"id": in.Id},)jsonData, _ := json.Marshal(data)result := &pb.CommonReply{Status:  true,Message: "success",Data:    string(jsonData),}return result, nil
}func (s *server) Update(ctx context.Context, in *pb.UpdateRequest) (*pb.CommonReply, error) {zdpgo_mcrud.Update(db,"user",strconv.FormatInt(in.Id, 10),[]string{"name", "age"},[]interface{}{in.Name, in.Age},)result := &pb.CommonReply{Status:  true,Message: "success",}return result, nil
}func (s *server) Delete(ctx context.Context, in *pb.IdRequest) (*pb.CommonReply, error) {zdpgo_mcrud.Delete(db,"user",strconv.FormatInt(in.Id, 10),)result := &pb.CommonReply{Status:  true,Message: "success",}return result, nil
}func main() {initMySQL()defer closeMySQL()// 创建监听器lis, err := net.Listen("tcp", ":8080")if err != nil {fmt.Printf("failed to listen: %v", err)return}// 构建grpc服务grpcServer := grpc.NewServer()pb.RegisterUserMicroServiceServer(grpcServer, &server{})// 启动微服务err = grpcServer.Serve(lis)if err != nil {fmt.Printf("failed to serve: %v", err)}
}

客户端代码:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Add(ctx, &pb.AddRequest{Name: "张三", Age: 23})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}

15 实现查询所有用户的微服务方法并测试

服务端代码看地14节课的。

客户端代码:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.GetAll(ctx, &pb.EmptyRequest{})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())fmt.Println(commonReply.GetData())
}

16 实现根据ID查询用户的微服务方法并测试

服务端代码看地14节课的。

客户端代码:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.GetByID(ctx, &pb.IdRequest{Id: 1})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())fmt.Println(commonReply.GetData())
}

17 实现修改用户的微服务方法并测试

服务端代码看地14节课的。

客户端代码:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Update(ctx, &pb.UpdateRequest{Id:   1,Name: "李四333",Age:  24,})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}

18 实现删除用户的微服务方法并测试

服务端代码看地14节课的。

客户端代码:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_demo/c02_user/proto""time"
)func main() {// 创建客户端conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {fmt.Println(err)return}defer conn.Close()// 创建指定微服务的客户端client := pb.NewUserMicroServiceClient(conn)// 调用微服务的方法ctx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Second)defer cancelFunc()commonReply, err := client.Delete(ctx, &pb.IdRequest{Id: 1})if err != nil {fmt.Println(err)return}// 处理响应fmt.Println(commonReply.GetStatus())fmt.Println(commonReply.GetMessage())
}

总结

整个课程从如何搭建Go语言gRPC环境讲起,然后如何创建proto文件,如何实现基本的gRPC为辅,如何开发增删改查的用户微服务,层层递进,学习路径平缓。

通过本套课程,能帮你入门Go语言通过gRPC开发微服务项目的技术。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用PyGo,我是您身边的Python私教~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391930.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构算法经典题目刨析(c语言)】反转链表(图文详解)

💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述: 二、思路分析 : 通过三个指针n1,n2,n3来实现链表的反转 1.首先初始化 n1为…

指针函数和函数指针

文章目录 🍊自我介绍🍊指针函数🍊指针函数回调函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也要…

谷粒商城实战笔记-128-商城业务-商品上架-sku在es中存储模型分析-关键

文章目录 一,Elasticsearch在谷粒商城中的应用1,商城的商品检索2,日志检索 二,谷粒商城ES的商品索引mapping如何设计1,商品索引product的mapping冗余 SPU 信息的原因第一种方案的优缺点:优点:缺…

苍穹外面day13(day10)---订单状态定时处理、来单提醒和客户催单

Spring Task 同学们可以看我这篇文章 Spring Task初学-CSDN博客 订单状态定时处理 新建OrderTask /*** 定时任务类,定时处理订单状态*/ Component Slf4j public class OrderTask {Autowiredprivate OrderMapper orderMapper;/*** 处理超时订单的方法*/Scheduled(c…

SQL数据库备份

转载:数据库备份与还原 1. 以下过程为记录客户单位备份过程。 一般有E盘选择E盘备份,否则选择D盘备份。选中备份文件需要重命名,以防原文件被覆盖。切换选项,选中压缩备份。

网络安全入门教程(非常详细)从零基础入门到精通!

一、引言 在当今高度数字化的时代,网络如同一张无形的大网,将世界紧密连接在一起。然而,在这看似便捷与美好的背后,却隐藏着无数的风险与威胁。网络安全已成为捍卫个人隐私、企业机密乃至国家安全的关键防线。如果您怀揣着对网络世…

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…

Java_微服务

首先介绍一下单体架构与微服务架构: 单体架构: 微服务: SpringCloud: 版本: 标黑部分为目前企业使用最多的版本,因为它支持jdk8、jdk11,下面使用SpringCloud也会使用这个版本。 服务拆分&…

【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾

系列篇章💥 No.文章1【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾2【GLM-4开发实战】Function Call进阶实战:常见挑战之意图识别处理3【GLM-4开发实战】Function Call进阶实战:常见挑战之海量函数处理4【GLM-4开发实…

黑马头条vue2.0项目实战(五)——首页—频道编辑

目录 1. 使用页面弹出层 1.1 页面弹出层简单使用 1.2 创建频道编辑组件 1.3 页面布局 2. 展示我的频道 3. 展示推荐频道列表 3.1 获取所有频道 3.2 处理展示推荐频道 4. 添加频道 5. 编辑频道 5.1 处理编辑状态 5.2 切换频道 5.3 让激活频道高亮 5.4 删除频道 6.…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来,智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展,打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

Python | Leetcode Python题解之第319题灯泡开关

题目: 题解: class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))

C++商店管理系统

代码中使用了C11的特性 后面有些输出(cout输出的)的提示文本是英文,因为懒得敲中文 源码在最后面 文末投票参与一下谢谢 商品数据保存在 items.txt 用户数据保存在 users.txt 实现功能 1.添加商品(商品ID,商品名,库存数量,价格&a…

分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

Liunx 小程序之进度条

Liunx 小程序之进度条 效果前提条件回车和换行缓冲区倒计时 进度条纯进度条模拟下载的进度条Progressbar.hProgressbar.cmain.cmakefile 效果 先来看效果,这其实是一个动态的进度条,后有源码,运行即可: 前提条件 在制作之前有两…

数论基础知识(上)

目录 数学符号 整除与约数 最大公约数(gcd)和最小公倍数(lcm) 质数 (素数) 算术基本定理(唯一分解定理) 约数个数 约数之和 分解质因数(枚举法) 试除法求约数(枚举法) 数学…

RTSP系列四:RTSP Server/Client实战项目

RTSP系列: RTSP系列一:RTSP协议介绍-CSDN博客 RTSP系列二:RTSP协议鉴权-CSDN博客 RTSP系列三:RTP协议介绍-CSDN博客 RTSP系列四:RTSP Server/Client实战项目-CSDN博客 目录 一、RTSP Server实战项目 1、准备 2、…

F4Pan网盘解析获取下载链接的工具系统源码

F4Pan网盘解析获取下载链接的工具系统源码,F4Pan(下称本项目)使用的接口全部来自于官方,无任何破坏接口的行为,本项目所有代码全部开源,仅供学习参考使用,请遵守相关的法律法规,禁止商用,若无视…

java+springboot+mysql校园二手书销售平台设计与实现00895-计算机毕业设计项目选题推荐(附源码)

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对校园二手书销售平台等问题,对校…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ

序言 之前已经介绍了在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE,私有化部署Llama3模型,并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并 ,详细内容请参考另一篇博客:快速体验LLaMA-Factory 私有化部署和高…