2021年小公司技术架构选型

企业web应用技术讨论 基于兴趣和职业发展的考虑,我参加了上次关于“增量配网产品”架构的讨论会议,对公司现有的产品,人员,技术储备有了一定的了解。 会上对未来几年公司使用的技术栈有了指导性的意见,但候选项只有项目中已经使用的几个非常成熟的技术,个人认为欠缺广度和深度。 仅有限的几个同事参与,意味着可能公司有人掌握了某项技术,但没有成为一个候选项。 除了手边会用的工具, 也应该到市面上找更合适的工具。 一定的技术预研和储备是非常必要的 故写了这篇文章,抛出我的观察和思考,然后看看“沉默的大多数"中有没有志同道合的人,可以将一些更先进(合适)的技术引入公司业务, 助力公司发展。 由于我们讨论的是企业web应用,所以需要关心的问题大概有下面几类,我们依次讨论。 web, 即前端 一些传统的企业开发不重视前端,觉得能用就行,分工上也没有专门的前端工程师,而是由后端工程师一把梭。 但前端的工作量并不小,开发维护成本很高,且易用性美观度等也大大影响用户对软件的整体印象。 如果有多端显示,小程序等需求,则难度和成本更是直线上升。 传统的 js 和 jquery 应用缺乏模块管理,依赖管理,组件化支持等关键特性, 为了解决这些问题,前端的生态发展很快,工程化和模块化水平已经不输后端,出现了 angular, reactjs, vue, svelet 等优秀的 mvvm 框架, 以及 typescript 这样的强类型编译语言,解决了前端大代码量下的开发效率问题。 对于需要 seo 的应用, 纯静态页面和后台生成页面还有一定市场,但对于企业开发,mvvm是完美的解决方案, 也就意味着前后端的完全分离, 后端只提供数据,展示和交互逻辑完全由前端负责。下面简单介绍一下几个 mvvm 框架的特点。 相同点 组件化 响应式数据绑定 状态和路由管理 不同点 reactjs,facebook 出品,生态丰富,使用 jsx 抽象程度高,学习成本高,大公司使用较多。 vue,华人出品,生态较丰富,使用模板抽象程度较高,学习成本低,中小公司和国内使用较多。 svelet 较新,基于一种新的思路,即将运行时的问题提前到编译器解决,目前在前后端均出现了这样的案例。优势是没有运行时,代码小,性能高,很适合做组件开发。 应用层,即后端 移动互联网的发展催生了很多高并发和大数据量的业务,也造就了云厂商的繁荣和容器技术的发展,devops 和云原生等技术被提出,用于解决后端日益复杂的开发运维问题。以 k8s 的出现为标志,基本解决了云环境下的cpu,内存,网络,存储这些计算资源管理和分配问题,有人说 k8s 是云环境下的操作系统,所以后端的开发不得不考虑基础设施到底是啥的问题。...

February 1, 2021 · 1 分钟 · ming

git 读取对象 XXX 失败: 错误的消息

今天早早来到办公室,准备大干一场,谁知道git出现问题。 准备更新代码 准备切换到公共分支更新代码 ❯ git checkout dev M dev.properties 切换到分支 'dev' fatal: 读取对象 c72f18fb5b1c2780f18afd7b2a0ce15d15984a47 失败: 错误的消息 ❯ git status 位于分支 dev fatal: 读取对象 c72f18fb5b1c2780f18afd7b2a0ce15d15984a47 失败: 错误的消息 切换成功,但是 git 提示 fatal: 读取对象 c72f18fb5b1c2780f18afd7b2a0ce15d15984a47 失败: 错误的消息,用了好多年 git 第一次碰到这个错误。用 git log看历史记录,只能看到最近的7, 8个提交,然后也是上面这个错误。 定位问题 网上找了一通,似乎没有人碰到过这个问题 ❯ git fsck --full error: 不能 mmap .git/objects/82/27d7402106a51b5fedad7bcb2fba73ba6d7e3f: 错误的消息 error: 8227d7402106a51b5fedad7bcb2fba73ba6d7e3f:对象损坏或丢失:.git/objects/82/27d7402106a51b5fedad7bcb2fba73ba6d7e3f error: 不能 mmap .git/objects/84/97288737064b6239b8c3029db78fa60e228286: 错误的消息 error: 8497288737064b6239b8c3029db78fa60e228286:对象损坏或丢失:.git/objects/84/97288737064b6239b8c3029db78fa60e228286 error: 不能 mmap .git/objects/98/26f8edc0708b4da83e0ef11c7d2067c0de43b3: 错误的消息 error: 9826f8edc0708b4da83e0ef11c7d2067c0de43b3:对象损坏或丢失:.git/objects/98/26f8edc0708b4da83e0ef11c7d2067c0de43b3 error: 不能 mmap .git/objects/c7/2f18fb5b1c2780f18afd7b2a0ce15d15984a47: 错误的消息 error: c72f18fb5b1c2780f18afd7b2a0ce15d15984a47:对象损坏或丢失:....

