一种可行的云服务架构实现

本人很懒,只想说重点。


一直在公司负责一些基础框架及基础服务的编写,这写东西的特点是业务无关性属性较重,需求稳定且明确,一套框架或服务能给更条业务线使用,如分布式分布式定时任务服务、分布式全文搜索服务、分布式图片存取服务、分布式邮件发送服务、分布式短信发送服务、分布式地理位置服务等等等等。


问题:

基于传统的多环境各用一套配置的作法优点是简单明确,但缺点是多个环境都需要部署一套基础服务,即使代码完全一样只是配置有所不同而矣。比如一个全文搜索服务,拿es来说,各环境的cluster nodes和索引源就各不一样(不然索引文件会冲突),如果以目前成熟的Spring Profile作多环境配置区分,那么各个环境的配置不一样(比如开发环境是config-dev.properties,测试环境是config-test.properties,alpha环境为config-alpha.properties,beta环境为。。。),那么全文搜索服务需要针对各环境都部署一套。如果再加上各业务线呢,比如我们公司有5条业务线,但都会用到这些基础服务,假设内网环境为3个(test, alpha, beta),那么总共需要部署5*3=15套基础服务,这还只是一个全文搜索服务,再加上各基础服务数量,比如10个基础服务,这就总共需要有5*3*10=150个服务!!而且以后每增加一条业务线或每增加一个环境,这些基础服务都需要增量部署,这对于运维来说简直是灾难。


尝试现成的开源解决方案:

也许有人的本能反应是通过配置中心来解决,但目前互联网上的开源比如淘宝的diamond和百度的disconf它们主要致力于更新而不是增删,也就是说所有的变量要在事先确定。它们的应用场合的基本前提是确定了已有的变量,它们的应用目的主要是为了调参,比如一个timeout变量本来是5s,后经系统监控或其他方式决定将timeout调成3s才最合适。但对于增删变量的需求,它们无法很好满足。而事实上我现在说的需求就是增删可能会比较频繁的,比如增加一条业务线的一个环境,你事先没法知道是哪条业务线的哪个环境,又比如删掉一条业务线的一个环境,你也无法预先得知,这时候我们该怎么办呢?


单容器动态多实例方案:

拿最简单的数据库来说吧,传统方案会针对于多环境各配置一个db url,db user, db pwd等,这些数据是写在多环境的配置文件里的。并且容器启动的时候会静态加载这个配置拿到一个DataSource,于是对于N个环境的不同db配置,需要N个容器来启动实现物理隔离,这种方式也就回到了一开始的问题。

有一种可行的单容器动态多实例方案能解决上述问题,还是拿数据库来说吧,该容器通过一个“新配置中心”(它可以是在一个db、一个文件系统、zkp等等)读取已知的各个环境,并且动态地创建相应的DataSource来接受各个环境的请求。当增加一条业务线的一个环境时,我们可以动态地创建这个环境的DataSource;当删除一条业务线的一个环境时,我们可以动态地销毁这个环境的DataSource;当更新一条业务线的一个环境时我们可以动态地销毁这个环境的DataSource然后再创建这个环境的新的DataSource。按照这种作法,我们就可以支持一套基础服务部署就能支撑N条业务*M个环境了。

拿之前假设的数据,就可以从5*3*10=150个服务减到固定10个服务,如果以一个服务一台机器(物理机或虚拟机)来说,我们就可以将服务器机器台数从150台直线减到10台,并且一直维持10台的数量。


目前我们公司就是这么做的,大大节省了服务器数量以及运维成本。从设计的架构来看,这就是一种云服务,调用者只需申请一个全局唯一的app id就能享用基础服务,比如我们有一条业务线叫c2c电商,它需要增加一个内部环境gamma,那么这个app id就可以是c2c-gamma。首先申请者需要通过我们的admin管理界面配置好各基础服务的信息,点击申请完成后,我们的消息中心就会扩播这条消息到我们的各个有关联的基础服务,然后我们的基础服务就可以通过新配置中心拿到这个c2c-gamma的服务配置然后动态地启用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。本课程是一门专业的Java微服架构开发实战课程,主要讲解了当下流行的SpringBoot框架、SpringCloud架构以及与第三方技术整合开发实战内容。通过本课程的学习,能够理解并掌握SpringBoot的基础知识,同时能够掌握SpringBoot与常用的第三方技术整合实现实际开发中的业务需求,包括实现Web开发、数据访问、缓存管理、安全管理、消息服务、任务管理等;了解并掌握SpringCloud微服务架构的基础知识及相关组件的应用,掌握微服务架构在企业级开发的实践,建立起微服架构思想。项目技术栈:采用SpringBoot简化商城系统的初始搭建以及开发过程采用SpringMVC+Spring+IBatis完成项目的整合采用Mysql作为数据库存储,Druid配置数据库连接池采用SpringCloud+Netflix 微服务技术栈的实战开发使用Redis完成缓存的数据存储,搭建Redis搭建主从、哨兵、集群应用,保证Redis的高可用使用ElasticSearch全文检索系统进行商品数据搜索,使用ElasticSearch搭建搜索服务的高可用使用Ngnix实现页面动静分离与负载均衡的配置采用FastDFS文件储存系统文件存储,完成广告图片、商品图片的上传和存储系统使用采用CAS+shiro单点登录系统实现用户认证使用ECharts根据后台查询数据生成图表使用POI实现了商城盈利状况的Excel表格导出。商品的详情页使用Thymeleaf完成页面静态化,减少页面数据展示延迟项目中使用SpringBoot下的Aop + 自定义注解完成用户行为记录,日志采集后台管理系统使用Shiro实现登录验证和权限管理(超级管理员、管理员、产品编辑员)项目整合微信完成订单的支付使用Redission完成分布式锁,生成订单的编号使用SpringCloud Alibaba Seat完成下订单模块的分布式事务(新增订单表,库存减少,库存超卖设计)使用RabbitMQ 做消息队列,完成订单未支付自动取消和模块直接的解耦合使用Quartz任务调度,完成缓存的定时刷新,保证缓存的一致性使用本地消息表机制完成消息然队列RabbitMQ消息可靠性传输订单支付模块使用微信扫码支付,并设置订单超时自动取消通过Jquery实现前端校验,通过基于Hibernate的Valida注解实现后端的校验功能使用Base64编码对Json数据传输进行编码和解码项目使用RESTful设计风格实现资源的访问,实现前后端分离项目使用聚合数据第三方短信平台完成用户的登陆功能项目使用SpringBoot整合JavaMail完成邮件的发送项目使用SpringBoot整合Swagger2生成接口文档使用PostMan完成接口的测试项目的测试:SpringTest、dbunit、EasyMock使用Docker 进行应用的自动化打包和发布、自动化测试和持续集成、部署和调整其他应用使用 PowerDesigner,完成数据库的建模项目使用禅道进行BUG管理环境采用Maven实施多模块项目构建,采用Git进行项目版本管理 架构解读:  项目部分截图:              讲义部分截图:          

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值