这可能是讲分布式系统最到位的一篇文章


这可能是讲分布式系统最到位的一篇文章

文章插图
 
一个网站就是一个应用,当系统压力较大时,只能横向扩展,增加多个服务器或者多个容器去做负载均衡,避免单点故障而影响到整个系统 。
 
集中式最明显的优点就是开发,测试,运维会比较方便,不用考虑复杂的分布式环境 。
 
弊端也很明显,系统大而复杂、不易扩展、难于维护,每次更新都必须更新所有的应用 。
这可能是讲分布式系统最到位的一篇文章

文章插图
 
集中式系统拓扑图
 
鉴于集中式系统的种种弊端,促成了分布式系统的形成,分布式系统背后是由一系列的计算机组成,但用户感知不到背后的逻辑,就像访问单个计算机一样,天然的避免了单机故障的问题 。
 
应用可以按业务类型拆分成多个应用或服务,再按结构分成接口层、服务层 。
 
我们也可以按访问入口分,如移动端、PC 端等定义不同的接口应用 。数据库可以按业务类型拆分成多个实例,还可以对单表进行分库分表 。同时增加分布式缓存、消息队列、非关系型数据库、搜索等中间件 。
 
分布式系统虽好,但是增加了系统的复杂性,如分布式事务、分布式锁、分布式 Session、数据一致性等都是现在分布式系统中需要解决的难题 。
 
分布式系统也增加了开发测试运维的成本,工作量增加,其管理不好反而会变成一种负担 。
这可能是讲分布式系统最到位的一篇文章

文章插图
 
分布式系统拓扑图
 
分布式系统最为核心的要属分布式服务框架,有了分布式服务框架,我们只需关注各自的业务,而无需去关注那些复杂的服务之间调用的过程 。
 
分布式服务框架
 
目前业界比较流行的分布式服务框架有:阿里的 Dubbo、Spring Cloud 。
 
这里不对这些分布式服务框架做对比,简单的说说他们都做了些什么,能使我们用远程服务就像调用本地服务那么简单高效 。
 
服务
 
服务是对使用用户有功能输出的模块,以技术框架作为基础,能实现用户的需求 。
 
比如日志记录服务、权限管理服务、后台服务、配置服务、缓存服务、存储服务、消息服务等,这些服务可以灵活的组合在一起,也可以独立运行 。
 
服务需要有接口,与系统进行对接 。面向服务的开发,应该是把服务拆分开发,把服务组合运行 。
 
更加直接的例子如:历史详情、留言板、评论、评级服务等 。他们之间能独立运行,也要能组合在一起作为一个整体 。
 
注册中心
 
注册中心对整个分布式系统起着最为核心的整合作用,支持对等集群,需要提供 CRUD 接口,支持订阅发布机制且可靠性要求非常之高,一般拿 Zookeeper 集群来做为注册中心 。
 
分布式环境中服务提供方的服务会在多台服务器上部署,每台服务器会向注册中心提供服务方标识、服务列表、地址、对应端口、序列化协议等信息 。
 
注册中心记录下服务和服务地址的映射关系,一般一个服务会对应多个地址,这个过程我们称之为服务发布或服务注册 。
 
服务调用方会根据服务方标识、服务列表从注册中心获取所需服务的信息(地址端口信息、序列化协议等),这些信息会缓存至本地 。
 
当服务需要调用其他服务时,直接在这里找到服务的地址,进行调用,这个过程我们称之为服务发现 。
这可能是讲分布式系统最到位的一篇文章

文章插图
 
注册中心
 
下面是以 Zookeeper 作为注册中心的简单实现:
/***创建node节点*@paramnode*@paramdata*/publicbooleancreateNode(Stringnode,Stringdata){try{byte[]bytes=data.getBytes();//同步创建临时顺序节点Stringpath=zk.create(ZkConstant.ZK_RPC_DATA_PATH+"/"+node+"-",bytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);log.info("createzookeepernode({}=>{})",path,data);}catch(KeeperExceptione){log.error("",e);returnfalse;}catch(InterruptedExceptionex){log.error("",ex);returnfalse;}returntrue;} 
这可能是讲分布式系统最到位的一篇文章

文章插图
 
子节点 1


推荐阅读