微服务入门(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.rhkb.cn/news/9731.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏: 游戏结束: 二、游戏如何操作 通过监听键盘的操作,进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动,如果有两块一样的方块,就进行合并,并且在键盘每操作…

ASP.NET代码审计 SQL注入篇(简单记录)

sql注入,全局搜索 Request QueryString ToString() select select * aspx是设计页面,而aspx.cs是类页面,也就是说设计页面用到的类信息在这个页面里面,其实就是把设计和实现分离开来。 源码 using System; using System.Collect…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包,它应…

C++中的类与对象(中)

在上一节中,我们初步了解了一下,C中的类,这一概念,这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点: 1.2 析构函数 析构函数的特点: 1.3 …

机器人抓取与操作概述(深蓝)——1

工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知: 函数名就是函数的地址 &函数名也可以拿到函…

基于Springboot的智能学习平台系统【附源码】

基于Springboot的智能学习平台系统 效果如下: 系统登陆页面 系统主页面 课程详情页面 论坛页面 考试页面 试卷管理页面 考试记录页面 错题本页面 研究背景 随着互联网技术的普及,人们探索知识的方式逐渐转向数字化平台。传统的教学方法通常局限于固定…

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…

网关登录校验

网关登录校验 单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,不再共享数据。也就意味着每个微服务都需要做登录校验,这显然不可取。 鉴权思路分析 …

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

【已解决】黑马点评项目Redis版本替换过程的数据迁移

黑马点评项目Redis版本替换过程的数据迁移 【哭哭哭】附近商户中需要用到的GEO功能只在Redis 6.2以上版本生效 如果用的是老版本,美食/KTV的主页能正常返回,但无法显示内容 上次好不容易升到了5.0以上版本,现在又用不了了 Redis 6.2的windo…

本地部署deepseek模型步骤

文章目录 0.deepseek简介1.安装ollama软件2.配置合适的deepseek模型3.安装chatbox可视化 0.deepseek简介 DeepSeek 是一家专注于人工智能技术研发的公司,致力于打造高性能、低成本的 AI 模型,其目标是让 AI 技术更加普惠,让更多人能够用上强…

[论文总结] 深度学习在农业领域应用论文笔记14

当下,深度学习在农业领域的研究热度持续攀升,相关论文发表量呈现出迅猛增长的态势。但繁荣背后,质量却不尽人意。相当一部分论文内容空洞无物,缺乏能够落地转化的实际价值,“凑数” 的痕迹十分明显。在农业信息化领域的…

快速分析LabVIEW主要特征进行判断

在LabVIEW中,快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征,从而帮助开发者在编写和优化程序时做出及时的判断,避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…

展示统计信息收集情况

看看最近是否收集失败 SET LINES 200 PAGES 0 SET LONG 100000 longc 100000 COLUMN REPORT FORMAT A200VARIABLE stat_report CLOB; BEGIN:stat_report : DBMS_STATS.REPORT_STATS_OPERATIONS (since > SYSDATE-3 , until > SYSDATE , detail_lev…

STM32 TIM输入捕获 测量频率

输入捕获简介: IC(Input Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…

如何将 Windows 上的文件传递到 Mac 上

文章目录 效果需求Windows 上设置共享磁盘【可选】新建一个带有密码的账户查看 Windows 的 IP 地址Mac 上链接 Windows 共享的磁盘 效果 需求 Windows 上有一个有密码的账户 Windows 上设置共享磁盘 windows 这边需要用 Administrator 权限的账号,把要共享的磁盘设…

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异: 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…

ODP(OBProxy)路由初探

OBProxy路由策略 Primary Zone 路由 官方声明默认情况,会将租户请求发送到租户的 primary zone 所在的机器上,通过 Primary Zone 路由可以尽量发往主副本,方便快速寻找 Leader 副本。另外,设置primary zone 也会在一定成都上减少…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组(列方向)vstack竖直堆叠序列中的数组(行方向) 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…