November 5, 2020 · 2 分钟 · ming

微服务:难民-单体架构的边界在哪里

下面的文章是微博上某博主探讨微服务架构时的看法,大意是单体架构的边界比想象中宽广的多,和我的有些想法很契合,特转发至此。 Martin Fowler 开的公司是做技术咨询和外包服务的,最热衷这种新名词了 (不搞点新概念怎么开展新业务)。还有现在的云厂商也很乐于推微服务架构,多好的卖机器卖服务的机会啊,一个原本只用单机部署的系统鼓吹一下搞成微服务拆成 N 个系统后又可以多赚几倍的钱了。 我在传统行业做了 10 几年的企业应用,从地市级到省级系统,只要是面向内部用户的,就没有一个是单体系统满足不了的。微服务架构更适合那种用户规模起来之后的互联网企业,从阿里辞职出来之后,过去 8 年,我再也没参与过基于微服务架构的系统了,因为没有真实的需求。 我当初就是在阿里的中间件团队工作,微服务架构的系统所需要的三架马车全在我们组,包括服务框架、分库分表中间件、消息中间件。这三架马车我就参与了其中两架: 服务框架、分库分表中间件。 服务框架当初阿里的叫 HSF,除了最基本的 RPC 功能也有软负载,然后还得有 config server 做服务的注册与发现,搞到后面你还得做一个分布式调用链跟踪系统,为了存储分析调用链中的日志又得引入一整套的大数据领域的技术栈 (当年我们全网每天的调用量是 2000 亿起步)。 现在开源的微服务技术栈可以选用 Apache Dubbo 做 RPC 框架,但是服务注册与发现你还得配合其他的 (比如 Apache Dubbo 官方推荐用 zookeeper)。顺便说个八卦: Apache Dubbo 就是当年在阿里内部跟我们组的 HSF 竞争失败后开源出来的,现在能流行也是无心插柳。自从阿里云这家子公司做成了之后,发现微服务可能是门好生意,Dubbo 这个弃儿居然还有不少用户,然后又把 Dubbo 捡起来了,至于阿里云上面是套 Dubbo 的壳卖 HSF 的企业版还是别的动机我就不多猜了。 除了 Apache Dubbo,现在 java 平台上的微服务技术栈还有比较火的 Spring Cloud 全家桶,我只看过,但没有用过。vert.x 也有微服务的套件,我也没有用到真实的商业系统中。说白了就是没有几个系统需要上微服务。 以上说的还只是解决 API 层面的调用问题,你以为一个采用微服务架构的系统有了 Dubbo 和 Spring Cloud 就够了吗?错错错,session 管理在阿里都需要一个专门的小中间件,为了解决不同系统的消息传递问题,又得引入消息中间件。 还有最难的,数据层的问题怎么搞?你告诉我拆成了 N 个系统后还搞一个共享数据库?逗我玩呢。微服务架构的系统在数据库的层面基本上多是 OLTP 类型的,现在开源成熟的面向 OLTP 的分布式数据库可以说没有,别跟我提国内某司的 NewSQL 数据库,那东西在 OLTP 场景下的性能简直不能看,所以现在还是会用 MySQL 这样的传统关系数据库,然后搭配分库分表中间件来解决微服务架构系统的后端存储问题,拆分后的子系统都有自己的数据库集群。...

