Go实操项目学习笔记
# [2020]Go电商项目+K8s微服务
# 第1章 课程介绍与学习指南
# 架构图
# 第2章 Go微服务介绍与容器化入门
# 2-1 微服务基本介绍
# 什么是微服务
- 首先他是一种架构模式
- 相对单体架构,微服务架构更独立,能够单独更新和发布
- 微服务里面的服务仅仅用于某一个特定的业务功能
# 为什么需要微服务
- 逻辑清晰
- 快速迭代
- 多语言灵活组合
# 微服务与DDD
领域驱动设计(Domain Driven Design,简称DDD)
还有个定律:康威定律(Conway‘s Law)
组织 ===对应===》 服务拆分
# DDD作用
真正决定软件复杂性的是设计方法
- 有助于知道我们确定系统便捷
- 能够聚焦在系统核心元素上
- 帮助我们拆分系统
# DDD常用概念 - 领域
- 领域:是有范围界限的,也可以说是有边界的(电商)
- 子域(商品、用户、订单、销售等)
- 核心子域:是业务系统的核心价值(销售)
- 通用子域:所有子域的消费者,提供者通用服务(短信邮件通知)
- 支撑子域:专注于业务系统的某一重要的业务(除去销售)
# DDD常用概念 - 界限上下文
- 理解:语文中的语境的意思
- 方式:领域 + 界限上下文
- 目的:不在于如何划分边界,而在于如何控制边界
# DDD常用概念 - 领域模型
- 理解:领域模型是对我们软件系统中要解决问题的抽象表达
- 领域:反映的是我们业务上需要解决的问题
- 模型:我们针对该问题提出的解决方案
# DDD域微服务四层架构

# 微服务的设计原则
- 要领域驱动设计,而不是数据驱动设计,也不是界面驱动设计
- 要边界清晰的微服务,而不是泥球小单体
- 要职能清晰的分层,而不是什么都放的大箩筐
- 要做自己能hold住的微服务,而不是过度拆分的微服务
# 2-2 微服务必备技能 Docker入门介绍
# 为什么需要Docker
- 软件更新发布及部署抵消,过程繁琐且需要人工介入
- 环境一致性难以保证,不同环境之间迁移成本太高
- 构建容易分发简单
# 应用场景
- 构建运行环境:统一环境
- 微服务:部署方便
- CI/CD
# Docker安装
略
# Docker的重要概念
- 客户端Client:可运行docker指令
- 服务器进程(Docker Daemon):管理镜像和容器
- 镜像仓库:存储镜像的仓库
# Docker常用命令
- Docker 仓库操作:pull、push
- Docker 镜像管理:images、rmi、build
- Docker 生命周期管理:run、start、stop、rm
# 2-3 go-micro基础之 grpc proto
# RPC是什么?
- RPC代指原远程过程调用(Remote Produce Call)
- 包含了传输协议和编码(对象序列号)协议
- 允许运行于一台计算机的程序调用另一台计算机的子程序
# 使用RPC有什么好处?
简单、通用、安全、效率
# gRPC又是什么?
- gRPC是一个高性能、开源、通用的RPC框架
- 基于HTTP2.0 协议标准设计开发
- 支持多语言,默认采用 Protocol Buffers 数据序列化协议
# gRPC基本调用流程解析
# 什么是Protocol Buffers
- 是一种轻便高效的徐立华结构化数据的协议
- 通常用在存储数据和需要远程数据通信的程序上
- 跨语言、更小、更快、也更简单
# 为什么要使用Protocol Buffers
- 加速站点之间数据传输速度
- 解决数据传输不规范问题
# Protocol Buffers 常用概念
- Message定义:描述了一个请求或响应的消息格式
- 字段标识:消息的定义中,每个字段都有一个唯一的数值标签
- 常用数据类型:double、float、int32/64、bool、string、bytes
- Service 服务定义:在Service中可以定义RPC服务接口
# Protocol Buffers Message中字段修饰符
- singular:表示成员有0个或者1个,一般省略不写
- repeated:表示该字段可以包含0~N个元素
类型

