当前位置:首页 > 服务端 > Golang 微服务入门

Golang 微服务入门

2022年11月09日 22:24:50服务端22

1 微服务的目标

  • 微服务的精髓在于服务拆分
    • 如何拆分才能粒度合适,不会太细,也不会太大
    • 如何确认服务边界
    • 如何拆才能高内聚低耦合
    • 如何拆分才能降低开发复杂度
    • 如何拆分提高系统承载能力
    • 如何拆分才利于团队之间的协作开发

2 微服务的基本需求

  1. HTTP REST、RPC
  2. 日志功能
  3. 限流
  4. API监控
  5. 服务注册与发现
  6. API网关
  7. 服务链路追踪
  8. 服务熔断和降级

3 AKF扩展立方体理论

AKF扩展立方体(Scalability Cube),是《架构即未来》一书中提出的可扩展模型,这个立方体有三个轴线,每个轴线描述扩展性的一个维度,他们分别是产品、流程和团队:

  • X轴 —— 代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上;

  • Y轴 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分;

  • Z轴 —— 关注服务和数据的优先级划分,如分地域划分。

Golang 微服务入门 _ JavaClub全栈架构师技术笔记

3.1 X轴扩展

  • 对于应用,直接复制原有的单体服务组成集群,通过网关负载均衡到不同主机上,从而提高容量。
  • 对于数据库,从单库,水平克隆为多个库上读,一个库写,通过数据库的自我复制实现,要允许一定的读写时延。
  • 该方法适用于系统初期扩容,成本低,随着流量的继续增大,会触及数据库读写瓶颈。

3.2 Y轴扩展

  • 对于应用,面向服务分割,基于功能或者服务分割,例如电商网站可以将登陆、搜索、下单等服务进行Y轴的拆分,变为分布式系统,每一组服务再进行X轴的扩展。
  • 对于数据,根据不同的信息类型,分割为不同的数据库,即分库,例如产品库,用户库等。
  • 适用于业务复杂,数据量大,代码耦合度高,团队规模大,可以解决指令集和数据集的约束,解决代码复杂度问题,可以实现隔离故障,可以提高响应时间,可以使团队聚焦更利于团队成长,成本较高。

3.3 Z轴扩展

  • 面向查找分割,基于用户、请求或者数据分割,例如可以将不同产品的SKU分到不同的搜索服务,可以将用户哈希到不同的服务等。
  • 按照一定算法,进行分片,例如将搜索按照MapReduce的原理进行分片,把SKU的数据按照不同的哈希值进行分片存储,每个分片再进行X轴冗余。
  • 适用于用户指数级快速增长场景,能解决数据集的约束,降低故障风险,实现渐进交付,可以带来最大的扩展性,成本最昂贵,且不一定能解决指令集的问题。

4 CAP理论

分布式系统的三个目标只能同时保证两个

  • Partition tolerance,中文叫做"分区容错"
  • Consistency 中文叫做"一致性"
  • Availability 中文叫做"可用性"
    Golang 微服务入门 _ JavaClub全栈架构师技术笔记

一般来说,单点故障服务崩溃是不能被容忍的,因此都能满足分区容错性,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

  • 分区容错性很好理解,不把鸡蛋放同一个篮子里,服务的这台主机崩了,还有别的主机继续提供服务。
  • 什么是一致性?
    考虑数据库读写分离主从双备份的情况,写数据在主节点进行,然后通过Bin log同步到多个从节点,应用往主节点写入成功后,立即去从节点读取,如果主从节点之间的同步恰好卡顿,则无法从从节点读到刚返回的数据,那么就不满足一致性。
  • 什么是可用性?
    当一个请求到达一个服务时,服务应该快速响应(注意是分布式系统中,可能用千万级亿级用户)。

那么为什么一致性和可用性之间存在矛盾?

  • 还是考虑上述场景,为了保证服务的一致性,当用户往主节点写入数据,为了保证一致性,要先对从节点加锁,不让从节点读,然后主节点进行数据的写,然后数据往从节点同步,同步成功后返回给主节点,主节点接受到同步成功信号后释放锁,使得从节点可以读。
  • 在这样的前提下,服务的性能低于单机服务,因此在用户量大,数据量大时根本无法做到及时响应。
  • 相反,为了及时响应,那么服务之间的同步和用户的请求之间是异步的,那就无法满足数据的实时一致性。

因为可用性相比于一致性,更为重要,因此主流的做法是在满足 AP的同时,提高C,常用的方法如 最终一致性方案、TCC事务补偿型方案 和 最大努力通知型。

5 缓存和异步

