开发框架 |
Spring boot |
服务远程配置 |
Spring cloud config |
服务网关 |
Zuul |
服务注册与发现 |
Eureka |
服务负载均衡 |
Ribbon |
服务接口通信 |
RestTemplate/Feign、MQ |
断路器 |
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 |
1. HA:所有服务包括网关(zuul)、服务发现器(Eureka)、安全服务(Security)、业务服务基于spring cloud实现,屏蔽细节,实现了自动注册、负载均衡(基于Ribbon)、故障隔离,失败熔断与服务降级(Hystrix),从架构上满足了系统的高可用需求。
2. 性能:从架构图可以清晰的认识到,微服务架构不存在任何单点与中心,任何一个服务使用的资源可以动态调配,服务支持水平扩展,能够从架构上满足日常与业务高峰期的并发需求。
3. 服务容灾:
a) 所有服务注册中心(Eureka)均可查看服务注册情况,如图:
b) 利用Hystrix将失败信息传递给第三方系统(运维系统:当异常发生时利用短信、邮件提醒运维人员处理,并生成统计图表,能够确定存在严重问题的服务并有针对性的修改服务)。
4. 服务安全:使用spring-security实现服务注册的鉴权、移动端接入的鉴权(token),在zuul网关添加过滤层过滤类DDOS攻击。
1. 同步api调用
a) 同步调用适合的业务场景:服务与服务在调用时,上游服务必须要知道下游服务处理的结果状态,才能完成自己的业务,且上游服务性能要求不高时才适合使用同步api调用。
b) 同步调用通过Feign实现,声明式的服务调用,屏蔽细节,调用简单。
2. 异步消息式调用。
a) 异步调用适合的业务场景:上游服务性能要求较高,对于下游服务处理的状态并没有刚性需求。比如下单服务,商品出库服务,下单为了满足高并发的需要,那么必然要牺牲掉强一致性,通过mq消息确认、补偿模式、可靠事件、TCC等等方式来保证最终一致性。
b) 异步调用通过jmsTemplate进行生产、消费、订阅,中间件生产环境使用RabbitMQ,开发环境使用ActiveMQ。
1. 所有服务的db使用mysql-cluster,mysql-cluster本身具备了高可用、数据分片容灾、高性能读写的特性,在此不再赘述,有兴趣可以参看mysql官方白皮书。
2. mysql目前没有开源的图形化运维解决方案,oracle提供收费的图形化部署、扩容、横向扩展的运维工具,我们考虑在不侵犯oracle版权与mysql开源协议的基础上,在将来提供图形化运维解决方案。
所有服务如需要应用缓存以提升读写性能,本架构中基于搜狐开源项目cachecloud提供redis图形化运维、解决方案。
1. cache-cloud相关使用文档见https://cachecloud.github.io/
2. 本系统对redisTemplate进行了封装来支持阿里云redis、cache-cloud提供的redis-standalone、redis-sentinel、redis-cluster共四种缓存应用方案,所有服务可以单独配置使用独立的redis。
3. 服务与服务之间db隔离、缓存隔离。
利用spring-session与set-cookie的方式进行session共享,跨二级域名的单点登录(目前未提供token式的单点登录解决方案)。
利用quartz集成的开源项目xxl-job实现定时任务与业务的拆离,业务只需要关心执行器逻辑实现,xxl-job提供任务调度策略、执行日志记录,如下图所示:
前端及cms模块整体架构如下:
1. 前端页面使用freemarker将需要静态化的部分静态化,不需要静态化的部分则使用vue.js调用api的方式进行渲染,利用nginx ssi模块来进行页面header和footer的引用,简化了开发工作。
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插件发布,提供易用的开发环境。
应用jekins+maven实现版本迭代,spring-cloud本身支持服务的版本控制,可以做到不同版本应用的兼容与并存。
目前不支持图形化的docker部署,但是在发布前有计划研究docker图形化运维工具。
目前只提供hystrix dashboard方式的性能监控与分析调优,未来有计划集成Zipkin等服务追踪开源框架。