![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Micro Services
文章平均质量分 88
微服务
Wang's Blog
Keep learning for the innovation era.
展开
-
Go微服务: redis分布式锁在集群中可能遇到的问题及其解决方案
我们的 redis 一般都是集群来给我们程序提供服务的,单体的redis现在也不多见看到上面是主节点redis和下面是6个重节点redis,主节点和重节点的通讯都是畅通没问题的这个时候,我们有 gorouting 写我们的数据,那它就会用到我们的setNX写完数据内部是自动同步的,就是你的这个数据通过主节点同步到这些从节点了下面又有我们的 gorouting 去读我们的从节点,但是,我们是在高并发和网络不确定的情况下可能会遇到一些问题。原创 2024-06-21 22:40:03 · 1115 阅读 · 0 评论 -
Go微服务: redis分布式锁保证数据原子操作的一致性
随着云计算和大数据技术的飞速发展,分布式系统已经成为现代IT架构的重要组成部分在分布式系统中,数据的一致性是一个至关重要的挑战,特别是在并发访问和修改共享资源的场景下分布式锁是一种跨进程、跨机器节点的互斥锁,用于控制多个节点对共享资源的访问。其核心目标是确保在分布式系统中,同一时刻只有一个节点能够访问特定的共享资源,从而实现数据的一致性。分布式锁的实现方式多种多样,包括基于数据库、缓存(如Redis)、分布式协调服务(如Zookeeper)等。原创 2024-06-21 18:21:18 · 1418 阅读 · 0 评论 -
Go微服务: redis分布式锁
在分布式系统中,并发控制和数据一致性是至关重要的问题当多个服务或进程需要访问和修改共享资源时,我们必须确保在同一时间只有一个服务或进程能够执行操作,以防止数据竞争和不一致,这就是分布式锁要解决的问题Redis 作为一个高性能的键值存储系统,经常被用作实现分布式锁的工具。Redis 的 SETNX、EXPIRE、DEL 等命令可以组合起来实现一个简单的分布式锁,但是,直接使用这些命令可能会引入一些复杂的逻辑和潜在的错误因此,许多开发者选择使用现成的库来简化分布式锁的实现在 Go 语言中,原创 2024-06-20 23:18:22 · 1021 阅读 · 0 评论 -
Go微服务: 乐观锁
乐观锁(Optimistic Lock)是一种并发控制策略,与悲观锁相对,它基于一种“乐观”的假设,即在大多数情况下,数据访问不会产生并发冲突乐观锁尽量减少锁的使用,从而提高了系统的并发性能,尤其适用于读多写少的场景乐观锁并不在数据访问前进行加锁,而是在数据更新时才检查数据是否被其他事务修改过这种机制假设读操作远多于写操作,而且在大部分情况下,数据在读取和更新之间的这段时间内不会被其他事务修改如果在更新时发现数据已被其他事务修改,则乐观锁通常会抛出异常或返回错误,由应用程序决定如何处理冲突。原创 2024-06-11 23:08:36 · 1104 阅读 · 0 评论 -
Go微服务: 悲观锁
悲观锁,作为并发控制领域的重要概念,广泛应用于数据库管理系统、多线程编程以及其他需要协调资源访问的场景中悲观锁(Pessimistic Lock),顾名思义,基于一种“悲观”的假设,即认为在数据处理过程中,很可能会发生并发冲突因此提前对数据加锁,以防止其他事务或线程的并发修改这种机制牺牲了一定的并发性能,以换取数据的一致性和安全性悲观锁的核心思想在于“先获取锁,再操作”在获取锁的过程中,如果资源已被其他进程锁定,则当前进程必须等待锁释放。原创 2024-06-11 21:08:06 · 819 阅读 · 0 评论 -
Go微服务: 理解分布式锁
我们先看一个场景,到了双11,我们的商户又开始卖商品啦但是,我们的库存是有限的,如果超卖了,可能平台就会涉及相关法律责任了所以,我们的库存扣除问题,一定是一个非常经典的问题先看上图,我们库存服务部署在一台机器上,现在有 2个 Goroutine这个库存是被并发读取的,但是读取后扣除明显是一个异步的问题用 Goroutine 来模拟并发, 2个Goroutine 分别是G1, G2 都去下单,扣减库存一共100件,2个Goroutine查询的时候很可能都还是100。原创 2024-06-10 20:41:54 · 923 阅读 · 0 评论 -
Go微服务: 分布式之发送带有事务消息的示例
不过,如果您的需求是希望消费者也以某种形式参与到事务的最终确认中,比如基于消息的消费结果来决定是否提交事务,这在RocketMQ的标准事务消息模型中并不直接支持。在提供的消费者示例中,尽管它看起来是一个普通的消费者,但实际上它处理的是生产者通过事务消息流程提交后的内容,这符合事务消息的消费逻辑。因此,对于事务消息的消费者来说,其主要职责是消费那些已经被事务提交成功的消息,而不需要直接参与事务的提交或回滚过程。消费者代码看起来与普通消息的消费者相似,但消费的消息实际上是生产者已经提交成功的事务消息。原创 2024-06-09 20:07:20 · 606 阅读 · 0 评论 -
Go微服务: 分布式之通过可靠消息实现最终一致性
比如这个订单服务,无论你是先发送消息,还是先新建订单,它其实都是发送的不可靠消息就是说如果这个消息,像mysql事务那样,只要订单服务不确认,下游就没办法消费如果你这个订单服务挂了,就可以取消这个消息,就不用做这个本地消息表了本地消息表,要有一个这个循环的这么一个查询,高并发的时候,你本地的数据库本身压力就大原创 2024-06-08 13:40:39 · 888 阅读 · 0 评论 -
Go微服务: 分布式之通过本地消息实现最终一致性和最大努力通知方案
我们的业务场景是可以允许我们一段时间有不一致的消息的状态的,并没有说必须特别高的这个消息的一致性比如说在TCC这个架构中,如果采用了消息的最终一致性,整体架构设计要轻松好多即便我们库存服务挂了,或者我们积分服务挂了也没有关系,只要我们有中间的这个消息,那就是没有问题的因为你在消息消费中,如果你你没有消费成功,那么消息就会一直存在在这个消息队列里。原创 2024-06-08 08:25:01 · 556 阅读 · 1 评论 -
Go微服务: 分布式之TCC事务
T: Try 预处理, 尝试执行,完成所有的业务检查,做好一致性,预留必要的业务资源,做好准隔离性C: Confirm 确认,如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务检查, 只使用 try 阶段预留的业务资源C: Cancel 取消,所有的分支中,如果有一个失败了,则走到 Cancel 的阶段,Cancel 就释放了 Try 阶段预留的业务资源所以,Confirm 和 Cancel 是互斥的,只会执行一个,按照TCC的协议,Confirm原创 2024-06-07 21:53:44 · 654 阅读 · 0 评论 -
Go微服务: 基于使用场景理解分布式之二阶段提交
二阶段提交(Two-Phase Commit,2PC)是一种分布式事务协议,用于在分布式系统中确保多个参与者的操作具有原子性即所有参与者要么全部提交事务,要么全部回滚事务,以维持数据的一致性它分为两个阶段进行:第一阶段:准备阶段(Prepare Phase),第二阶段:提交阶段(Commit Phase)原创 2024-06-07 19:15:00 · 490 阅读 · 0 评论 -
Go微服务: 关于分布式系统中的常见问题,分布式事务,以及常用解决方案
在当今的互联网时代,分布式系统已成为支撑大规模服务、高并发和高性能应用的基石它们通过网络连接多台计算机,协同工作,共同完成任务,但这也引入了诸如数据一致性、网络延迟、容错性等挑战解决这些问题的关键在于设计和实施有效的分布式协议分布式很重要,因为微服务中需要用到分布式。原创 2024-06-06 23:02:14 · 1383 阅读 · 0 评论 -
Go微服务: 分布式Cap定理和Base理论
CAP理论C: 一致性,是站在分布式的角度,要么读取到数据,要么读取失败,比如数据库主从,同步时的时候加锁,同步完成才能读到同步的数据,同步完成,才返回数据给程序,这样就能解决数据不一致的问题,简单来说,就是保证数据最新A: 可用性,任何客户端请求,都能得到响应式数据,不会出现响应错误,但可能不包含最新的写入数据,简单来说,就是保证数据不出错P: 分区容错性,由于分布式系统都是通过网络通信的,网络是不可靠的,当任意数量的消息丢失或延迟到达的时候,系统仍然提供服务, 不会挂掉,简单说,就是一直运行,不管原创 2024-06-06 21:12:34 · 669 阅读 · 0 评论 -
Go微服务: 基于rocketmq:5.2.0搭建RocketMQ环境,以及示例参考
参考最新官方文档:https://rocketmq.apache.org/zh/docs/quickStart/03quickstartWithDockercompose以及:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard综合以上两个文档来搭建环境原创 2024-06-05 22:55:23 · 1158 阅读 · 0 评论 -
Go微服务: 基于rocketmq:server和rocketmq:broker搭建RocketMQ环境,以及生产消息和延迟消费消息的实现
以上是简单的环境搭建和生产消息,以及延迟消费消息的 demo 示例实际场景中,结合以上demo,对一些异步发送消息的场景进行灵活运用和升级。原创 2024-06-05 15:45:50 · 687 阅读 · 0 评论 -
Go微服务: 关于消息队列的选择和分类以及使用场景
在分布式系统和微服务架构中,消息队列(Message Queue)是一个核心组件,用于在不同的应用程序或服务之间异步传递消息在 Go 语言中,有多种实现消息队列的方式,包括使用开源的消息队列服务(如 RabbitMQ、Kafka、RocketMQ)和 基于 Go 语言的消息队列库。原创 2024-06-04 20:26:53 · 1194 阅读 · 1 评论 -
Go微服务: 基于Docker搭建Kong网关环境
在当今的微服务架构中,API网关扮演着至关重要的角色,它作为系统的统一入口负责处理所有内外部请求,实现路由转发、负载均衡、安全控制、限流熔断等多种功能Kong,作为一个开源、高性能、可扩展的API网关,凭借其强大的插件系统和易于部署的特性,成为了众多企业和开发者的首选Kong的插件架构使得其功能扩展变得非常简单,用户可以根据自己的需求选择合适的插件来满足业务需求在微服务架构日益盛行的今天,API网关成为了连接客户端与后端服务的关键组件。原创 2024-05-31 19:00:00 · 1002 阅读 · 0 评论 -
Go微服务: 封装nacos-sdk-go的v2版本与应用
基于前文:[https://active.blog.csdn.net/article/details/139213323](https://active.blog.csdn.net/article/details/139213323)- 我们基于此SDK提供的API封装一个公共方法来用于生产环境封装 nacos-sdk-go- 我们封装一个 nacos.go 文件, 这个是通用的工具库原创 2024-05-29 23:42:36 · 840 阅读 · 0 评论 -
Go微服务: Nacos的搭建和基础API的使用
Nacos 概述文档:https://nacos.io/docs/latest/what-is-nacos/搭建:https://nacos.io/docs/latest/quickstart/quick-start-docker/有很多种搭建方式,我们这里使用 docker 来搭建Nacos 的搭建这里,我们选择单机模式,简单些,仅仅做一些示例创建 docker-compose.yaml原创 2024-05-26 22:44:52 · 967 阅读 · 0 评论 -
Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)
现在,我们使用consul客户端的api来把GRPC服务实现注册到consul上,非Go-Micro的形式其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装我们使用consul/api来进行展示。原创 2024-05-26 08:35:28 · 503 阅读 · 0 评论 -
Go微服务: Http服务注册在Consul的示例(非Go-Micro)
现在,我们使用consul客户端的api来实现注册到consul上,非Go-Micro的形式其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装我们使用consul/api来进行展示。原创 2024-05-26 08:21:35 · 422 阅读 · 0 评论 -
Go微服务: 日志系统ELK的应用
概述基于前文,我们已经了解并搭建完成ELK的所有环境了,现在我们来结合应用程序来使用ELK参考前文:https://active.blog.csdn.net/article/details/138898538封装日志模块在通用工具模块: gitee.com/go-micro-services/common 这个包是通用的工具包新增 zap.go原创 2024-05-16 19:22:42 · 1058 阅读 · 0 评论 -
Go微服务: 日志系统ELK核心架构设计
3 )Logstash-Filter 数据中间件处理插件 grok (可解析任意文本数据)4 )Filebeat 如何保证事件至少被输出一次。1 )Logstash-Input 阶段常见的输入。1 )ELK docker-compose 编写。5 )filebeat.yml 文件的配置样例。4 )Logstash-Output 数据输出。2 )Logstash-Input 常用样例。3 )Beats 的六种主要工具。1 )为什么需要日志系统。4 )ELK 系统的特点。5 )ELK 架构图。原创 2024-05-15 20:00:29 · 965 阅读 · 0 评论 -
Go微服务: 接入Prometheus性能监控平台与Grafana平台
在 go-micro 生成的模板中, 我们一如既往的完成基础工作之后。进入main.go工作的代码编写,main.go。1 )Prometheus 平台。2 ) Grafana 平台。可见,已经能够正常监控了。选择一项指标后,执行。原创 2024-05-15 19:00:00 · 900 阅读 · 0 评论 -
Go微服务: Gin框架搭建网关, 接入熔断器,链路追踪以及服务端接入限流和链路追踪
1 )目录结构可以看到这是基于领域模型搭建的框架,默认是通过 go-micro生成的模板,之后进行修改的proto 下的 pb.go 和 pb.micro.go 是通过 Makefile 中配置的 protoc 命令生成的$ 2 ) 核心 main.go以下是一些注意事项服务初始化需要借助mysql,mysql的一些连接信息是从consul配置中心获取的在初始化的时候,需要先运行一次 和 上面 中的参数50, 100可以写入环境变量来获取,这个可以根据具体资源情况进行调节原创 2024-05-14 22:27:52 · 931 阅读 · 0 评论 -
Go微服务: Prometheus性能监控与Grafana平台的搭建
promethues 是一套开源的监控&报警&时间序列数据库的组合基本原理是通过http协议周期性抓取被监控组件的状态适合Docker、Kubernetes环境的监控系统。原创 2024-05-14 17:35:54 · 1004 阅读 · 0 评论 -
Go微服务: 服务限流原理, 负载均衡与API网关
go 微服务保稳三剑客: 熔断,限流,负载均衡限流的作用限制流量,在服务端生效注意:熔断是客户端生效保护后端服务餐厅吃饭排队的问题,提供凳子,让等候,这就是限流操作如果不限流,每个客户都吃不上饭与熔断互补go 微服务保稳三剑客: 熔断,限流,负载均衡负载均衡的作用提高系统可扩展性如果漏桶算法中的处理速度存在瓶颈不满足需求,我们就要通过负载均衡来弥补如果客户端请求,服务端压力比较大的时候,也可以用负载均衡支持 HTTP, HTTPS, TCP, UDP 请求。原创 2024-04-16 12:45:00 · 1410 阅读 · 0 评论 -
Go微服务: 服务熔断hystrix原理
go 微服务保稳三剑客:熔断,限流,负载均衡微服务熔断(hystrix-go) 与 服务雪崩效应在服务里面,有服务A调用服务B, 会有依赖调用关系,同时服务C被B依赖如果依赖关系在生产环境中多的话,C挂了之后服务B原本正常,也会因为C导致不正常同时,A因为依赖B导致A也出了问题这时候,会级联反应,就是服务雪崩效应,如下图微服务熔断 (hystrix-go) 目标组织故障的连锁反应快速失败并迅速恢复它会走一个熔断的逻辑回退并优雅降级。原创 2024-04-16 07:45:00 · 1014 阅读 · 0 评论 -
Go微服务: go-micro集成链路追踪jaeger
链路追踪数据写入的过程可以加入 kafaka 缓冲压力我们可以通过链路追踪开发发现我们是否有循环调用在链路中非必要尽量避免带入异步场景的span异步场景,比如写入日志,操作数据库把这些操作加入span, 也没有一个明确返回的时间特别不利于排错原创 2024-04-15 08:45:00 · 333 阅读 · 0 评论 -
Go微服务: 链路追踪jaeger原理和环境搭建
著名的管理学大师彼得·德鲁克曾说过“If you can’t measure it, you can’t improve it”意思是:如果你不能度量它,你就无法改进它在微服务开发后期,服务会越来越多,调用链过多,进行链路追踪时,心态会崩溃这时候,我们就要引入一个链路跟踪的工具:jaegerjaeger 是用来监视和诊断基于微服务的分布式系统用于服务依赖性分析,辅助性能优化里面反应出来依赖关系之间的调用时间 (开始和结束时间)原创 2024-04-15 06:15:00 · 1061 阅读 · 0 评论 -
Go微服务: go-micro集成consul的注册中心和配置中心
1 )consul 集群 2 )consul 中设置mysql的配置文件 2 )common 核心代码参考 3 )main.go 核心代码原创 2024-04-14 20:47:42 · 733 阅读 · 1 评论 -
Go微服务: 基于GRPC结合Consul实现微服务调用
刷新发现 127.0.0.1:8500 这个 consul 注册中心面板出来了一个新的服务。以上的调用,可以进行适当的封装来满足不同业务的调用,仅供演示。主要关注 main 函数中,注册consul服务相关代码。当然结合数据库操作封装功能完成闭环调用,不再赘述。新建 demo/server/main.go。新建 demo/client/main.go。发现服务端,客户端控制台都打印输出出来了。在 demo/client 下执行 $原创 2024-03-11 22:12:50 · 871 阅读 · 3 评论 -
Go微服务: 基于Go Micro框架实现微服务调用
在具体的项目开发过程中,开发者聚焦的是业务逻辑的开发和功能的实现大量的环境配置,调试搭建等基础性工作会耗费相当一部分的精力因此有必要将微服务架构中所涉及到的,相关的解决方案做集中管理和维护Go Micro 帮助我们解决了大部分上述问题,它是一个简化分布式开发的微服务生态系统该系统为开发分布式应用程序提供了高效,便捷的模块构建, 主要目的是简化分布式系统的开发它默认实现了consul 作为服务发现,通过http进行通信,通过protobuf和json进行编解码原创 2024-03-10 22:11:45 · 1360 阅读 · 2 评论 -
Go微服务: 基于ProtoBuf实现GRPC的微服务调用
运行起来这个客户端,即可看到客户端打印出来的服务端回复信息,同时服务端自身也打印出来了。新建 demo/server/main.go。新建 demo/client/main.go。原创 2024-03-10 13:41:19 · 940 阅读 · 0 评论 -
Go微服务: 基于ProtoBuf实现序列化和反序列化
关于 protoBuf 参考:选择合适的版本安装后注意检查环境变量安装后,查看版本本机安装 protobuf的件protoc-gen-go插件和protoc-gen-go-grpc插件这个插件把 protobuf 文件转化为 go 文件目前这个 protoc-gen-go 插件包安装可能会有问题,跟随我的步骤来解决这个包按照上述命令安装后,不会在, 则进行检查 go env 中的GOBIN查看 $go env,看下GOBIN是否为 “”, 如果如此,则进行设置,类似。原创 2024-03-09 15:42:04 · 693 阅读 · 0 评论 -
Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用
Golang 提供库来实现rpc方法采用 json 方式进行数据编解码,支持跨语言调用这里演示了,基于go语言为服务端,nodejs 和 golang 为客户端的3种示范注意,上面 nodejs版本中的 params 的格式与 golang 中的区别标准库的RPC默认采用Go语言特有的gob编码,没法实现跨语言调用golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。原创 2024-03-08 17:17:39 · 1207 阅读 · 0 评论 -
Go微服务:基于net/rpc模块实现微服务远程调用
这里在 client 项目目录中,新建一个 main.go 文件。编辑 client/main.go 文件。新建 client 目录,后执行 $2 )添加客户端退出时的关闭连接处理。1 )要连接的话,首先要建立连接。原创 2024-03-07 21:44:50 · 786 阅读 · 0 评论 -
nodejs微服务:微服务集群
当一台微服务挂掉,我们怎么让服务仍然正常运行,需要在客户端调用微服务前进行负载均衡的处理。我们同时借助了consul集群,保证了服务的稳定运行,但是我们还应当实现API网关的集群。在调用前基于健康的服务进行随机选择微服务机器进行调用,实现了微服务集群的负载均衡。这样,微服务集群已经配置好了,但是上述调用写法可以抽离出一个公共的方法包出来。consul 负载均衡微服务代码如下。原创 2023-04-08 02:16:17 · 412 阅读 · 0 评论 -
nodejs微服务:Consul集群
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置Consul 是分布式的、高可用的、可横向扩展的, 完成consul的安装后,必须运行agent原创 2023-04-07 01:04:41 · 442 阅读 · 0 评论 -
nodejs微服务:Consul的角色、命令与使用
完成consul的安装后,必须运行agent,agent可以运行为 server模式、client模式或者dev模式,每个数据中心至少必须拥有一台server,建议在一个集群中有3或者5个server,部署单一server,在出现失败时,会不可避免的出现数据丢失原创 2023-04-06 16:25:17 · 349 阅读 · 0 评论