缓存从用户端到CPU寄存器依次有

  • 浏览器或客户端对静态资源的缓存
  • 操作系统对某些网络资源的缓存
  • CDN对静态资源的缓存
  • 服务端 Session 对当前用户热数据的缓存
  • 服务端运行节点缓存
  • 服务端的外部缓存,如Redis
  • 服务端内存与CPU的二级缓存
  • 二级缓存与寄存器

异步的作用

  • 用户消息落库,日志落库等不要求实时性的场景
  • B端批量离线任务,降低对后端服务如数据库的压力,削峰填谷,减少短时间高流量对服务的压力
  • 常用的异步中间件: Kafka,Rocket MQ,Rabbit MQ等

6 Golang 微服解决方案

[TBC]

7 友情链接

  1. https://www.cnblogs.com/guanghe/p/10978349.html
  2. https://www.jianshu.com/p/d08d0c14810f
  3. https://www.ruanyifeng.com/blog/2018/07/cap.html
  4. https://carc.top/post/94.html
  5. https://zhuanlan.zhihu.com/p/71093510
  6. https://www.jianshu.com/p/cffe039fa060

作者:tim5wang
来源链接:https://blog.csdn.net/sinat_34820292/article/details/117166449

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/69052.html

标签: 微服务Go
分享给朋友:

“Golang 微服务入门” 的相关文章

go mod 相关的八个命令

该go mod命令用于对模块执行操作。八个go mod命令是: 命令 手术 用法 download 将模块下载到本地缓存(GOPATH/pkg...

学习go语言国内最全资料链接

就最近和各位大佬认识下来,以前觉得学习go语言,可能资料比较少,可是后来才发现,原来资料并不少,甚至可以说通过大家的努力,go社区已经非常包容且完善了 接下来会推荐一些资料,以及大佬 就最近和各位大佬认识下来,以前觉得学习go语言,可能资料比...

在运行微服务架构的时候报错error creating bean h name 'advisor'.. Unsatisfied dependency..constructor argument with index 0...

工作的时候遇到了这样的报错信息,提示的错误类没有任何问题,控制台错误日志信息接着往下找 然后就发现了一个数据库映射类的问题,显示mapping问题 接着我就发现这个映射类中有一个list类型的字段,但是它的get方法我没有用@Transient注解进行注释,所以报错了...

[ERROR] Got exception: org.apache.thrift.transport.TTransportException null

[ERROR] Got exception: org.apache.thrift.transport.TTransportException null

最近在使用waggle-dance的thrift服务时,在测试环境运行没有问题,但是到了生产环境出现了这问题. 翻译官方文档的话就是:在某些网络限制阻止从运行 Waggle Dance 的机器到运行 Thrift Hive Metastore 服务的机器的直接连接的情况下...

Kafka启动报错 : ERROR Processor got uncaught exception

Kafka启动报错 : ERROR Processor got uncaught exception

参照我之前的一篇博文Kafka学习之(二)Centos下安装Kafka安装了kafka并启动,状况并不像我之前最初的预期,报错了,并且我在当前Linux环境下安装的Java版本、Kafka版本都是和之前博文一样的,第一感觉难道是因为Linux(Centos)的版本不一致??? ...

Google 推出的 Java 编码规范(转)

原文地址:http://www.dahuatu.com/1225/988516.html 原文地址:http://www.dahuatu.com/1225/988516.html 原文地址:http://www.dahuatu.com/1225/988516.html...

Django的下载和安装

Django的下载和安装

Django的下载和安装 1.官网链接  https://www.djangoproject.com/download/ 2.下载后,解压,将解压包放在Python的安装目录。(前提是安装了Python)   3.进入Django,执...

【golang 必备算法】链表篇

【golang 必备算法】链表篇

203.移除链表元素 力扣链接 创建一个虚拟头节点 func removeElements(head *ListNode, val int) *ListNode { p:=&ListNode{} p.Next=head q:=p for p!=nil&am...

85道Java微服务面试题整理(助力2020面试)

85道Java微服务面试题整理(助力2020面试)

85道Java微服务面试题,哪些你还不会? 微服务 面试题 1、您对微服务有何了解? 2、微服务架构有哪些优势? 3。微服务有哪些特点?...

ERROR Processor got uncaught exception.ERROR Processor got uncaught exception. (kafka.network.Processor) java.lang.ArrayIndexOutOfBoundsException: 18

[2018-11-23 15:35:14,958] ERROR Processor got uncaught exception. (kafka.network.Processor)java.lang.ArrayIndexOutOfBoundsException: 18 at org....

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。