分布式
文章平均质量分 90
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
蹊源的奇思妙想
微信公众号:蹊源的奇思妙想
“桃李不言,下自成蹊”的原义是桃树、李树不会说话,但因其花朵美艳,果实可口,人们纷纷去摘取,于是便在树下踩出一条路来。比喻为人真诚笃实,自然就能感召人心,无需张扬夸耀。
展开
-
搬砖日记-CountDownLatch和CompletableFuture的使用
搬砖日记-CountDownLatch和CompletableFuture的使用前言不知不觉在大厂搬砖快一年了,在这一年里不得不说我学到了很多,特别把之前学到的知识给落地,这给我带来一些满足感和充实感,于是我想着抽空把最近学到的知识给整理整理,既是温习回顾还是一种分享,本篇文章将带领大家了解一下CountDownLatch和CompletableFuture的使用.正文CountDownLatchCountDownLatch程序计数器:CountDownLatch用于主线程等待其他子线程任务都原创 2022-03-13 00:48:34 · 2044 阅读 · 1 评论 -
RabbitMQ实现延时队列
RabbitMQ实现延时队列前言我们在设计大型的购物类的网站的时候,有这样的一个场景就是我们下订单后如果长时间不去支付的话需要超时将订单取消,并且存库要恢复,这就是我们经常说的订单过期会库存。分布式秒杀系统的设计可参考我的博客:分布式秒杀系统的设计SpringBoot项目中使用RabbitMQ可参考我的博客:SpringBoot项目中使用RabbitMQ正文延时队列订单过期库存回库的场景:淘宝七天自动确认收货:在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款原创 2021-03-10 17:11:15 · 842 阅读 · 3 评论 -
Tomcat负载均衡时实现session共享
使用nginx服务器进行负载均衡使用nginx的前提 要实现tomcat集群的session共享第一步 配置nginx.conf负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。user root;worker_processes 1;events {worker_...原创 2019-09-27 13:24:42 · 1958 阅读 · 0 评论 -
MySQL主从复制原理及其实践
MySql数据库主从复制的方式有两种基于日志(binlog)基于GTID(全局事务标识符)MySql主从复制(也称A/B复制)的原理1. 数据存储:Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events);2. 数据传输:Slave 通过 I/O 线程读取 Master ...原创 2019-09-19 18:29:23 · 1817 阅读 · 0 评论 -
Mysql高并发解决方案
随着近些年来分布式的应用,其伴随而来的是系统的数据量也越来越大,为了可以提升系统的整体性能,我们对以Mysql为代表的关系型数据库也提出了“分布式”的要求.原创 2021-02-05 21:27:55 · 3144 阅读 · 1 评论 -
Zookeeper作为Dubbo服务治理中心
Zookeeper作为Dubbo服务治理中心前言前几天被人问到这样的一个问题:当我们使用Zookeeper作为Dubbo的注册中心时,我们如果启动新的服务提供者怎么被其他节点检测到,我们都知道节点的注册信息都会放在一个服务清单里面,所以这个问题可以理解为Zookeeper是怎么样创建并维护这个服务清单的?分布式可参考我的博客:溪源的Java笔记—分布式微服务可参考我的博客:溪源的Java笔记—微服务正文Zookeeper作为Dubbo服务治理中心首先我们要知道Zookeeper提供了一给类似原创 2021-02-03 21:04:23 · 419 阅读 · 1 评论 -
分布式秒杀系统的设计
不知道你在面试的过程中有没有被问到如何设计一个分布式秒杀系统?本篇博客根据大神们的梳理的体系并结合自己实际的项目经验,大致描述我们在设计分布式秒杀系统需要关注的核心内容——分布式锁、分布式限流、消息队列等等,希望可以帮助同学们可以在面试中更加从容地回答这个问题。原创 2021-02-02 14:11:41 · 3324 阅读 · 3 评论 -
从悲观锁、乐观锁到分布式锁
从悲观锁、乐观锁到分布式锁前言我们在设计商品秒杀模块时为了防止“库存”超卖的情况,我们常常会使用一个锁的机制,解决多线程下数据一致性问题,但是在分布式集群下单节点的锁往往是无法满足业务的需求,本篇博客从悲观锁、乐观锁开始,逐步介绍分布式数据一致性的利器——分布式锁。正文悲观锁与乐观锁悲观锁与乐观锁的差异:悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放sychronized提供的是悲观锁乐观锁:一段执行逻辑加上乐观锁,不同线程同时执原创 2021-02-02 12:09:03 · 739 阅读 · 1 评论 -
消息队列设计
消息队列设计前言最近被问到这样的问题,如何让你设计一套消息队列,你会从哪些角度去设计。于是我回顾了自己对目前两款主流的消息队列RabbitMQ与Kafka的原理,并收集了一些大佬们对此问题的解答,于是给出了自己的一些理解与认识。消息队列可参考我的博客溪源的Java笔记—消息队列正文消息队列消息队列要实现的主要功能解耦:基于消息的模型,关心的是“通知”,而非“处理”,相对而言更关心结果而不是过程,通过消息队列可以减少系统与系统的耦合性,换句话来说一个系统的低效率不会拖累其他系统。最终一致性:原创 2021-01-30 01:46:09 · 773 阅读 · 0 评论 -
蹊源的Java笔记—微服务
溪源的Java笔记—微服务前言微服务架构是一种架构风格和架构思想,它提倡将系统业务按照功能拆分为更加细粒度的服务,即每一个服务都是一个独立的应用。这些应用对外提供公共API用于应用调度。本篇博客从服务治理、微服务网关、Netty等方面介绍微服务。正文服务治理服务注册发现服务注册就是维护一个登记簿,它管理系统内所有的服务地址。当新的服务启动后,它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要 Service Provider 地址就行了。当下用于服务注册的工具非常多 ZooKeep原创 2020-12-29 12:49:43 · 5284 阅读 · 8 评论 -
蹊源的Java笔记—分布式
溪源的Java笔记—分布式前言现在的互联网的架构中往往会面对这数以万计的并发访问,为了让系统在这样的访问压力下可以平稳运行,有这限流算法、分布式事务、分布式锁等分布式技术,本篇博客将针对其中几个经常被使用的技术和各位同学介绍介绍。消息队列可参考我的博客溪源的Java笔记—消息队列正文限流算法一般来说服务降级分为两种故障降级:当发生网络故障或者RPC服务返回异常,这种情况我们通常采用关联fallback方法,为客户端设置兜底数据,从而避免造成服务依赖的“雪崩”现象。限流降级:无论系统运行在什原创 2020-12-14 23:52:10 · 2020 阅读 · 1 评论 -
蹊源的Java笔记—消息队列
溪源的Java笔记—消息队列原创 2020-12-09 03:17:36 · 2122 阅读 · 2 评论 -
SpringBoot使用Netty实现远程调用
SpringBoot使用Netty实现远程调用前言众所周知我们在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为。那么我们该通过什么技术去解决上述的问题呢,那么就不得不提一个网络连接的利器——Netty.正文NettyNetty是一个NIO客户端服务器框架:它可快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了网络编程,例如TCP和UDP套接字服务器。NIO是一种非阻塞IO ,原创 2020-10-24 00:12:29 · 9598 阅读 · 12 评论 -
微服务+微信小程序实现社区服务
我在上大学的时候毕业设计做的是微服务`SpringCloud`结合微信小程序实现一个提供一些生活服务的微信小程序,它主要可以提供豆瓣电影资讯、热点新闻、天气预报、停车位预约等生活服务,也用到了一些分布式的技术比如消息队列、内存数据库等。原创 2020-10-19 00:13:50 · 16810 阅读 · 28 评论 -
SpringCloud使用Eureka作为服务治理中心
我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有`Zookeeper`、`Eureka`、`Nacos`等,本篇博客这里我想和大家介绍一下服务治理组件—`Eureka`的原理和使用。原创 2020-10-02 20:40:04 · 6327 阅读 · 2 评论 -
SpringCloud使用Consul作为服务治理中心
SpringCloud使用Consul作为服务治理中心前言我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有Zookeeper、Eureka、Nacos等,但是今天这里我想和大家介绍一下另一种服务治理组件—Consul。Nacos的使用可以参考我的博客:Nacos服务治理中心和配置中心正文ConsulConsul是一个Spring Cloud 中集成好的开源的分布式原创 2020-09-30 00:54:13 · 5777 阅读 · 1 评论 -
开箱即用的Dubbo模版
近期做的项目是一个采用`Dubbo`架构的微服务项目,由于之前虽然学习过`Dubbo`架构但是一直没有机会独自搭建过,于是趁着这个机会凭借着自己浅薄的理解自己完整地搭建了一个开箱即用的`spring-dubbo-demo`。原创 2020-09-14 09:17:36 · 9087 阅读 · 3 评论 -
使用SVS实现签名验证
使用SVS实现签名验证前言最近开发了一个接口由于是给外部其他系统的调用的,所以为了接口安全性,我们需要选择一个符合业务需求的请求机制。根据和合作方的协商,我们决定采用了SVS签名验证的方式来保证接口的安全性。正文数字签名数字签名指的是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它的基本原理是将原文用对称密钥加密传输,而将对称密钥用收方公钥加密发送给对方。收方收到电子信封,用自己的私钥解密信封,取出对称密钥解密得原文。使用sv原创 2020-09-10 22:56:58 · 15232 阅读 · 4 评论 -
使用Curator来控制ZooKeeper
作为一个了解分布式架构的开发者,一定会用到`ZooKeeper`,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。虽然`ZooKeeper`功能强大,但是`ZooKeeper`客户端的调用比较复杂,对我们开发者相对而言还是不够友好的,而`Apache Curator` 就是为了简化`ZooKeeper`客户端调用而生,利用它,可以更好的使用`ZooKeeper`。原创 2020-09-09 23:43:01 · 12631 阅读 · 3 评论 -
Elastic-job实现分布式定时任务
最近接了一个新的需求,需要使用到定时任务,由于我们的系统是分布式的,所以`Spring`自带的定时任务无法满足我们当前系统对定时任务的需要。我们需要一个能够便捷、高可用的分布式定时任务框架。比较了几个主流的分布式框架,我最终pick了当当开源项目`ElasticJob`。原创 2020-09-02 20:54:50 · 12265 阅读 · 2 评论 -
Dubbo服务的注册与发现
Dubbo服务的注册与发现前言最近参与的项目是一个基于Dubbo的项目,在开发过程中有些同事对于Dubbo服务的注册与发现机制,似乎不太了解。所以我抽空和他简单聊了聊我对Dubbo机制的了解。正文Java SPISPI即服务提供商接口,它是一种动态加载服务实现者的机制,通过JavaSPI我们可以优雅地根据一个接口来获取该接口的所有实现类。值得注意的是使用的Java SPI需要有以下的前提:1.需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/service2.在原创 2020-09-01 20:41:08 · 11674 阅读 · 1 评论 -
微服务网关-Gateway
微服务网关-Gateway前言近期做的项目,每次新增一个接口都需要提jira工单在公司的网关平台上申请接口权限。那么什么是网关?我们为什么要使用网关呢……一些列问题在我脑海里出现。正文网关的简介网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能。微服务使用网关的意义不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求,若让客户端直接与各个微服务通信,会有以下问题:客户端会多次请求不同原创 2020-08-31 13:43:01 · 14207 阅读 · 3 评论 -
Dubbo使用invoke指令来调用dubbo接口
最近被分配了一个任务,是通过`dubbo`的方式对外提供服务,`dubbo`没有我们一般的web项目中的`Controller`层,所以没有办法通过`http`的方式进行调用调试。作为萌新的我,确实有点一筹莫展,直到被老司机提醒使用`dubbo` `invoke`的方式进行接口测试,我才有方向。原创 2020-08-26 00:00:57 · 20053 阅读 · 6 评论 -
分布式下的请求超时
分布式下的请求超时前言在日常的生产中,用户往往不在乎你使用的什么样的性能优化的手段,他们更关心地是点击一个按钮后能否立马给予反馈。这个用户等待反馈的时间,就是我们软件设计过程中的用户操作的响应时间。我们花费心思去优化系统提升系统性能,本质上就是缩短响应时间,从而提升用户体验的满意度。那到底什么样的系统才算得上“流畅丝滑”的呢?正文在互联网上对于用户响应时间,有一个普遍的标准,即2/5/10秒原则:在2秒之内给客户响应被用户认为是“非常有吸引力”的用户体验。在5秒之内响应客户被认为“比较不错”的原创 2020-08-25 13:32:06 · 13177 阅读 · 1 评论 -
高并发之限流算法
限流算法在我们的实际的生产当中存在这样的业务场景:短时间有大量的请求涌入造成了系统的崩溃。针对这种问题我们会采用一种服务降级的方式来保证核心服务可以正常运行。一般来说服务降级分为两种:故障降级:当发生网络故障或者RPC服务返回异常,这种情况我们通常采用关联fallback方法,为客户端设置兜底数据,从而避免造成服务依赖的“雪崩”现象。限流降级:无论系统运行在什么样的服务器,它都会有一定的流量带宽极限,我们可以采用设置请求阈值的方式来避免过多的请求涌入从而造成系统的崩溃。不同的RPC框架都有着不原创 2020-08-23 23:40:50 · 11748 阅读 · 2 评论 -
初识分布式服务框架
TCC分布式事务 解决的问题: 确保微服务之间的事务操作的原子性、一致性等得到保障。TCC柔性事务(分布事务): 实现方法通过在注解中声明Confirm方法与Cancel方法。关于 RPC/gRPC/HTTP/REST PRC:是远程调用,其调用的协议包括传输协议和编码协议。 传输协议: 1.PRC使用的http协议 2.gRPC使用的http2.0 3.Dubbo使用...原创 2018-09-16 22:53:56 · 1856 阅读 · 0 评论 -
微服务入门
为什么需要微服务?第一阶段:单体模式传统的单体模式是通过增加tomcat服务器,并且通过Ngnix来实现负载均衡,从而实现了水平拓展。这样弊端:a.应用复杂度增加,更新、维护困难b.易造成系统资源浪费c.影响开发效率d.应用可靠性低e.不利于技术更新第二阶段:SOA 面向服务框架SOA将原来的单体架构按照功能细分不同的子系统,然后再由各个子系统依赖服务中间件来调用所需的服务...原创 2018-09-20 23:22:09 · 1981 阅读 · 0 评论 -
远程服务调用的方式
远程调用的方式:1.RPC:采用C/S方式,跨语言跨平台2.webservice:请求应答机制,跨系统跨平台3.RMI: 降低客户端与服务器的耦合性,java远程接口调用4.JMS:JAVA消息服务,点对点和发布订阅模型比较RMI和RPC的区别RMI(JAVA远程调用)和RPC之间最主要的区别在于方法是如何别调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务...原创 2018-10-06 23:21:06 · 1986 阅读 · 0 评论 -
负载均衡的解决方案
我们在设计分布式系统的时候往往需要考虑系统的伸缩性,这里所说的伸缩性指的是我们可以通过添加服务器节点的方式来提升我们整个系统的并发能力,这种提高伸缩性的基础原理其实就是我们所说的——负载均衡。原创 2018-10-12 21:15:04 · 2266 阅读 · 0 评论 -
ActiveMQ消息队列
消息队列的作用(如:ActiveMQ):为什么会需要消息队列(MQ)?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。消息队列的功能:1.异...原创 2018-10-13 20:33:36 · 2173 阅读 · 0 评论 -
ActiveMQ消息类型
消息队列的数据类型a.文本消息TextMessage textMessage = session.createTextMessage("文本消息"); b.键值对消息MapMessage mapMessage = session.createMapMessage(); mapMessage.setLong("age", new Long(32)); mapMe...原创 2018-10-15 17:09:32 · 2571 阅读 · 0 评论 -
Redis之消息队列
SpringBoot 结合redis实现消息队列功能发布者:配置连接工厂 @Bean public StringRedisTemplate template(RedisConnectionFactory connectionFactory){ return new StringRedisTemplate(connectionFactory); }配置Re...原创 2018-10-15 19:40:05 · 1998 阅读 · 0 评论 -
认识WebService
什么是webservice?1.Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。2.采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。3. 采用wsdl作为描述语言即webservice使用说明书,...原创 2018-10-16 22:05:36 · 1965 阅读 · 0 评论 -
Redis数据库进阶
主从备份在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示。127.0.0.1:12345> SLAVEOF 127.0.0.1 6379从服务器 ...原创 2018-10-21 20:39:27 · 1813 阅读 · 0 评论 -
什么是HBase
HbaseHBase即Hadoop Database,是高可靠、高性能,面向列、可伸缩的分布式存储系统,利用HBase可以对大表数据的读、写达到实时级别。面向列是指的是面向列检索,表的结构与mysql 类似。每个记录的组成: 行(主)键(可重复)、时间戳、列族(一个列族包含多条属性 可以理解为一个对象)由于行键可以重复,可以借助列主键(第二维)或者时间戳 达到精确定位Hbase不支持条件...原创 2018-11-20 14:46:24 · 3059 阅读 · 0 评论 -
Java分布式应用:Java分布式通讯方式
第一部分 Java分布式通讯的方式1.基于消息方式实现系统间通讯a.数据传输部分 : TCP/IP 、UDP/IPTCP(端口号为23)与UDP(端口号为53)的区别1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证...原创 2018-12-26 21:59:14 · 2614 阅读 · 0 评论 -
Java分布式应用:大型分布式Java应用与SOA
第二部分 大型分布式Java应用与SOASOA是一种服务集成的架构思想,超越具体的技术和架构,又涵盖具体的技术和架构。SOA的最常见的解决方案是SCA、ESB。Apache Tuscany 是SCA的具体实现技术,Apache Tuscany 提供开放式可扩展的运行环境以支持现在和将来的各种技术.这将解除应用程序对底层技术的依赖和偶合,使得跨技术网络平台的组装成为可能并大大简化.多种构件实现...原创 2018-12-26 22:05:34 · 2324 阅读 · 0 评论 -
Java分布式应用:深入了解JVM
第三部分 深入理解JVMJava代码的执行过程Java源码编译机制javac 将java源码转换成java class字节码java 运行java class字节码Java编译后产生的是字节码,在运行的时候将字节码转换成机器码。Java类加载机制类加载的任务就是.class文件加载到到JVM转换成 java.lang,.class类类加载过程:装载、链接和初始化。a.装载:找到...原创 2018-12-26 22:09:03 · 1916 阅读 · 0 评论 -
Java分布式应用:分布式Java应用与Sun JDK类库
第四部分 分布式Java应用与Sun JDK类库集合包CollectionList接口:List(有序、可重复):的实现类有ArrayList、Vector、LinkList ArrayList、Vector底层是通过数组实现的,LinkList是通过双向链表实现的。Vector支持线程同步(Stack栈是实现Vector)。Set接口:Set(无序、不可重复)实现类有 Has...原创 2018-12-26 22:16:06 · 1957 阅读 · 0 评论 -
Java分布式应用:性能调优
第五部分 性能调优性能瓶颈的表象:1.资源消耗过多、外部处理系统的性能不足2.资源消耗不多,但程序的响应速度不够关于CPU通常使用时间片、多核的方法达到对CPU的分割;每个CPU核都运行一个可运行的线程队列;线程是处理器调度的基本单位;调优的方式:硬件、操作系统、JVM以及程序四个方面。JVM优化:https://blog.csdn.net/wangnayu/article/...原创 2018-12-26 22:18:24 · 2228 阅读 · 0 评论