微服務入門(go)
和單體服務對比:里面的服務僅僅用于某個特定的業務
一、領域驅動設計(DDD)
基本概念
領域和子域
領域:有范圍的界限(邊界)
子域:劃分的小范圍
核心域:業務系統的核心價值
通用子域:為所有子域提供通用子域
支撐子域:專注于業務的某一重要子域
舉例:
- 電商——>領域
- 商品子域,訂單子域,銷售子域……——子域
- 銷售子域——核心子域
- 郵件子域,短信子域——通用子域
界限上下文
目的:如何控制邊界
領域模型
領域:對需要解決問題的抽象
模型:針對問題提出的解決方案

領域服務四層架構主要分為接口層,應用層,領域層,基礎層四個部分
完整的DDD微服務相關的流程如下:

ps:要領域驅動,而不是數據驅動設計,也不是界面驅動設計
(確實一般的都是數據驅動設計)
ps:要邊界清晰,而不是很小的單體,也不能過度拆分
二、Docker
為什么需要docker:
- 部署更新低效
- 環境一致性難保證
- 構建容易分發難(環境上的復刻)
應用場景
- 構建運行環境
- 微服務
- CICD(持續集成和部署)
重要概念
- client——可以運行docker的命令
- 服務器進程——管理鏡像和容器
- 鏡像倉庫——存儲鏡像的倉庫
docker架構的示意圖

ps : docker daemon:docker的守護進程
Docker常用命令
◆Docker 倉庫操作:pull,push
◆Docker 鏡像管理:images,rmi,build
◆Docker生命周期管理:run,start,stop,rm
查看docker版本
sudo docker version
拉取鏡像
sudo docker pull nginx
出現了報錯
報錯解決方案
按順序執行下面的代碼(主要功能是修改了docker的配置文件)
vim /etc/docker/daemon.json
進入了這個(可能是空白的)文件后輸入:
{"registry-mirrors": ["https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com","https://docker.m.daocloud.io","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://your_preferred_mirror","https://dockerhub.icu","https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]
}
重新加載配置文件和重啟docker服務
systemctl daemon-reload
systemctl restart docker
再次拉取
成功!
查看現有的鏡像
docker images
查看在運行的鏡像
三、go-mirco
rpc
遠程過程調用,包含了傳輸協議和編碼協議,不同計算機之間的程序可以進行調用
grpc
基于http2.0,是Google開發的,默認支持protocol buffers數據序列化協議
protocol buffers
是一種輕便高效的結構化數據的協議,通常用于存儲數據和需要遠程數據通信的程序上
優勢:跨語言,更小,更快,更簡單
常用概念
- message:描述了一個請求或者響應的消息格式
- 字段標識:消息的定義中,每個字段都有唯一的數值標簽
(不可以重復)
- 常用數據類型:double,float,int32/int64,bool,string,bytes
- Service服務的定義:在service里面可以定義一個rpc服務接口
Protocol Buffers 數據類型與 Go 數據類型的對應
Protocol Buffers 類型 | Go 類型 | 描述 |
---|---|---|
double | float64 | 雙精度浮點數,64 位 |
float | float32 | 單精度浮點數,32 位 |
int32 | int32 | 有符號整型,32 位 |
int64 | int64 | 有符號整型,64 位 |
uint32 | uint32 | 無符號整型,32 位 |
uint64 | uint64 | 無符號整型,64 位 |
sint32 | int32 | 有符號整型,32 位,采用 ZigZag 編碼,適合存儲負數 |
sint64 | int64 | 有符號整型,64 位,采用 ZigZag 編碼,適合存儲負數 |
fixed32 | uint32 | 無符號整型,32 位,占用固定 4 字節存儲 |
fixed64 | uint64 | 無符號整型,64 位,占用固定 8 字節存儲 |
sfixed32 | int32 | 有符號整型,32 位,占用固定 4 字節存儲 |
sfixed64 | int64 | 有符號整型,64 位,占用固定 8 字節存儲 |
bool | bool | 布爾值,表示 true 或 false |
string | string | UTF-8 編碼的字符串 |
bytes | []byte | 二進制數據 |
枚舉類型 (enum) | 自定義生成的枚舉類型 | Protobuf 枚舉會在 Go 中生成一個對應的枚舉類型 |
消息類型 (message) | 自定義生成的結構體類型 | Protobuf 消息會在 Go 中生成一個對應的結構體類型 |
編寫protocol buffer的格式規范
protocal buffer示例
syntax = "proto3";package go.mirco.service.product;
option go_package = "./;product";
service Product {rpc AddProduct (ProductInfo) returns (ResponseProduct){}
}message ProductInfo {int64 id = 1 ;string product_name = 2 ;// 盡量用1-15,超過15會用倆字節去裝
}message ResponseProduct{int64 product_id = 1 ;}
生成對應的.go和.micro.go文件
打開終端,輸入以下命令:
protoc --go_out=./ --micro_out=./ ./proto/account/account.proto
上面的命令執行后,我們會發現同級目錄多了兩個go文件,這就是自動生成好的編譯之后的文件。
命令解釋
- –go_out 指定當前的目錄./
- –micro_out 指定當前micro目錄./
- ./proto/account/account.proto 指定要編譯的.proto文件地址
生成的文件的效果如下
go-mirco
mirco
是用于構建和管理分布式程序的生態系統
組成部分:
-
runtime(運行時)——管理認證,配置,網絡等
是一個工具集,名稱是“micro”
安裝版本復雜, 所以一般是用docker安裝和配置
組成:
- api:api網關
- broker:異步消息的代理
- network:網絡工具集(不常用)
- new:服務模版生成器(重要)
- proxy:建立在go-mirco的透明代理
- registry:服務資源管理器(通過注冊表的方式)
- store:簡單狀態存儲
- web:儀表盤,可以瀏覽自己的服務
-
framework(程序開發框架)——便于編寫微服務
-
clients(多語言的客戶端)
go-mirco
是對分布式系統的高度抽象,提供分布式系統開發的核心庫,屬于可插拔按需使用的架構
組件
- 注冊registry:提供服務發現機制
- 選擇器selector:實現負載均衡
- 傳輸transport:服務與服務的通信組件
- broker:異步消息發布訂閱的接口
- codec:消息的編碼和解碼
- server:服務端
- client:客戶端
go-mirco結構圖
消息通信架構圖
省略了codec