# Protocol Buffers 基本语言
syntax = "proto3"; // 版本号
package go.micro.service.product; //包名
service Product { // 定义的服务
rpc AddProduct(ProductInfo) returns(ResponseProduct) {}
}
// 一般不要超过15个,否则开辟两个字节来存储
message ProductInfo { // 消息格式
int64 id = 1;
string product_name = 2;
}
message ResponseProduct {
int64 product_id = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 如何在Docker中使用Protobuf
Docker根据 .proto 文件生成微服务文件
$ docker pull cap1573/cap-protoc
$ docker run --rm -v $(PWD):$(PWD) -w $(PWD) \
-e ICODE=CF388DF1EF1C5EB cap1573/cap-protoc \
-I ./ --go_out=./ --micro_out=./ ./*proto
1
2
3
4
2
3
4
命令说明
- $(PWD) :当前目录
- --rm:运行完删除
- -e ICODE=CF388DF1EF1C5EB:带一个环境变量,
CF388DF1EF1C5EB
是慕课教程码
# 2-4 go-micro 组件架构及通讯原理
# Micro是什么
- 是用来构建和管理分布式程序的系统
- Runtime(运行时):用来管理配置,认证,网络等
- Framework(程序开发框架):用来方便编写微服务
- Clients(多语言客户端):支持多语言访问服务端
# Micro 其中 Runtime(运行时)介绍
- 他是工具集,工具名称是“micro”
- 官方 docker 版本是 dokcer pull micro/micro
- 课程扩展版本是 dokcer pull cap1573/cap-micro
# Micro 其中 Runtime(运行时)组成
- api:api网关
- broker:允许异步消息的消息代理
- network:通过微网络服务构建多云网络(不常用,知道就好)
- new:服务模版生成器
- proxy:建立在Go Micro上的透明服务代理
- registry:一个服务资源管理器
- store:简单的状态存储
- web:Web仪表板允许您浏览器服务
# Micro 其中 Framework(go-micro)介绍
- 它是对分布式系统的高度抽象
- 提供分布式系统开发的核心库
- 可插拔的架构,按需使用
# Micro 其中 Framework(go-micro)组件
- 注册(Registry):提供了服务发现机制
- 选择器(Selector):能够实现负载均衡
- 传输(Transport):服务与服务之间通信接口
- Broker:提供异步通信的消息发布/订阅接口
- 编码(Codec):消息传输到两端时进行编码与解码
- Server(服务端)、Client(客户端)
# Micro 其中 Framework(go-micro)通信图
# 2-5 go-micro 入门案例编写
参考:https://github.com/go-micro/generator
# 1. 编写proto文件
syntax = "proto3";
option go_package = "./;cap";
package go.micro.service.imooc;
service Cap {
rpc SayHello(SayRequest) returns(SayResponse) {}
}
message SayRequest {
string message = 1;
}
message SayResponse {
string answer = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2. 下载 protoc-gen-micro
go get github.com/go-micro/generator/cmd/protoc-gen-micro
go install github.com/go-micro/generator/cmd/protoc-gen-micro
1
2
2
注意
注意 protoc-gen-micro 的版本和 go-micro 的版本要对应,否则生成的代码,使用会报错
# 3. 生成服务文件
protoc --plugin=protoc-gen-micro=$GOPATH/bin/protoc-gen-micro --go_out=./newmicro/proto/cap --micro_out=./ewmicro/proto/cap ./newmicro/proto/cap/*proto
1
# 4. 编写服务端
package main
import (
"context"
"fmt"
"go-micro.dev/v4"
imooc "go-project-shop/newmicro/proto/cap"
)
type CapServer struct{}
// SayHello 需要实现的方法
func (c *CapServer) SayHello(ctx context.Context, req *imooc.SayRequest, res *imooc.SayResponse) error {
res.Answer = "冲冲冲:" + req.Message
return nil
}
func main() {
// 创建新的服务
service := micro.NewService(
micro.Name("cap.imooc.server"),
)
// 初始化
service.Init()
// 注册服务
err := imooc.RegisterCapHandler(service.Server(), new(CapServer))
if err != nil {
fmt.Println(err)
return
}
// 运行服务
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 5. 编写客户端
package main
import (
"context"
"fmt"
"go-micro.dev/v4"
imooc "go-project-shop/newmicro/proto/cap"
)
func main() {
service := micro.NewService(
micro.Name("cap.imooc.client"),
)
service.Init()
capImooc := imooc.NewCapService("cap.imooc.server", service.Client())
res, err := capImooc.SayHello(context.TODO(), &imooc.SayRequest{
Message: "全场由老麦买单!"})
if err != nil {
fmt.Println(err)
}
fmt.Println(res.Answer)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 第3章 微服务模块开发
# 3-1 micro new 和 项目目录创建
# 3-2 go mod 私有化设置 和 gorm 说明
# 3-3 编写proto并自动生成代码
protoc --plugin=protoc-gen-micro=$GOPATH/bin/protoc-gen-micro --go_out=./user/proto/user --micro_out=./user/proto/user ./user/proto/user/user.proto
1
# 3-4 domain对数据库和模型进行操作
# 3-5 编写Handel要暴露的服务
# 3-6 go-micro开发流程梳理
# 3-7 dockerfile 打包 user 功能
# 3-8 章节小结
# 第4章
编辑 (opens new window)
上次更新: 2023/02/19, 00:03:59