<5人公司极简研发方案
人过35,被年轻人卷走了一大半,还停留在这个行业的,不是在创业,就是在创业的路上。
创业很难,刚开始没钱没人,啥都要自己干,一个字累。好处是地基是自己搭的,心里有底。不过博主最近健忘的毛病愈发严重了,趁还清醒纪录点滴。
PaaS
博主做的是物联网项目,目前涉及到的通信协议有lora、4G/Cat1、BLE,传输协议有MQTT、HTTP、TCP私有协议。大致草图如下:

一般来说,MQTT能满足大部分业务需求,但在某些场景比如文件下发/自定义分包拼包时处理起来比较复杂,这时使用HTTP更合适,但对于设备并不友好(MQTT与HTTP谁最适合物联网?),所以有时自定义协议也不可避免。另外如果觉得MQTT实现或对接起来太麻烦,很多特性又用不到,那其它协议或自定义协议是更好的选择。
MQTT虽然通用,但不是万能的,不是非它不可的,说到底,它也只是一套诞生于具体场景,为了解决某些问题,一步步发展起来的协议罢了。
系统拓扑
然后买服务器,走阿里云,买多少呢?主要是ECS,有以下几点要求:
- 前台、后台、PaaS网关分开部署;
- 还有各类中间件,前期就把它们一块放一台机子上得了;
- 一个私有docker镜像仓库用于CI/CD,与业务无关,独立部署,带宽也独立(上行为主,几乎不下行,所以开个最小1M带宽即可)。
这么看来至少5台ECS,网络架构如下:

麻雀虽小,五脏俱全。横向和纵向都有较好划分,界限清晰,方便以后扩展。
考虑到便于运维/CI/CD/微服务/日后引入K8S,所有服务都以docker容器形式部署。
为了省钱&安全计,只给必要的两台ECS开了公网(EIP),除docker镜像仓库外,挂载nginx的那台也要开通公网对外提供服务,对内转发请求。需要注意的是,ECS若没有公网IP,则自身也无法访问外网(记得以前可不是这样的)。那如果内网ECS要调用外部第三方接口怎么办呢?同样可经由nginx转发。在此场景下,nginx兼具反向和正向代理的职责。
内网ECS获取公网docker镜像也存在无法拉取的问题,可以在私有仓库的那台机子上先拉取下来,然后打个tag,再push到本地仓库,如此其它ECS就能在私有仓库里pull到该镜像了。示例如下:
# 私有仓库基于registry,端口6500
# 以nacos为例,在部署了仓库的ECS上执行
docker pull nacos/nacos-server
docker tag nacos/nacos-server:latest localhost:6500/nacos-server
# 重新发布到私有仓库
docker push localhost:6500/nacos-server
# 内网ECS拉取镜像
docker pull 仓库ECS内网地址:6500/nacos-server
阿里云ecs.s6-c1m2.xlarge 4M带宽(固定)比ecs.t5-lc1m4.large (无性能约束实例) 5M带宽 (固定)下行速率更快更稳定,后者卡的一笔,经常断连(可能受其它共享主机影响?),直接升级到15M后可正常使用。
反向代理,除了nginx,我们还使用了HAProxy。前者处理http转发(L7),后者处理tcp转发(L4)。虽然nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。然而其默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理。目前官方也没有提供默认有该功能的docker镜像,需要自己打包,稍显麻烦。
自动发布
自动发布是CI/CD的基础。本人使用的是gitlab-ci,相比jenkins,gitlab-ci资料并不多,不过其官方文档已经挺全面了,遇到问题基本上也有前人踩过坑,可参看博主以前写的一篇随笔GitLab-CI/CD入门实操。
以后端应用为例,流程大致如下:

有几点图中未表明:
- 代码提交/merge到不同分支,将触发各自分支的发布流程。比如dev分支将发布到内网测试环境,master分支将发布到线上生产环境。
- 对于前面说的生产服务器没有公网地址的情况,公司内网的
gitlab-runner无法直接登录,就需要拥有公网地址的服务器作为跳板机登录。
如果在发布流程中加入代码规范check、code review、通知机制、及手动干预功能(如提供管理界面,测试人员点击测试通过或不通过按钮控制流程走向)等,那CI/CD就初具雏形了。
git分支管理
顺便再说说代码分支。一直都存在的有master和dev分支。master对应线上生产版本代码,dev对应本地开发版本代码。生产部署都走master分支,当线上有bug或紧急需求时,从master分支切一个hotfix分支出来,开发测试完毕之后并回master并删除该hotfix分支。而产品迭代需要处理的bug和需求,从dev切分支,一次迭代一般起一个feature分支,开发测试完毕后并回dev分支(或并回后做测试,视情况而定),然后dev再merge到master,上线。流程大致如下:

注意hotfix和feature分支可能同时会有多个,完成之后即删除。
其它资料
为什么用MQTT而不用TCP长连接透传
互联网推送服务原理:长连接+心跳机制(MQTT协议)
LoRaWAN介绍 - LoRa从业者读这篇就够了
基于GitLab的工作流程设计
<5人公司极简研发方案的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- [bug] IDEA 创建springboot项目 “Initialization failed for ‘https://start.spring.io‘
原因 网络问题,更换阿里云服务器,或自己搭建服务器 参考 https://blog.csdn.net/soulofball/article/details/107157872 https://blog ...
- 用JIRA管理你的项目——(二)JIRA语言包支持及插件支持
昨天兴奋地把JIRA环境搭好,瞅了一眼管理界面--全英文,真是汗! 尚且不说全中文版管理界面让人操作起来多少会有困难,更别说是全英文! 昨天赞叹JIRA语言包支持丰富,今天终于找到了号称100%的语言 ...
- [刷题] 349 Intersection of Two Arrays
查找问题 查找有无(只有键) 元素'a'是否存在 set(集合) 查找对应关系(键值对应) 元素'a'出现了几次 map(字典) set和map的底层实现是红黑树 常见操作 insert() find ...
- 【转载】Linux踢出其他正在SSH登陆用户
Linux踢出其他正在SSH登陆用户 在一些生产平台或者做安全审计的时候往往看到一大堆的用户SSH连接到同一台服务器,或者连接后没有正常关闭进程还驻留在系统内.限制SSH连接数与手动断开空闲连 ...
- inux操作系统测试工具
inux操作系统测试工具 转载minions_222 最后发布于2017-08-02 11:42:13 阅读数 1481 收藏 展开 转自:http://blog.csdn.net/crisscha ...
- Linux信号(signal) 机制分析-(转自h13)
[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
- 机器学习实战二:波士顿房价预测 Boston Housing
波士顿房价预测 Boston housing 这是一个波士顿房价预测的一个实战,上一次的Titantic是生存预测,其实本质上是一个分类问题,就是根据数据分为1或为0,这次的波士顿房价预测更像是预测一 ...
- Jmeter- 笔记12 - 性能测试分析 & 性能测试流程
性能测试分析 场景设计.监视图表: 设计场景:阶梯式.波浪式 监视器: 收集用于性能分析的数据:TPS图表.聚合报告\汇总报告.察看结果树.响应时间.吞吐量 服务器资源监控:cpu.内存.磁盘io 分 ...
- SQL Server 动态创建表结构
需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...
- setTimeout使用问题
通常禁止使用setTimeout的情况: 1.不能用于模拟异步,有的人不熟悉异步流程,而使用setTimeout伪实现,比如设置一个 setTimeout 来等待函数执行完毕,正确做法是使用回调来处理 ...