微服务入门(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.mzph.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 定位元素的…