1 技术选型

开发框架

Spring boot

服务远程配置

Spring cloud config

服务网关

Zuul

服务注册与发现

Eureka

服务负载均衡

Ribbon

服务接口通信

RestTemplate/FeignMQ

断路器

Hystrix

前端负载

Nginx+ Lua+Redis

后端服务负载

DNS负载+Nginx+zuul

缓存

Redis(阿里云Redis或自建redis cache-cloud )

MQ中间件

生产环境RabbitMQ/开发环境springboot内置ActiveMQ

数据库集群

Mysql Cluster + LVS + Keeplived

微服务封装与部署

Docker

可持续自动化测试与集成

Jenkins

分布式定时任务

xxl-job(基于quartz实现的分布式定时任务)

Session同步

Spring-session

数据库crud操作

Spring-jdbcTemplate

MQ生产与消费

Spring-jmsTemplate

前端页面渲染

Vue.js

页面静态化

FreeMarker

应用服务器

Spring boot集成Tomcat-embeded

服务安全框架

Spring security

2 整体架构

2.1 后端整体架构

1. HA:所有服务包括网关(zuul)、服务发现器(Eureka)、安全服务(Security)、业务服务基于spring cloud实现,屏蔽细节,实现了自动注册、负载均衡(基于Ribbon)、故障隔离,失败熔断与服务降级(Hystrix),从架构上满足了系统的高可用需求。

2. 性能:从架构图可以清晰的认识到,微服务架构不存在任何单点与中心,任何一个服务使用的资源可以动态调配,服务支持水平扩展,能够从架构上满足日常与业务高峰期的并发需求。

3. 服务容灾:

a) 所有服务注册中心(Eureka)均可查看服务注册情况,如图:

b) 利用Hystrix将失败信息传递给第三方系统(运维系统:当异常发生时利用短信、邮件提醒运维人员处理,并生成统计图表,能够确定存在严重问题的服务并有针对性的修改服务)。

4. 服务安全:使用spring-security实现服务注册的鉴权、移动端接入的鉴权(token),在zuul网关添加过滤层过滤类DDOS攻击。

2.1.1 服务与服务间调用架构

1. 同步api调用

a) 同步调用适合的业务场景:服务与服务在调用时,上游服务必须要知道下游服务处理的结果状态,才能完成自己的业务,且上游服务性能要求不高时才适合使用同步api调用。

b) 同步调用通过Feign实现,声明式的服务调用,屏蔽细节,调用简单。

2. 异步消息式调用。

a) 异步调用适合的业务场景:上游服务性能要求较高,对于下游服务处理的状态并没有刚性需求。比如下单服务,商品出库服务,下单为了满足高并发的需要,那么必然要牺牲掉强一致性,通过mq消息确认、补偿模式、可靠事件、TCC等等方式来保证最终一致性。

b) 异步调用通过jmsTemplate进行生产、消费、订阅,中间件生产环境使用RabbitMQ,开发环境使用ActiveMQ

2.1.2 数据层架构

2.1.2.1 数据库解决方案

1. 所有服务的db使用mysql-clustermysql-cluster本身具备了高可用、数据分片容灾、高性能读写的特性,在此不再赘述,有兴趣可以参看mysql官方白皮书。

2. mysql目前没有开源的图形化运维解决方案,oracle提供收费的图形化部署、扩容、横向扩展的运维工具,我们考虑在不侵犯oracle版权与mysql开源协议的基础上,在将来提供图形化运维解决方案。

2.1.2.2 缓存解决方案

所有服务如需要应用缓存以提升读写性能,本架构中基于搜狐开源项目cachecloud提供redis图形化运维、解决方案。


1. cache-cloud相关使用文档见https://cachecloud.github.io/

2. 本系统对redisTemplate进行了封装来支持阿里云rediscache-cloud提供的redis-standaloneredis-sentinelredis-cluster共四种缓存应用方案,所有服务可以单独配置使用独立的redis

3. 服务与服务之间db隔离、缓存隔离。

2.1.3 边缘解决方案(单点登录、分布式定时任务)

2.1.3.1 spring-session的应用

利用spring-sessionset-cookie的方式进行session共享,跨二级域名的单点登录(目前未提供token式的单点登录解决方案)

2.1.3.2 分布式定时任务

利用quartz集成的开源项目xxl-job实现定时任务与业务的拆离,业务只需要关心执行器逻辑实现,xxl-job提供任务调度策略、执行日志记录,如下图所示:

2.2 前端解决方案

前端及cms模块整体架构如下:

1. 前端页面使用freemarker将需要静态化的部分静态化,不需要静态化的部分则使用vue.js调用api的方式进行渲染,利用nginx ssi模块来进行页面headerfooter的引用,简化了开发工作。

2. 模板服务(template-service)提供基于FileWatchServer的文件监控服务,初次启动时即按策略初始化所有html,并按处理需要静态化的html模块,生成静态页放入nosql;当html发生变化时,发送jms消息,cms-pagecreator服务订阅cms-template消息,并按策略重新生成对应静态页。

3. Cms-managr为管理专题、频道、首页等页面数据的服务,当发生数据变化时入库并发送jms消息,cms-pagecreator服务订阅cms-manage消息、订阅其他服务消息并按策略重新生成对应静态页。

4. 页面展示服务为Nginx+LUA脚本开发,通过这种方式访问Redis并响应给浏览器,能够极大程度上提高页面吞吐率,提高系统性能。

5. 以上所有服务均为spring-cloud项目,注册在eureka上,本身具备了HA特性;页面展示服务利用KeepAlive实现自身HA

6. 将页面展示实现前后端分离,必然要面对的问题是:离开了模板引擎,页面渲染所需要调用的api接口增多、随着访问量的激增,势必对后端应用造成压力。通过这个类似大Nginx系统的应用解决了页面不常变动的数据(静态化部分)、与需要实时性较高的部分(正常api调用部分)的完美结合,不仅将前后端拆离,也将前后端压力拆离。而监控服务提供了静态化页面的动态更新,完美解决页面访问的问题。

7. 为前端开发提供了cms-work插件(目前以jar形式运行),在未来会做为eclipse插件发布,提供易用的开发环境。

2.3 其他架构解决方案。

2.3.1 持续集成测试环境

应用jekins+maven实现版本迭代,spring-cloud本身支持服务的版本控制,可以做到不同版本应用的兼容与并存。

2.3.2 docker部署和动态扩容。

目前不支持图形化的docker部署,但是在发布前有计划研究docker图形化运维工具。

2.3.3 服务跟踪与性能分析

目前只提供hystrix dashboard方式的性能监控与分析调优,未来有计划集成Zipkin等服务追踪开源框架。