微服务入门(go)

news2025/7/14 1:40:55

微服务入门(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.coloradmin.cn/o/2286916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

996引擎 - NPC-动态创建NPC

996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本添加自定义音效添加音效文件修改配置参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 多重影分身 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC八门名…

基于MinIO的对象存储增删改查

MinIO是一个高性能的分布式对象存储服务。Python的minio库可操作MinIO,包括创建/列出存储桶、上传/下载/删除文件及列出文件。 查看帮助信息 minio.exe --help minio.exe server --help …

观察者模式和订阅发布模式的关系

有人把观察者模式等同于发布订阅模式,也有人认为这两种模式存在差异,本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较,发布订阅将发布者和观察者之间解耦。(发布订阅有调度中心处理)

(2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文

MacOS Redis Desktop Manager中文版下载 大家好,今天给大家带来一款非常实用的 Redis 可视化工具——Redis Desktop Manager(简称 RDM)。相信很多开发者都用过 Redis 数据库,但如果你想要更高效、更方便地管理 Redis 数据&#x…

Baklib引领内容管理平台新时代优化创作流程与团队协作

内容概要 在迅速变化的数字化时代,内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理,用户能够有效地组织、存储和共享信息,从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台,以其独特的优势和创新功…

Java实现.env文件读取敏感数据

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…

房屋租赁系统在数字化时代中如何重塑租赁服务与提升市场竞争力

内容概要 在当今快速发展的数字化时代,房屋租赁系统的作用愈发重要。随着市场需求的变化,租赁服务正面临着新的挑战与机遇。房屋租赁系统不仅仅是一个简单的管理工具,更是一个能够提升用户体验和市场竞争力的重要平台。其核心功能包括合同管…

C++ ——— 学习并使用 priority_queue 类

目录 何为 priority_queue 类 学习并使用 priority_queue 类 实例化一个 priority_queue 类对象 插入数据 遍历堆(默认是大堆) 通过改变实例化的模板参数修改为小堆 何为 priority_queue 类 priority_queue 类为 优先级队列,其本质就是…

DeepSeek 模型全览:探索不同类别的模型

DeepSeek 是近年来备受关注的 AI 研究团队,推出了一系列先进的深度学习模型,涵盖了大语言模型(LLM)、代码生成模型、多模态模型等多个领域。本文将大概介绍 DeepSeek 旗下的不同类别的模型,帮助你更好地理解它们的特点…

Three.js实现3D动态心形与粒子背景的数学与代码映射解析

一、效果概述 本文通过Three.js构建了一个具有科技感的3D场景,主要包含两大视觉元素: 动态心形模型:采用数学函数生成基础形状,通过顶点操作实现表面弧度。星空粒子背景:随机分布的粒子群组形成空间层次感。复合动画…

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

Autosar-Os是怎么运行的?(时间保护)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 AUTOSAR OS 的四大可定制类型凸显了时间保护(Timing Protection)…

一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例

论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…

5分钟带你获取deepseek api并搭建简易问答应用

目录 1、获取api 2、获取base_url和chat_model 3、配置模型参数 方法一:终端中临时将加入 方法二:创建.env文件 4、 配置client 5、利用deepseek大模型实现简易问答 deepseek-v3是截止博文撰写之日,无论是国内还是国际上发布的大模型中…

算法基础学习——二分查找(附带Java模板)

有单调性的数列一定可以使用二分,没有单调性的题目也可能可以使用二分; (一)整数二分 二分的本质: 在某个整数区间内,存在某种性质使得区间内左半边的数都不满足该性质;而右半边的数都满足该性…

python-leetcode-路径总和

112. 路径总和 - 力扣(LeetCode) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:de…

乐理笔记——DAY01

三分钟音乐社视频地址: 【四川音乐学院作曲硕士】零基础自学音乐学乐理合集-第二季(最终版)/已完结https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&am…

使用DeepSeek技巧:提升内容创作效率与质量

一、引言 在当今快节奏的数字时代,内容创作的需求不断增加,无论是企业营销、个人博客还是学术研究,高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手,凭借其强大的语言生成能力,为创作者…