Zero CIceGrid 也是一种微服务架构,好多人都清楚他的存在,它基于RPC框架发展而来,具体有良好的性能与分布式能力,以下图是它的总体示意图。前端
Icegrid具有微服务架构的以下明显特征。
首先,微服务架构须要一个集中的服务注册中心,以及某种服务发现机制。 Icegrid服务注 册采用XML文件来定义,其服务注册中心就是 Ice Registry,这是一个独立的进程,而且提供 了HA高可用机制;对应的服务发现机制就是命名查询服务,即 Locatorservice提供的API,可 以根据服务名查询对应的服务实例可用地址。算法
首先,微服务架构须要一个集中的服务注册中心,以及某种服务发现机制。 Icegrid服务注 册采用XML文件来定义,其服务注册中心就是 Ice Registry,这是一个独立的进程,而且提供 了HA高可用机制;对应的服务发现机制就是命名查询服务,即 Locatorservice提供的API,可 以根据服务名查询对应的服务实例可用地址。编程
而后,微服务架构中一般都须要内嵌某种负载均衡机制。在 Icegrid里是经过客户端AF 内嵌的负载均衡算法实现的,相对于采用中间件 Proxy转发流量的方式, Icegrid的作法更加高 效,但增长了平台开发的工做量与难度,由于采用各类语言的客户端都须要实现一遍负载均衡 的算法逻辑浏览器
最后,一个好的微服务架构平台应该简化和方便应用部署。咱们看到 Icegrid提供了 grd.xml来描述与定义一个基于微服务架构的 Application,一个命令行工具一键部署这个 Application,还提供了发布二进制程序的辅助工具— 1cepatch2。下图显示 Icepatch2的工做机 制, Icepatch2 server相似于 FTP Sever,、用于存放要发布到每一个Node上的二进制代码与配置文 件,而位于每一个Node上的 icepatch2 client则从 Icepatch2 server上拉取文件,这个过程当中采用了 压缩传输及差量传输等高级特性,以减小没必要要的文件传输过程。客观地评价,在 Docker技术 以前,Icepatch2这套作法仍是很先进与完备的,也大大减小了分布式集群下微服务系统的运维工做量。安全
若是基于IceGrid开发系统,则一般有三种典型的技术方案,以下图所示。性能优化
其中方案一是比较符合传统 Java Web 项目的一种渐进改造方案,Spring Boot 里只有Controller组件而没有数据访问层与Service对象,这些Controller组件经过Ice RPC方式调用部署在IceGrid里的远程的Ice微服务,面向前端包装为REST服务。此方案的总体思路清晰,分工明确。网络
方案二与方案三则比较适合前端JavaScript能力强的团队,好比很擅长Node.js的团队能够考虑方案二,即用JavaScript来替代Spring Boot实现REST服务。主要作互联网App的系统则能够考虑方案三,浏览器端的JavaScript以HTML5的WebSocket技术与Ice Glacier2直接通讯,总体高效敏捷。架构
IceGrid在3.6版本以后还增长了容器化的运行方式,即Ice Node与Ice Registry能够经过Docker容器的方式启动,这就简化了IceGrid在Linux上的部署。对于用Java编写的Ice微服务架构系统,咱们还能够借助Java远程类加载机制,让每台Node自动从某个远程HTTP Server下载指定的Jar包并加载相关的Servant类,从而实现相似Docker Hub的机制。下图显示了前面提到mycat-ice开源项目时给出的具体实现方案。并发
Spring Cloud是基于Spring Boot的一整套实现微服务的框架,所以它只能采用Java语言,这是它与其余几个微服务框架的最明显区别。Spring Cloud是一个包含了不少子项目的总体方案,其中由Netflix开发后来又并入Spring Cloud的Spring Cloud Netflix是Spring Cloud微服务架构的核心项目,便可以简单地认为Spring Cloud微服务架构就是Spring Cloud Netflix,后面咱们用Spring Cloud时若是不特地声明,就是指Spring Cloud Netflix。
首先,Spring Cloud中的服务注册中心是Eureka模块,它提供了一个服务注册中心、服务发现的客户端,还有一个简单的管理界面,全部服务使用Eureka的服务发现客户端来将本身注册到Eureka中,以下所示为相关示意图,你会发现它很像以前第4章中的某个图。负载均衡
那么Spring Cloud是如何解决服务的负载均衡问题的呢?因为Spring Cloud的微服务接口主要是基于REST协议实现的,所以它采用了传统的HTTP Proxy机制。以下图所示,Zuul相似一个Nginx的服务网关,全部客户端请求都经过这个网关来访问后台的服务。
Zuul从Eureka那里获取服务信息,自动完成路由规则的映射,无须手工配置,好比上图中的URL路径/customer/*就被映射到Customer这个微服务上。当Zuul转发请求到某个指定的微服务上时,会采用相似ZeroC IceGrid的客户端负载均衡机制,被称为Ribbon组件,下图给出了Zuul与Eureka的关系及实现服务负载均衡的示意图。
以下所示是Spring Cloud微服务架构平台的全景图。咱们看到它很明显地继承了Spring Framework一向的思路——集大成!
从图中来看,Spring Cloud 微服务架构平台集成了如下一些实际项目开发中经常使用的技术与功能模块。
整体来讲,Spring Cloud是替代Dubbo的一种好方案,虽然Spring Cloud是基于REST通讯接口的微服务架构,而Dubbo以RPC通讯为基础。对于性能要求不是很高的Java互联网业务平台,采用Spring Cloud是一个门槛相对较低的解决方案。
除了标准的基于RPC通讯(以及类RPC的通讯如Http Rest、SOAP等)的微服务架构,还有基于消息队列通讯的微服务架构,这种架构下的微服务采用发送消息(Publish Message)与监听消息(Subscribe Message)的方式来实现彼此之间的交互。下图是这种微服务架构下各个组件之间的交互示意图,咱们看到消息中间件是关键,它负责连通各个微服务与UI组件,担任了整个系统互联互通的重任。
基于消息队列的微服务架构是全异步通讯模式的一种设计,各个组件之间没有直接的耦合关系,也不存在服务接口与服务调用的说法,服务之间经过消息来实现彼此的通讯与业务流程的驱动,从这点来看,基于消息队列的微服务架构很是接近Actor模型。实际上,分布式的Actor模型也能够算做一种微服务架构,而且在微服务概念产生以前就已经存在好久了。下面是一个购物网站的微服务设计示意图,咱们看到它采用了基于消息队列的微服务架构。
网易的蜂巢平台就采用了基于消息队列的微服务架构设计思路,以下图所示,微服务之间经过RabbitMQ传递消息,实现通讯。
与上面几种微服务架构相比,基于消息队列的微服务架构并很少,案例也相对较少,更多地体现为一种与业务相关的设计经验,各家有各家的实现方式,缺少公认的设计思路与参考架构,也没有造成一个知名的开源平台。所以,若是须要实施这种微服务架构,则基本上须要项目组本身从零开始去设计实现一个微服务架构基础平台,其代价是成本高、风险大,所以决策以前须要架构师“接地气”地进行全盘思考与客观评价。
Docker Swarm实际上是Docker公司“高仿”Google开源的Kubernetes微服务架构平台的一个产品,但一直没法跟上对手的脚步,在业界始终缺少影响力。2016年发布Docker 1.12时,Docker Swarm就被强行集成到了Docker Engine中而再也不做为单独的工具发布了,这相似当年微软推广IE浏览器的作法。不过即便这样,也难以掩盖Docker Swarm还没成名就已经陨落的事实。
Docker Swarm的最初目标是将一些独立的Docker主机变成一个集群,以下图所示,咱们经过简单的Docker命令行工具就能建立一个Swarm集群。
后来随着Kubernetes微服务架构平台愈来愈火,Docker 公司开始努力让Swarm向着Kubernetes的方向靠拢,即变成一个基于容器技术的微服务平台。下面给出了Swarm集群的结构图。
从图中咱们看到一个Swarm集群中有两种角色的节点。
上图中的Docker Compose是官方编排(Orchestration)项目,它提供了一个YAML格式的文件,用于描述一个容器化的分布式应用,而且提供了相应的工具来实现一键部署的功能。下图给出了两节点的Couchbase集群对应的YAML文件定义,此Couchbase集群随后被部署到了Swarm集群中的两个Node节点上。
注意上图左边YAML文件中的Services定义,Swarm manager节点给每一个Service分配惟一的DNS名字,所以能够经过最古老又简单的DNS轮询机制来实现服务的发现与负载均衡,这明显借鉴了Kubernetes的作法。
若是你想学习以上这几种微服务架构与实战,我能够推荐一下我我的以为比较好的一套系统化的学习体系和一个不错的交流群,在此我向你们推荐一个交流学习群:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
1、源码分析
2、分布式架构
3、微服务
4、性能优化
5、团队协做
六:电商实战
七:并发编程