我的物联网项目(十二) 单体应用架构不行?

单体应用架构在创业型项目里面是非常合适的,毕竟它主要的担当还是在验证创业模式以及迅速功能实现,所以它从开发到部署,在少量开发人员的基础上能非常减少成本,主要是门槛低,开发效率也非常高。到目前为此,这个物联网项目从开发开始到现在线上运行大概经历了5个月左右的时间,订单数据从日订单几百到现在的七八万,在应用层本身来说并没什么压力瓶颈,中间主要升级了数据库RDS的配置,由原来的4核8G升级到了8核16G,对数据库稍微做了些优化,依然跑到很稳定。公司从实施想法开始,到目前半年的时间里面,不断的总结创业思路和改变策略,所以开发的业务变化由不断的“试误型”开始趋向于明确“清晰型”,而且业务垂直方向也越来越深,由自己做投放商急迫需要转型做招商平台城市合伙人,而且广告内容,和线下门店信息推广也在融合,其实和我之前的电商O2O很类似,一开始自己做个简单交易网站卖东西,做着做着就做B2C,B2B平台,其它的商家也进入这个平台开网店,将线下的信息广告推广也融合进来,大概套路都一样,无非是前期自己先验证模式,觉得可行就做平台告诉别人应该怎么怎么做。公司在半年的时间里面也各种融资好几轮,达到了好几千万级别的融资,接着而来的对软件平台的需求和要求也越来越高。想法谁都有,关键是要去实施,互联网游戏的规则就是这样,技术实施永远跟着产品想法的屁股在后面追。

单体应用架构在项目这几个月业务变化频繁,不断迭代的过程中,的确也出现了很多问题。最开始,业务比较简单,你写同一个工程里面写代码,我也在同一个工程里面写代码,测试完毕后,我这边就直接打成个war包(因为线上部署在tomcat的ROOT目录里面,我有时候直接在本地tomcat的ROOT里面解压缩成zip包),丢到线上服务器,简单方便,速度快的很,这种发包方式我们简称“全量部署”,哪怕你这次改一点点需求只动了一个类里面的一行代码,我也是将所有的代码打包一次,简单业务简单方法处理是没有问题,随着业务需求的累加,并且不断的迭代,这种打包方法隐患慢慢多了起来,有几次线上发包“全量部署”,出现之前OK的功能代码不OK(其实这次发布不涉及到这些功能),细查之,知道开发人员提交了没测试的代码,就算后面非常谨慎和宁愿操作麻烦想保持SVN代码的“纯洁性”,但是风险问题依然存在,后面一段时间,我改用了“增量部署”,就是这次改掉了哪几个类,哪几个文件,在发包文档里面一 一描述,发包的时候只去测试好的测试环境拿下来这几个文件,传到正式环境里面,稍微控了下风险。

当然,单体应用架构本身对应用服务器的性能消耗也没有做到很好的水平扩展,如果后期线上量大,我也只能单台的去升级配置,越到后面升级配置越贵,当然,我们目前的业务还没有这么夸张,但是随着业务的扩展,肯定无法避免这些东西。另外,数据库随着业务的水平扩展,业务的粒度细分,也不可能所有的表都在同一个数据库里面,这个也要求后期提前做好分库分表的架构准备。

我们生在一个微服务四处横行的年代,基本上属于那种不玩单体应用架构,就玩微服务架构,不玩微服务架构,就玩单体应用架构。如果再倒退10年,可能就玩SOA面向服务企业架构,虽然和微服务最终实现的目标差不多,但是SOA表现的方式更多是以系统级别的形式表现,系统与系统的交互,所以更多的是通过传统的webservice的调用来满足按照业务的拆分。好在当今有微服务众多的成熟框架,实现起来更加灵活简单,而且入门也相当简单,更主要的开发起来比SOA更加轻量级。并且这些成熟框架本身集成了微服务中需要解决的基础共用的东西在里面,比如微服注册与发现,路由网关,客户端负载均衡,传输协议等等。话虽如此,但是真正用微服务从头到尾开发过几个项目的开发人员并不多,我们连续好几个月也一直在招聘对微服务,服务化相对熟悉的人,也寥寥无几,来面试的人可能也就是在书上看了些资料,搭建个简单的框架,但是真正沉淀在实际业务场景用微服务开发的人员一直没遇到。

经过再三考虑,我们决定使用springcloud来开发V2.0版本,业务拆分全部微服务化实现,V1.0单体应用架构在这段时间里会小范围维护,集中精力大概用2,3个月时间完成V2.0版本的迭代,脑袋一蒙,后面的大把的坑在等着我们,我们也准备好了打场硬仗。