November 4, 2020 · 1 分钟 · ming

微服务:雄伟巨石可以成为城堡

DHH 在 2020.04.08 发表了一篇最新博客 “The Majestic Monolith can become The Citadel”,继续讨论对微服务的一点看法,提出了一种与微服务相对的 “城堡” 模式。在推上也引发了不少关注,搜关键字 “The Majestic Monolith” 就能看到很多。这是原文链接:https://m.signalvnoise.com/the-majestic-monolith-can-become-the-citadel/ 我按照个人理解,粗略翻译了一下。大家可以对照原文来看,如有翻译不准确的地方,请在回复中提出来。 大多数的 Web 应用应该都是从一块 “雄伟巨石” 开始其生涯的:一个单一代码库做其所需的所有事儿。与之相对的是一群 Service,不管这些 Service 是 “微” 还是 “大一点” 的,都试图把应用切成孤岛,每个仅做整体工作的一小片而已。 大多数的 Web 应用都将以 “雄伟巨石” 形态在其一生中都能持续提供很好的服务。这种模式的上限很高,比大部分人幻想成为架构师时所能想象的要高得多。 但是,尽管如此,“雄伟巨石” 仍然会有需要一些帮助的那一天。也许你正在与庞大的团队打交道,其中的人们相互磕磕绊绊(即使这样,别忘了有很多非常大的组织依然在使用 monorepo 模式!)。或者你终究会遇到极端负载下的性能或可用性问题,这在 “雄伟巨石” 的技术选择范围内无法轻松解决。你的第一直觉将是改进 “雄伟巨石” 直到其能够应对问题,做了这一切而没成功时,你才会考虑下一步。 下一步就是 “城堡”,保持 “雄伟巨石” 在中心位置,但用一系列的 “基地” 对其支援,每个分离出应用程序职能一个小的子集。“基地” 使得 “雄伟巨石” 得以卸下其不同行为的一个切片,(这些不同行为)要么是出于组织原因,要么是出于性能或实现的原因。 一个在 Basecamp 的这种例子是我们的旧 chat 应用 Campfire。它是在 2005 年构建的,那时 Ajax 和其他 JavaScript 技术都还很新颖,所以它基于 polling 而不是现代 chat app 目前使用的长连接。这意味着每个客户端连接到系统都会每三秒触发一个请求来询问 “是否有我的新消息?”。大多数这些请求都会回答 “不,没有”,但为了获取这个答案,你仍然不得不对请求进行身份验证,查询数据库,等等。...

November 4, 2020 · 1 分钟 · ming

vmware中manjaro与宿主机window10不共享目录的解决办法

买了新电脑 r7000后,我在 VMware 中装了 manjaro 作为日常开发, 这样我即可以同时使用 windows 和 linux 下面的软件,挺好,满足我的需求。 但碰到一个问题,在 VMware 设置了共享目录不工作,网上有人说是原生 vmware-tools 对 manjaro 支持不好,需要打 patch;也有人说用自带的 open-vm-tools 即可,但我试了各种方案都不行。最后只能用在 windows 中用 ftp 软件往 manjaro 中读写文件。 今天有时间又折腾了一下,这次ok了,我们只需要如下设置就可以使用挂载的共享文件 manjaro 中获得宿主机共享目录名 /usr/bin/vmware-hgfsclient # 下面是我这里的输出,你那可能不同 vmwareShare manjaro 创建挂载目录 mkdir -p /mnt/hgfs 将宿主机共享目录挂载到虚拟机中 sudo ./vmhgfs-fuse -o allow_other -o auto_unmount .host:/vmwareShare /mnt/hgfs 我这边就ok,我的相关软件版本分别是: window 10 VMware 15.5.6 build-16341506 Manjaro 20.1.1 Mikah 参考 VMware-tools安装以及找不到共享文件夹的解决办法

October 25, 2020 · 1 分钟 · ming

数据库变更管理工具 flyway

