基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理) 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设施、中间件、数据服务、云服务器等资源开发人员只需要开发业务代码并提交到平台代码库做一些必要的配置系统会自动构建、部署实现应用的敏捷开发、快速迭代。在系统架构上PaaS云平台主要分为微服务架构、Docker容器技术、DveOps三部分这篇文章重点介绍微服务架构的实施。实施微服务需要投入大量的技术力量来开发基础设施这对很多公司来说显然是不现实的别担心业界已经有非常优秀的开源框架供我们参考使用。目前业界比较成熟的微服务框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套实现微服务的框架它提供了开发微服务所需的组件跟Spring Boot一起使用的话开发微服务架构的云服务会变的很方便。Spring Cloud包含很多子框架其中Spring Cloud Netflix是其中的一套框架在我们的微服务架构设计中就使用了很多Spring Cloud Netflix框架的组件。Spring Cloud Netflix项目的时间还不长相关的文档资料很少博主当时研究这套框架啃了很多英文文档简直痛苦不堪。对于刚开始接触这套框架的同学要搭建一套微服务应用架构可能会不知道如何下手接下来介绍我们的微服务架构搭建过程以及需要那些框架或组件来支持微服务架构。为了直接明了的展示微服务架构的组成及原理博主画了一张系统架构图如下从上图可以看出微服务访问大致路径为外部请求 → 负载均衡 → 服务网关GateWay→ 微服务 → 数据服务/消息服务。服务网关和微服务都会用到服务注册和发现来调用依赖的其他服务各服务集群都能通过配置中心服务来获得配置信息。服务网关GateWay网关是外界系统如客户端浏览器、移动设备等和企业内部系统之间的一道门所有的客户端请求通过网关访问后台服务。为了应对高并发访问服务网关以集群形式部署这就意味着需要做负载均衡我们采用了亚马逊EC2作为虚拟云服务器采用ELB(Elastic Load Balancing)做负载均衡。EC2具有自动配置容量功能当用户流量达到尖峰EC2可以自动增加更多的容量以维持虚拟主机的性能。ELB弹性负载均衡在多个实例间自动分配应用的传入流量。为了保证安全性客户端请求需要使用https加密保护这就需要我们进行SSL卸载,使用Nginx对加密请求进行卸载处理。外部请求经过ELB负载均衡后路由到GateWay集群中的某个GateWay服务由GateWay服务转发到微服务。服务网关作为内部系统的边界它有以下基本能力1、动态路由动态的将请求路由到所需要的后端服务集群。虽然内部是复杂的分布式微服务网状结构但是外部系统从网关看就像是一个整体服务网关屏蔽了后端服务的复杂性。2、限流和容错为每种类型的请求分配容量当请求数量超过阀值时抛掉外部请求限制流量保护后台服务不被大流量冲垮党内部服务出现故障时直接在边界创建一些响应集中做容错处理而不是将请求转发到内部集群保证用户良好的体验。3、身份认证和安全性控制对每个外部请求进行用户认证拒绝没有通过认证的请求还能通过访问模式分析实现反爬虫功能。4、监控网关可以收集有意义的数据和统计为后台服务优化提供数据支持。5、访问日志网关可以收集访问日志信息比如访问的是哪个服务处理过程出现什么异常和结果花费多少时间通过分析日志内容对后台系统做进一步优化。我们采用Spring Cloud Netflix框架的开源组件Zuul来实现网关服务。Zuul使用一系列不同类型的过滤器Filter通过重写过滤器使我们能够灵活的实现网关GateWay的各种功能。服务注册与发现由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构服务之间通过轻量机制进行通信这就引入了服务注册与发现的问题服务的提供方要注册报告服务地址服务调用放要能发现目标服务。我们的微服务架构中使用了Eureka组件来实现服务的注册与发现。所有的微服务通过配置Eureka服务信息到Eureka服务器中进行注册并定时发送心跳进行健康检查Eureka默认配置是30秒发送一次心跳表明服务仍然处于存活状态发送心跳的时间间隔可以通过Eureka的配置参数自行配置Eureka服务器在接收到服务实例的最后一次心跳后需要等待90秒默认配置90秒可以通过配置参数进行修改后才认定服务已经死亡即连续3次没有接收到心跳在Eureka自我保护模式关闭的情况下会清除该服务的注册信息。所谓的自我保护模式是指出现网络分区、Eureka在短时间内丢失过多的服务时会进入自我保护模式即一个服务长时间没有发送心跳Eureka也不会将其删除。自我保护模式默认为开启可以通过配置参数将其设置为关闭状态。Eureka服务以集群的方式部署在博主的另一篇文章中详细介绍了Eureka集群的部署方式集群内的所有Eureka节点会定时自动同步微服务的注册信息这样就能保证所有的Eureka服务注册信息保持一致。那么在Eureka集群里Eureka节点是如何发现其他节点的呢我们通过DNS服务器来建立所有Eureka节点的关联在部署Eureka集群之外还需要搭建DNS服务器。当网关服务转发外部请求或者是后台微服务之间相互调用时会去Eureka服务器上查找目标服务的注册信息发现目标服务并进行调用这样就形成了服务注册与发现的整个流程。Eureka的配置参数数量很多多达上百个博主会在另外的文章里详细说明。微服务部署微服务是一系列职责单一、细粒度的服务是将我们的业务进行拆分为独立的服务单元伸缩性好耦合度低不同的微服务可以用不同的语言开发每一个服务处理的单一的业务。微服务可以划分为前端服务也叫边缘服务和后端服务也叫中间服务前端服务是对后端服务做必要的聚合和剪裁后暴露给外部不同的设备PC、Phone等所有的服务启动时都会到Eureka服务器进行注册服务之间会有错综复杂的依赖关系。当网关服务转发外部请求调用前端服务时通过查询服务注册表就可以发现目标服务进行调用前端服务调用后端服务时也是同样的道理一次请求可能涉及到多个服务之间的相互调用。由于每个微服务都是以集群的形式部署服务之间相互调用的时候需要做负载均衡因此每个服务中都有一个LB组件用来实现负载均衡。微服务以镜像的形式运行在Docker容器中。Docker容器技术让我们的服务部署变得简单、高效。传统的部署方式需要在每台服务器上安装运行环境如果我们的服务器数量庞大在每台服务器上安装运行环境将是一项无比繁重的工作一旦运行环境发生改变就不得不重新安装这简直是灾难性的。而使用Docker容器技术我们只需要将所需的基础镜像jdk等和微服务生成一个新的镜像将这个最终的镜像部署在Docker容器中运行这种方式简单、高效能够快速部署服务。每个Docker容器中可以运行多个微服务Docker容器以集群的方式部署使用Docker Swarm对这些容器进行管理。我们创建一个镜像仓库用来存放所有的基础镜像以及生成的最终交付镜像在镜像仓库中对所有镜像进行管理。服务容错微服务之间存在错综复杂的依赖关系一次请求可能会依赖多个后端服务在实际生产中这些服务可能会产生故障或者延迟在一个高流量的系统中一旦某个服务产生延迟可能会在短时间内耗尽系统资源将整个系统拖垮因此一个服务如果不能对其故障进行隔离和容错这本身就是灾难性的。我们的微服务架构中使用了Hystrix组件来进行容错处理。Hystrix是Netflix的一款开源组件它通过熔断模式、隔离模式、回退fallback和限流等机制对服务进行弹性容错保护保证系统的稳定性。