转载于:https://www.cnblogs.com/dgcjiayou/p/7886716.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android listview优化以及listview混合itemview

listView (ListView) findViewById(R.id.listview); mAdapter new VideoListAdapter(this); listView.setAdapter(mAdapter); 主要adapter public class VideoListAdapter extends BaseAdapter {int[] viewtype {0, 0, 0, 1, 0, 0, 0, 1, 0, 0};//1 jcvd, 0 textView。主要…

vue项目中assets与static的区别

在使用vue脚手架生成的目录中,会有一个src/assets还有一个static。 两者都可以用来放一些静态文件。那有什么区别呢? static中的文件不会被webpack打包,文件被复制到dist/static assets中的文件会经过 webpack 打包,重新编译。…

oracle 用户管理

一、创建用户概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。create user 用户名 identified by 密码; 注意:oracle有个毛病,密码必须以字母开头,如果以数字开头&…

Android 获取当前的时间。年月日,时分秒,星期几

SimpleDateFormat alldate new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//获取日期时间 SimpleDateFormat year new SimpleDateFormat("yyyy");//获取年份SimpleDateFormat month new SimpleDateFormat("MM");//获取月份SimpleDateFormat m…

mac通过homebrew安装opensdk11

1、安装cask brew tap homebrew/cask-versions 2、安装adoptopenjdk/openjdk brew tap adoptopenjdk/openjdk 3、查看一下java、jdk版本 brew search java brew search jdk 4、安装adoptopenjdk11 brew cask info adoptopenjdk11 brew cask install adoptopenjdk11…

缺失值侦测与处理

缺失值的侦测的方法: 1、mice包中的md.pattern()函数可以生成一个以矩阵或数据框形式展示缺失值模式的表格 这个矩阵呢,表示像第一行缺失0个的模式有13行,像第二行缺失1个的模式有1行,如此类推 所以呢,一共就有0*131*1…

工作172:自己工作开始封装的一个小组件

其实很简单 <!--封装部门选择的插件 需要的组件 子组件--> <template><el-select :value"value" placeholder"请选择所属部门" change"handleChange"><el-optionv-for"department in departments":key"de…

高德地图 amap 设置鼠标样式

我的需求&#xff0c;要在高德地图里面做一个地图选点的功能。这个功能很简单&#xff0c;但是高德地图的默认鼠标样式是一只小手&#xff0c;不适合做选点用。 高德地图中有4中样式如下图 对应名称如下&#xff1a; pointer&#xff0c;default&#xff0c;move&#xff0c…

Android 设置定时刷新页面数据,最小自动刷新时间

设置初始时间 SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String thistime df.format(new Date());SharedPreferences sharedPreferences getSharedPreferences("industryInfo", Context.MODE_PRIVATE); //私有…

eslint 设置全局 变量

我在做高德地图开发的时候&#xff0c;喜欢将map作为全局变量&#xff0c;但是eslint会显示报红。 所以需要在.eslintrc.js中加上如下配置&#xff1a; "globals": {"map": true}

Android 自定义软键盘实现

module链接&#xff1a;https://download.csdn.net/download/meixi_android/10652565 compile project(:edlibrary) , :edlibrary <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/…

微信小程序自定义组件生命周期

created 组件实例化&#xff0c;但节点树还未导入&#xff0c;因此这时不能用setData attached 节点树完成&#xff0c;可以用setData渲染节点&#xff0c;但无法操作节点 ready (不是onReady) 组件布局完成&#xff0c;这时可以获取节点信息&#xff0c;也可以操作节点 mov…

改善代码可测性的若干技巧

概述 软件的工程性体现在质量与效率。单测是构成软件质量的第一道防线&#xff0c;而单测覆盖率是软件质量的重要指标之一。 编写容易测试的代码&#xff0c;可带来更佳的单测覆盖率&#xff0c;间接提升开发效率。 为什么程序员不大写单测呢&#xff1f; 主要有如下原因&#…

fragment 调用activity方法,如dispatchKeyEvent,dispatchTouchEvent

以dispatchKeyEvent为例 1、创建回调接口FragmentKeyeventListener /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;13164716840163.com* 日期&#xff1a;2018/9/10 15*/ public interface FragmentKeyeventListener {boolean onFragmentKeyEvent(KeyEvent event)…

前端学习(2657):vue3实现计算器

第一步 引入ref 第二步 第三步

微信小程序map作为子组件wx.createMapContext失效

我是将map封装成了子组件进行使用&#xff0c;发现wx.createMapContext无论如何都没有效果。最后&#xff0c;定睛一看&#xff0c;原来将map放到子组件中&#xff0c;再使用wx.createMapContext需要增加额外的参数this 具体使用方法如下&#xff1a; const mapCtx wx.create…