Flyway的工作模式 Flyway可以对数据库进行升级,从任意一个版本升级到最新的版本。但是升级的依据是用户自己编写的sql脚本,用户自己决定每一个版本的升级内容。 Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求: V1__Initial_Setup.sql V2__First_Changes.sql V2.1__Refactoring 其中的文件名由以下部分组成,除了使用默认配置外,某些部分还可自定义规则: prefix: 可配置,前缀标识,默认值V表示Versioned,R表示Repeatable version: 标识版本号,由一个或多个数字构成,数字之间的分隔符可用点.或下划线_; 不允许多个脚本文件有相同的版本号。 separator: 可配置,用于分隔版本标识与描述信息,默认为两个下划线__ description: 描述信息,文字之间可以用下划线或空格分隔 suffix: 可配置,后续标识,默认为.sql 使用Flyway升级,flyway会自动创建一张历史记录表: flyway_schema_history。 这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果: flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。 如果flyway检测到发生了变化,则抛出错误,并终止升级。 如果已经执行过的脚本没有发生变化,flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。 所以,flyway总是幂等的,而且可以支持跨版本的升级。 如果你好奇,flyway如何检查脚本文件的内容是否有修改。 你可以注意以下记录表中有一个字段checksum,它记录了脚本文件的校验和。flyway通过比对文件的校验和来检测文件的内容是否变更。 使用上面的方式,升级一个空的数据库,或者在一直使用flyway升级方案的数据库上进行升级,都不会又问题。 但是,如果在已有的数据库引入flyway,就需要一些额外的工作。 flyway检测数据库中是否有历史记录表,没有则代表是第一次升级。此时,flyway要求数据库是空的,并拒绝对数据库进行升级。 你可以设置baseline-on-migrate参数为true,flyway会自动将当前的数据库记录为V1版本,然后执行升级脚本。 这也表示用户所准备的脚本中,V1版本的脚本会被跳过,只有V1之后的版本才会被执行。 h2 控制台 maven clean package java -cp target/demo-0.0.1-SNAPSHOT/WEB-INF/lib/h2*.jar org.h2.tools.Server # 看到图形界面后 http://127.0.1.1:8082 改变jdbc url 为 jdbc:h2:file:/home/ming/learn/https_demo/h2data # 用户名 sa, 秘密为空 命令 所有的命令,以如下的格式执行: mvn flyway:{flyway-command} migrate mvn flyway:migrate 这个命令会搜索默认的脚本目录,检测并根据结果选择执行升级脚本。 clean mvn flyway:clean 这个命令会清除指定schema下所有的对象,包括table、view、triggers…,让schema变成空的状态。 info mvn flyway:info 这个命令显示指定schema的升级状态,当前的数据库的版本信息。...

October 18, 2020 · 2 分钟 · ming

Springboot项目的nginx_https配置研究

近期研究了一下 springboot jsp web 项目的 https 部属,分享一下成果,代码见 https://gitee.com/feitian124/https_demo 准备工作 clone 并打包该项目, 以 war 包方式在 tomcat 中运行,访问 “http://localhost:8080/”, 可以看到网页内容 “welcome, now:14:05:23.489”。 新装 nginx, 访问 “http://localhost/", 可以看到 nginx 的欢迎页面。 80 端口访问项目首页 修改 nginx 如下配置, 可以 http 正常 80 端口访问项目首页了, 但 https 仍然不行。 location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } Nginx 配置 HTTPS Nginx 配置 HTTPS 并不复杂,主要有两个步骤:签署第三方可信任的 SSL 证书 和 配置 HTTPS...

September 24, 2020 · 2 分钟 · ming

618换台好用的电脑吧

