Famousmai's blog Famousmai's blog
首页
👍 网站介绍
💯 编程分享
✍️ 生活感悟
🎮 游戏人生
📈 网站动态
💌 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Famous Mai

爱玩辅助的后端小哥
首页
👍 网站介绍
💯 编程分享
✍️ 生活感悟
🎮 游戏人生
📈 网站动态
💌 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 算法

  • 学习笔记

    • Golang学习笔记
    • Docker学习笔记
    • Consul学习笔记
    • Elk学习笔记
    • 数据结构与算法之美
    • Go实操项目学习笔记
      • 第1章 课程介绍与学习指南
        • 架构图
      • 第2章 Go微服务介绍与容器化入门
        • 2-1 微服务基本介绍
        • 什么是微服务
        • 为什么需要微服务
        • 微服务与DDD
        • DDD作用
        • DDD常用概念 - 领域
        • DDD常用概念 - 界限上下文
        • DDD常用概念 - 领域模型
        • DDD域微服务四层架构
        • 微服务的设计原则
        • 2-2 微服务必备技能 Docker入门介绍
        • 为什么需要Docker
        • 应用场景
        • Docker安装
        • Docker的重要概念
        • Docker常用命令
        • 2-3 go-micro基础之 grpc proto
        • RPC是什么?
        • 使用RPC有什么好处?
        • gRPC又是什么?
        • gRPC基本调用流程解析
        • 什么是Protocol Buffers
        • 为什么要使用Protocol Buffers
        • Protocol Buffers 常用概念
        • Protocol Buffers Message中字段修饰符
        • Protocol Buffers 基本语言
        • 如何在Docker中使用Protobuf
        • 2-4 go-micro 组件架构及通讯原理
        • Micro是什么
        • Micro 其中 Runtime(运行时)介绍
        • Micro 其中 Runtime(运行时)组成
        • Micro 其中 Framework(go-micro)介绍
        • Micro 其中 Framework(go-micro)组件
        • Micro 其中 Framework(go-micro)通信图
        • 2-5 go-micro 入门案例编写
        • 1. 编写proto文件
        • 2. 下载 protoc-gen-micro
        • 3. 生成服务文件
        • 4. 编写服务端
        • 5. 编写客户端
      • 第3章 微服务模块开发
        • 3-1 micro new 和 项目目录创建
        • 3-2 go mod 私有化设置 和 gorm 说明
        • 3-3 编写proto并自动生成代码
        • 3-4 domain对数据库和模型进行操作
        • 3-5 编写Handel要暴露的服务
        • 3-6 go-micro开发流程梳理
        • 3-7 dockerfile 打包 user 功能
        • 3-8 章节小结
        • 第4章
    • Paypal对接学习笔记
  • 踩坑记录

  • 面试分享

  • 技术方案文章梳理

  • 设计模式

  • 编程分享
  • 学习笔记
famousmai
2023-02-17
目录

Go实操项目学习笔记

# [2020]Go电商项目+K8s微服务

# 第1章 课程介绍与学习指南

# 架构图

image-20230119122832958

image-20230119122846275

# 第2章 Go微服务介绍与容器化入门

# 2-1 微服务基本介绍

# 什么是微服务

  • 首先他是一种架构模式
  • 相对单体架构,微服务架构更独立,能够单独更新和发布
  • 微服务里面的服务仅仅用于某一个特定的业务功能

# 为什么需要微服务

  • 逻辑清晰
  • 快速迭代
  • 多语言灵活组合

# 微服务与DDD

  • 领域驱动设计(Domain Driven Design,简称DDD)

  • 还有个定律:康威定律(Conway‘s Law)

    组织 ===对应===》 服务拆分

# DDD作用

真正决定软件复杂性的是设计方法

  • 有助于知道我们确定系统便捷
  • 能够聚焦在系统核心元素上
  • 帮助我们拆分系统

# DDD常用概念 - 领域

  • 领域:是有范围界限的,也可以说是有边界的(电商)
  • 子域(商品、用户、订单、销售等)
    • 核心子域:是业务系统的核心价值(销售)
    • 通用子域:所有子域的消费者,提供者通用服务(短信邮件通知)
    • 支撑子域:专注于业务系统的某一重要的业务(除去销售)

# DDD常用概念 - 界限上下文

  • 理解:语文中的语境的意思
  • 方式:领域 + 界限上下文
  • 目的:不在于如何划分边界,而在于如何控制边界

# DDD常用概念 - 领域模型

  • 理解:领域模型是对我们软件系统中要解决问题的抽象表达
  • 领域:反映的是我们业务上需要解决的问题
  • 模型:我们针对该问题提出的解决方案

# DDD域微服务四层架构

image-20230119131555679

image-20230119131630480

# 微服务的设计原则

  • 要领域驱动设计,而不是数据驱动设计,也不是界面驱动设计
  • 要边界清晰的微服务,而不是泥球小单体
  • 要职能清晰的分层,而不是什么都放的大箩筐
  • 要做自己能hold住的微服务,而不是过度拆分的微服务

# 2-2 微服务必备技能 Docker入门介绍

# 为什么需要Docker

  • 软件更新发布及部署抵消,过程繁琐且需要人工介入
  • 环境一致性难以保证,不同环境之间迁移成本太高
  • 构建容易分发简单

image-20230119132418348

# 应用场景

  • 构建运行环境:统一环境
  • 微服务:部署方便
  • CI/CD

# Docker安装

略

# Docker的重要概念

  • 客户端Client:可运行docker指令
  • 服务器进程(Docker Daemon):管理镜像和容器
  • 镜像仓库:存储镜像的仓库

img

# 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基本调用流程解析

image-20230119134155415

image-20230119134212347

# 什么是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个元素

类型

![image-20230119134900217](/Users/mym/Library/Application Support/typora-user-images/image-20230119134900217.png)

# 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

# 如何在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

命令说明

  • $(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(客户端)

image-20230119153536466

# Micro 其中 Framework(go-micro)通信图

image-20230119153654264

# 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. 下载 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

注意

注意 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

# 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

# 第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)
#Go
上次更新: 2023/02/19, 00:03:59
数据结构与算法之美
Paypal对接学习笔记

← 数据结构与算法之美 Paypal对接学习笔记→

最近更新
01
策略模式
03-13
02
单例模式
03-05
03
设计模式介绍
03-05
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式