微服務入門(go)

微服務入門(go)

和單體服務對比:里面的服務僅僅用于某個特定的業務

一、領域驅動設計(DDD)

基本概念

領域和子域

領域:有范圍的界限(邊界)

子域:劃分的小范圍

核心域:業務系統的核心價值

通用子域:為所有子域提供通用子域

支撐子域:專注于業務的某一重要子域

舉例:

  • 電商——>領域
  • 商品子域,訂單子域,銷售子域……——子域
  • 銷售子域——核心子域
  • 郵件子域,短信子域——通用子域
界限上下文

目的:如何控制邊界

領域模型

領域:對需要解決問題的抽象

模型:針對問題提出的解決方案

DDD域微服務四層架構

領域服務四層架構主要分為接口層,應用層,領域層,基礎層四個部分

完整的DDD微服務相關的流程如下:

微服務架構

ps:要領域驅動,而不是數據驅動設計,也不是界面驅動設計

(確實一般的都是數據驅動設計)

ps:要邊界清晰,而不是很小的單體,也不能過度拆分

二、Docker

為什么需要docker:

  • 部署更新低效
  • 環境一致性難保證
  • 構建容易分發難(環境上的復刻)
應用場景
  • 構建運行環境
  • 微服務
  • CICD(持續集成和部署)
重要概念
  • client——可以運行docker的命令
  • 服務器進程——管理鏡像和容器
  • 鏡像倉庫——存儲鏡像的倉庫
docker架構的示意圖
Docker架構

ps : docker daemon:docker的守護進程

Docker常用命令

◆Docker 倉庫操作:pull,push
◆Docker 鏡像管理:images,rmi,build
◆Docker生命周期管理:run,start,stop,rm

查看docker版本

image-20250129031550252

sudo docker version
拉取鏡像
sudo docker pull nginx

出現了報錯

image-20250129031733969

報錯解決方案