俗话说工预善其事必先利其器,我观察很多优秀的程序员,都会将自己的工具整的很顺手,无论是软件还是硬件。而电脑就是最重要的一个硬件,是每一名程序员的必备工具,一台好用的电脑可以让你效率更高,心情也更愉悦。 我家里有 3 台电脑,其中一台笔记本和一台台式机是我的,有 6 年左右历史了,开多了应用或者虚拟机的话,就会比较卡。前段时间换了 manjaro,体验好了不少,大家有老旧的机器希望延长它们服役时间的话,可以试试换个轻量级操作系统。这里埋个坑,下次讲讲我一个使用 ubuntu 7年多的老用户为什么这次会选择使用 manjaro 来给老机器续命。 还有一台是媳妇的 macbook air, 6千多买的最丐版,媳妇看看视频什么是够的,开发的话配置就太低了。6 千多只能买 i5 2核 8g 内存 128g 硬盘,不是果粉或者做 ios 开发的话,苹果的性价比我是觉得很低的。 这不马上 618 了吗,我也想着乘这段时间换一台好用的电脑。不巧前段时间,业界大神 Linus Torvalds 公开其最新 Linux 开发 PC 的所有配置, 我们先来看看大神的配置: CPU — AMD RyzenThreadripper 3970X 主板 —技嘉 Aorus TRX40 Master Fan — Noctua NF-A14 PWM,高级静音风扇 CPU 散热片 — Noctua NH-U14S 和 Noctua NF-A15 Case — Be Quiet Dark Ba​​se 700 Extra Fan — Silent Wings 3 电源设备 — Seasonic Focus GX-850 Storage — 1TB SamsungEVO 970 Memory — 4x16GB DDR4-2666 Linux distro — Fedora 32 笔记本电脑 — Dell XPS 13 这是两台机器...

June 5, 2020 · 1 分钟 · ming

不需要打包的构建工具snowpack和vite

关注 vue3 的人一定关注到尤雨溪的另一个开源项目 vitejs, 它是一个不需打包的构建工具,开发时使用 es module 导入代码,生产环境用 rollup 构建。 它 有一些显著的优势: 使用es module导入代码, 极快的启动速度(ESM) 即时的热模块替换(HMR) 真正的按需编译 目前尤雨溪似乎花费了蛮多精力在这个项目的,目前 vitejs 600左右 commit,vue3 2000左右 commit, 粗略估算工作量前者约后者的 30%,我甚至忍不住想 vue3 的延期会不会跟这个项目有关呢?可见尤大对这个项目的重视。 vitejs 依赖现代浏览器的一个关键特性,即es module imports, 那么市面上有没有类似的工具呢? 答案是有的,vitejs 的 how and why 章节也列了出来,其中最接近的一个就是 snowpack,文档里说道: 两个工具都原生支持基于 ESM 的 HMR。 Vite 先一步支持, snowpack 在 v2 时也支持了。双方在基于 ESM 的 HMR 上合作过,尝试建立统一的 api, 但因为底层不同还是会略微不同。 vite 更加专注,自带更多功能,如 typescript 编译,css 导入, css 模块和 post css 的默然支持。 生产环境打包, vite 使用 rollup, snowpack 使用 parcel/webpack 今天恰巧也关注到 snowpack v2 的发布博客, 在 v1 的目标 在浏览器中直接使用 npm 包外,v2 又增加了对基于 ESM 的 HMR 的原生支持。它有如下特性:...

May 28, 2020 · 1 分钟 · ming

spring官网推荐的学习项目sagan

spring 系框架如 spring, springboot, springcloud 等已成为 java 开发的标配,笔者也是 spring 系框架的多年用户,它们遵循统一的原则,原理清晰,实现优雅, 更新及时,很多最佳实践慢慢都沉淀为规则,为广大 javaer 提供了很多开箱即用的便利,大大降低开发成本。 官方网站一般是学习和查阅某种技术资料的首选, spring 也不例外. 前段时间,我惊喜的发现它们的官方网站 改版了, 风格更加清爽轻量,访问速度更快,布局更加条理找文档更加方便了。在这个前端框架层出不穷的年代,我有点好奇 spring 的官网前端和后端分别是用 啥做的, 又有啥亮点呢? 我们来一探究竟。 首页截图 分析网站技术架构有一个不错的工具 wappalyzer, 不过我们这里用不到,因为他家官网源码是开源的。 把源码 clone 下来,README 上面一开始就写着: In addition to the practical purpose of powering Spring’s home on the web, this project is designed to serve as a reference application– resource that developers can use to see how the Spring team have used Spring to implement a real-world app with a few interesting requirements....

May 26, 2020 · 2 分钟 · ming