按順序執行下面的代碼(主要功能是修改了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

再次拉取

image-20250129032019087

成功!

查看現有的鏡像
docker images

image-20250129032143878

查看在運行的鏡像

image-20250129032253824

三、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 類型描述
doublefloat64雙精度浮點數,64 位
floatfloat32單精度浮點數,32 位
int32int32有符號整型,32 位
int64int64有符號整型,64 位
uint32uint32無符號整型,32 位
uint64uint64無符號整型,64 位
sint32int32有符號整型,32 位,采用 ZigZag 編碼,適合存儲負數
sint64int64有符號整型,64 位,采用 ZigZag 編碼,適合存儲負數
fixed32uint32無符號整型,32 位,占用固定 4 字節存儲
fixed64uint64無符號整型,64 位,占用固定 8 字節存儲
sfixed32int32有符號整型,32 位,占用固定 4 字節存儲
sfixed64int64有符號整型,64 位,占用固定 8 字節存儲
boolbool布爾值,表示 truefalse
stringstringUTF-8 編碼的字符串
bytes[]byte二進制數據
枚舉類型 (enum)自定義生成的枚舉類型Protobuf 枚舉會在 Go 中生成一個對應的枚舉類型
消息類型 (message)自定義生成的結構體類型Protobuf 消息會在 Go 中生成一個對應的結構體類型
編寫protocol buffer的格式規范

image-20250129035420452

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文件地址

image-20250129100651751

生成的文件的效果如下image-20250129100715408

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結構圖

image-20250129101847399

消息通信架構圖

image-20250129102002745

省略了codec

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67457.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析 Linux 內核內存管理核心:mm/memory.c

在 Linux 內核的眾多組件中,內存管理模塊是系統性能和穩定性的關鍵。mm/memory.c 文件作為內存管理的核心實現,承載著頁面故障處理、頁面表管理、內存區域映射與取消映射等重要功能。本文將深入探討 mm/memory.c 的設計思想、關鍵機制以及其在內核中的作用,幫助讀者更好地理…

安卓通過網絡獲取位置的方法

一 方法介紹 1. 基本權限設置 首先需要在 AndroidManifest.xml 中添加必要權限&#xff1a; xml <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /&g…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(二)SSH連接的三種方式】

B站同步視頻教程&#xff1a;https://www.bilibili.com/video/BV1m5wUeyEQD/ 在Jetson設備上配置YOLOv11環境時&#xff0c;SSH連接是實現遠程高效開發與管理的關鍵一環。不同的網絡環境和硬件配置可能會影響SSH連接的方式&#xff0c;本文將結合相關視頻內容&#xff0c;詳細…

視頻拼接,拼接時長版本

目錄 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg imageio&#xff0c;適合視頻較短 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg import subprocess import glob import os from nats…

Vue.js 什么是 Composition API?

Vue.js 什么是 Composition API&#xff1f; 今天我們來聊聊 Vue 3 引入的一個重要特性&#xff1a;組合式 API&#xff08;Composition API&#xff09;。如果你曾在開發復雜的 Vue 組件時感到代碼難以維護&#xff0c;那么組合式 API 可能正是你需要的工具。 什么是組合式 …

Selenium配合Cookies實現網頁免登錄

文章目錄 前言1 方案一&#xff1a;使用Chrome用戶數據目錄2 方案二&#xff1a;手動獲取并保存Cookies&#xff0c;后續使用保存的Cookies3 注意事項 前言 在進行使用Selenium進行爬蟲、網頁自動化操作時&#xff0c;登錄往往是一個必須解決的問題&#xff0c;但是Selenium每次…

計算機畢業設計Python+知識圖譜大模型AI醫療問答系統 健康膳食推薦系統 食譜推薦系統 醫療大數據 機器學習 深度學習 人工智能 爬蟲 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

關于el-table翻頁后序號列遞增的組件封裝

需求說明&#xff1a; 項目中經常會用到的一個場景&#xff0c;表格第一列顯示序號&#xff08;1、2、3...&#xff09;&#xff0c;但是在翻頁后要遞增顯示序號&#xff0c;例如10、11、12&#xff08;假設一頁顯示10條數據&#xff09;&#xff0c;針對這種情況&#xff0c;封…

Elasticsearch的索引生命周期管理

目錄 說明零、參考一、ILM的基本概念二、ILM的實踐步驟Elasticsearch ILM策略中的“最小年齡”是如何計算的&#xff1f;如何監控和調整Elasticsearch ILM策略的性能&#xff1f; 1. **監控性能**使用/_cat/thread_pool API基本請求格式請求特定線程池的信息響應內容 2. **調整…

AI大模型開發原理篇-3:詞向量和詞嵌入

簡介 詞向量是用于表示單詞意義的向量&#xff0c; 并且還可以被認為是單詞的特征向量或表示。 將單詞映射到實向量的技術稱為詞嵌入。在實際應用中&#xff0c;詞向量和詞嵌入這兩個重要的NLP術語通常可以互換使用。它們都表示將詞匯表中的單詞映射到固定大小的連續向量空間中…

[內網安全] 內網滲透 - 學習手冊

這是一篇專欄的目錄文檔&#xff0c;方便讀者系統性的學習&#xff0c;筆者后續會持續更新文檔內容。 如果沒有特殊情況的話&#xff0c;大概是一天兩篇的速度。&#xff08;實驗多或者節假日&#xff0c;可能會放緩&#xff09; 筆者也是一邊學習一邊記錄筆記&#xff0c;如果…

【學術會議征稿-第二屆生成式人工智能與信息安全學術會議(GAIIS 2025)】人工智能與信息安全的魅力

重要信息 時間&#xff1a;2025年2月21日-23日 地點&#xff1a;中國杭州 官網&#xff1a;http://www.ic-gaiis.org 簡介 2025年第二屆生成式人工智能與信息安全將于 2025年2月21日-23日在中國杭州舉行。主要圍繞“生成式人工智能與信息安全”的最新研究展開&#xff0c;…

Vscode的AI插件 —— Cline

簡介 vscode的一款AI輔助吃插件&#xff0c;主要用來輔助創建和編輯文件&#xff0c;探索大型項目&#xff0c;使用瀏覽器并執行終端命令&#xff08;需要多個tokens&#xff09;&#xff0c;可以使用模型上下文協議&#xff08;MCP&#xff09;來創建新工具并擴展自己(比較慢…

2024 CVPR Highlight Learning-Feedback

圖像增強 Towards Robust Event-guided Low-Light Image Enhancement: A Large-Scale Real-World Event-Image Dataset and Novel Approach 解決的主要問題是低光照條件下的圖像增強 通過多尺度整體融合分支提取事件和圖像的結構和紋理信息&#xff0c;并引入信噪比&#xff0…

小白一命速通JS中的windowglobal對象

筆者注意到JS中的window對象與global對象經常被混淆&#xff0c;盡管它們在相當一部分使用情況下可以等同&#xff0c;但是本質上仍然存在很多不同&#xff0c;下面是對于兩者的詳細拆解 1. window 對象 定義&#xff1a;window 對象表示 瀏覽器環境中的全局上下文。作用域&am…

機器學習2 (筆記)(樸素貝葉斯,集成學習,KNN和matlab運用)

樸素貝葉斯模型 貝葉斯定理&#xff1a; 常見類型 算法流程 優缺點 集成學習算法 基本原理 常見方法 KNN&#xff08;聚類模型&#xff09; 算法性質&#xff1a; 核心原理&#xff1a; 算法流程 優缺點 matlab中的運用 樸素貝葉斯模型 樸素貝葉斯模型是基于貝葉斯…

HTB:Active[RE-WriteUP]

目錄 連接至HTB服務器并啟動靶機 信息收集 使用rustscan對靶機TCP端口進行開放掃描 將靶機TCP開放端口號提取并保存 使用nmap對靶機TCP開放端口進行腳本、服務掃描 使用nmap對靶機TCP開放端口進行漏洞、系統掃描 使用nmap對靶機常用UDP端口進行開放掃描 使用nmap對靶機…

Git圖形化工具【lazygit】

簡要介紹一下偶然發現的Git圖形化工具——「lazygit」 概述 Lazygit 是一個用 Go 語言編寫的 Git 命令行界面&#xff08;TUI&#xff09;工具&#xff0c;它讓 Git 操作變得更加直觀和高效。 Github地址&#xff1a;https://github.com/jesseduffield/lazygit 主要特點 主要…

58.界面參數傳遞給Command C#例子 WPF例子

界面參數的傳遞&#xff0c;界面參數是如何從前臺傳送到后臺的。 param 參數是從界面傳遞到命令的。這個過程通常涉及以下幾個步驟&#xff1a; 數據綁定&#xff1a;界面元素&#xff08;如按鈕&#xff09;的 Command 屬性綁定到視圖模型中的 RelayCommand 實例。同時&#x…

selenium定位網頁元素

1、概述 在使用 Selenium 進行自動化測試時&#xff0c;定位網頁元素是核心功能之一。Selenium 提供了多種定位方法&#xff0c;每種方法都有其適用場景和特點。以下是通過 id、linkText、partialLinkText、name、tagName、xpath、className 和 cssSelector 定位元素的…