分享本猿晕晕乎乎的三周时间.
近期因为一个项目在和 CDK8S 合作, 经授权闭源使用 CDK8S 提供的 Web快开框架 sculptor-boot-generator 开发过程中我的每一个毛孔都是舒爽的 (后续会详细介绍这个框架), 原来Java快开领域 不止 JHipster 构建模型上也不止 JDL, 在享受 新框架的给我带来的快感时, CDK8S 的研发理念把身在石器时代的我震撼了. 千言万语归根结底一句话 Web 已死, 我们需要能提高效率的快开框架, 更符合时代的开发理念 !
下文介绍详细经历
如果拿到一个同样的项目需求, 身在石器时代的后端开发状态....
- 石器时代的第一周
- 产品经理加班熬夜弄出来原型图&UI图zip包, 发给项目经理过边需求看看能不能实现, 并要求根据经验评估工时.
- 产品经理拿到评估后的工时在 禅道或者别的项目管理工具上规定截至日期, 有的还会规定明确的里程碑日期.
- 开发们一看被规定了明确的交付日期, 心里有点发毛, 然后开始吭哧吭哧干起来了, 后端根据原型图设计表结构. PC端,APP端,微信公众号端开始画静态页面.
- 大约过了两三天表结构设计完了, 开始在 前端们的要接口的催促下. 花了一天设计接口文档.
- 前端们 拿到接口文档开始用 JSON 模拟接口返回字段. 但是前端们并不知道页面的跳转情况. 就开始骚扰产品经理, 可能产品经理也是熬夜堆的UI方案, 没有用文字标记跳转, 细节也欠缺考虑.
- 快到周五了, 项目经理会过来看看每个开发的进度. 如果进度跟不上的会被暗示周末加班. 想要在家办公? 用内网SVN不存在的!
- 石器时代的第二周
- 后端开始从别的项目里copy代码以及jar包. 构建一个全新的项目
- 前端还是在催接口联调, 后端的几个 CRUD Boy 加了几个通宵后睡眼朦胧的在写(Ctrl+C&Ctrl+V) 增删改查, 因为工期紧急自然不会考虑什么性能了. 多层For循环走起.
- CRUD Boy 在后期写接口的时候,发现接口文档有错误, 或许少了个参数,或许参数名不准确, 就会去开发群里发新的开发文档. 当然前端也不是没事, 都在忙着写静态页面和产品扯皮呢, 看不看的见就不一定了.
- 快到周五了, 项目经理会过来看看每个开发的进度. 如果进度跟不上的会被暗示周末加班. 想要在家办公? 用内网SVN不存在的!
- 石器时代的第三周
- 后端紧赶慢赶搞完了一个重要模块. 拉上搞完这个模块的前端开始联调(踩坑) , 这个时候或许是前端的接口参数对错了, 或许是后端的代码出bug了, 但是更可能的是接口文档的参数出现变更后没有及时更改.
- 又到周五了, 匆匆忙忙发个版到联调环境, 将项目打成 war包, 登录 FTP 服务器, 放到 Tomcat Webapp , 然后启动
start.sh
. 如果有运维的话这件事是交给运维的. - 前端也打个版本出来, 丢个包给测试,
- 测试过来验收里程碑,美约其名 敏捷开发.
- 测试开始测试,发现一堆bug, 比如: 页面显示问题, 输入边界问题, 还有测试不了解需求自己给自己提的bug, 一股脑的指给项目经理, 项目经理说这些bug 先不管, 只要这个模块主要功能能跑通就行.
- 快到周五了, 项目经理会过来看看每个开发的进度. 如果进度跟不上的会被暗示周末加班.想要在家办公? 用内网SVN不存在的!
- 石器时代的第N周
- 在周而复始的研发过程中, 逐渐做完了项目, 开始部署测试服测试, 开发们(运维)开始装 测试服的 数据库, 服务器, 静态资源服务器 等, 如果用户多还可能用 集群, 就更麻烦了.
- 但是终于在公司成员的努力(加班)下完成了, 当然还有一堆隐藏Bug等着呢 !
- 正准备给客户交付呢, 客户打电话过来商量需求变更的事情.....
- 开发们: wsl
如果拿到一个同样的项目需求, 身在青桐时代的后端开发状态....
- 青铜时代的第一周
- 产品经理和需求方协商业务, 输出需求文档(明确需求范围), 并在合同上签订变更声明, 协商通过后开始画原型图以及UE图.
- 交付 UI工程师开始用UI图描述细节, UI图,UE图,原型图,需求文档交付后
- 产品部内部 check 一遍需求, 然后交由 项目经理. 拆分需求为 需求列表指定给 开发者.
- 由开发者对 页面详细评估, 一个接口区分非常复杂,复杂,简单等级, 页面也是同样, 根据这种可量化的指标来控制时间. 并使用 Tapd 来分配优先级.
- 而项目经理则会将项目适用的架构和难点, 给攻克.
- 开发工具上: 使用 Maven私服管理 Jar包, GitLab 分布式管理代码, sculptor-boot-generator 根据表结构生成 CRUD 代码, 如果有特殊SDK模块则提前封装 SpringBoot Stater.
- 基于 PgSql 设计表结构, 有需求文档 UE图 UI图设计起来当然是轻松多了.
- 快到周五了, 项目经理会用 Tapd 看看每个开发的进度. 发现大家的进度都很快速, 如果有个别摸鱼党, 则可因为内网是 Git 可以选择在家办公 !
- 青铜时代的第二周
- 根据 SQL 模型, 设计 yapi , 内容包括 请求Url, 请求参数, 响应数据格式(支持 mock) 大概一两天设计完成. 然后根据实际情况 check一遍参数与返回值.
- 前端还没有反应过来就迅雷不及掩耳的交付 yapi 开发文档, 前端直接把 baseUrl 切为 yapi, 简直何真实接口一样丝滑.
- 进入api开发阶段, 使用 sculptor-boot-generator 按需生成基础 CRUD 代码以及对应运营平台. 当然最优配置的框架也是生成好了的(redis缓存可选). 开发业务代码 ing
- 业务代码开发好了催着前端进行联调. 前端切换 yapi 地址为真实地址联调后, Tapd 上对应的需求 泳道向前游🏊,
- 快到周五了, 项目经理会用 Tapd 看看每个开发的进度. 发现大家的进度都很快速, 如果有个别摸鱼党, 则可因为内网是 Git 可以选择在家办公 !
- 青铜时代的第三周
- 使以前做好的 Docker 镜像配置测试服. PgSql, Nginx, Redis 应有尽有而且还开机自启 !
- 因为一开始就是科学的分配任务, 当然没有特别赶时间, 代码质量相对较高, 测试并没有测试出很多bug !
- 开发们在开发项目的过程中 王者荣耀又升段位了 !
复盘心得
石器时代是曾经绝望中的呼喊,青铜时代是经过修饰的理想状态, 一切并非一帆风顺, 既然作为复盘, 就是事后追求能够精进. 下面细数我犯了那些错误 !
- 因为以前没有用过 sculptor-boot-generator 简称 sbg, 但是用过类似的框架如 JHipster , 我就用 JHipster 的开发经验去套 sbg, 运行代码时发现一堆稀奇古怪的bug, 原来我没有按着文档去开发, 而且我对 sbg 的技术栈也不够了解, 就开始撸代码. 举个最大的不同, sbg 用的是 MyBatis , Jhipster 用的是 Hibernate, 后来我有恶补了 MyBatis 的知识,才慢慢走上正轨.
- 我写 Yapi 时并没有考虑到实际需要用的 参数和返回值情况, 导致前端缺返回值, 后来还因为命名规范问题 多次改变 Yapi, 造成了不必要的联调麻烦.
- 在写代码时我没有考虑到 多端用户多id 的情况, 多次出现 用户基本信息差错id 的情况. 我的代码规范也存在不小的问题.
- 在部署 Docker 时, 我配置 gitlab 的时候用到了 Docker 卷轴挂载:数据目录, 我要修改其配置的时候 直接在本机的 数据目录进行改变, 发现并无效果, 其实你要进入 Docker 里了配置即可生效, 貌似数据目录只是 Docker 的备份.
- 在联调过程中有人不断犯错请不要责怪他, 从自己身上找原因, 是不是自己接口设计的不合理, 文档不够清晰易懂, 思维不要被代码局限.
- 专注一件事才能做好一件事, 时间宝贵!
- 代码不会骗人,写代码需要认真思考之后仔细仔细再仔细 !
🦃, 来一波干货 !
最近一段时间我在云上使用了 Docker 搭建了一台服务器 用于生产环境, 想起当初我接触 CentOS 的时候正处于 虚拟机时代(石器时代) ,那时候容器这个概念还没有普及 只是少数大厂的宠儿, 头几年我们搭建环境都是用云厂商的定制镜像然后再执行下脚本改改配置, 得益于云计算的普及这个过程远远比 虚拟机时代 手动编译原生服务器软件安装来的轻松惬意, 在各厂随随便便 DAU 几百万的今天 我们也不满足于此, Docker 容器化 的出现让 服务器软件的开发者与使用者借助 容器使工作变的省心省力, 接下来我会分享几个不错的 Docker 容器以及以及青铜时代的在线软件.
来自官网的 Docker 容器简介
容器是打包代码及其所有依赖项的标准软件单元,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境。 Docker容器镜像是一个轻量级的,独立的,可执行的软件软件包,其中包含运行应用程序所需的一切:代码,运行时,系统工具,系统库和设置。
容器镜像在运行时会成为容器,对于Docker容器,镜像会在Docker Engine 上运行时成为容器。不论基础架构如何,容器化软件都可用于基于Linux和Windows的应用程序,始终运行相同。容器将软件与其环境隔离开来,并确保尽管开发和生产之间存在差异,但软件仍可以均匀运行。
以上提到了 3个重要的点, 镜像 , 容器, 跨平台
- 镜像: 这个概念相信大家都不陌生吧, 每个人使用 VMware 安装 CentOS 时都是基于 官方给出的 .iso 镜像安装的. 在 Docker 中也有 镜像这个概念. Docker镜像你可以理解为就像 SpringBoot 中的 Starter 一样, 由作者将需要用到的资源按照 spi规则打包到一个
<Dependency/>
中供你调用! 开箱即用的它让你无需考虑其中的依赖构建关系. 学到更多 - 容器: 容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要的VM和操作系统更少, 其实可以抽象理解为一个定制镜像 你可以进入Docker 容器修修改改(里面别有洞天) 当然如果没有做 数据挂载 的话容器被重置了数据就没了 学到更多 。
- 跨平台: 注意是 Docker 跨平台不是容器跨平台, 意思是只要 Docker 能在这个操作系统上运行, 那么你基于 Docker 制作的镜像也可以在这个系统上跑. 比如 Java的跨平台不是 .class 跨平台而是运行 .class 的 JVM 跨平台学到更多.
作者推荐通过这个网站来学习 Docker 会事半功倍 -> 菜鸟教程 | Docker
GitLab
下载 GitLab Dokcer 镜像
docker pull gitlab/gitlab-ce:
执行Gitlab构建命令
执行前注意事项
- -v 需要根据实际卷轴情况创建 目录(PS: 命令行参数不会自动创建目录).
- --hostname clone url 前缀域名, 如果需要被外网正确访问则添加.
- --restart 容器运行中退出时(不是手动退出),自动重启
docker run -d --hostname gitlab.xxx.com -p 1443:443 -p 1080:80 -p 1022:22 --name gitlab --restart unless-stopped -v /root/docker-volume/gitlab/etc:/etc/gitlab -v /root/docker-volume/gitlab/log:/var/log/gitlab -v /root/docker-volume/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
复制代码
注释版
docker run -d \ # 后台运行 -d
--hostname gitlab.xxx.com \ # 指定 clone url 前缀域名
-p 1443:443 \ # 将容器内443端口映射到主机1443,提供https服务
-p 1080:80 \ # 将容器内80端口映射到主机1080,提供http服务
-p 1022:22 \ # 将容器内22端口映射到主机1022,提供ssh认证服务
--name gitlab \ # 指定容器名称
--restart unless-stopped \ #容器运行中退出时(不是手动退出),自动重启
-v /var/lib/docker/volumes/gitlab-data/etc:/etc/gitlab \ # 将本地/var/lib/docker/volumes/gitlab-data/etc挂载到容器内/etc/gitlab
-v /var/lib/docker/volumes/gitlab-data/log:/var/log/gitlab \ # 将本地将本地/var/lib/docker/volumes/gitlab-data/log挂载到容器内/var/log/gitlab
-v /var/lib/docker/volumes/gitlab-data/data:/var/opt/gitlab \ # 将本地将本地/var/lib/docker/volumes/gitlab-data/data挂载到容器内/var/opt/gitlab
gitlab/gitlab-ce:latest
复制代码
✔ 如果你需要 Https 的Gitlab 可以参考 (ps:注意证书名要与 hostname一致)
【docker】开启gitlab + nginx + https之旅
🎈 解决 因为 内存原因导致的gitlab 502 错误(2核4G以下都会有的错误)
🎉一些好的Gitlab 优化建议 !
NGINX
我为了方便运维没有使用 NGINX 的容器, 主要用 NGINX 做容器中的 二级域名 HTTPS转发.
GitLab HTTPS 的配置转发.
-
首先你需要在 阿里Y上 申请免费的DV证书, 当然如果你有通配符证书的话可以跳过这一步...
-
其次确保你的NGINX 是可以被外网访问的,(运行NGINX并开放安全组以及端口), 排查工程中有可能是 NGINX-DNS 出现了错误导致无法访问.
-
在阿里Y 域名控制台 添加 二级域名映射(其他云厂商也是同理)
- 配置你的 NGINX文件, 添加 443端口以及(80转443)配置 (修改 todo 为部署域名并保证你的NGINX版本为 1.14.2及以上).
# https 配置
server {
listen 443 ssl;
server_name www.todo.com;
#设置长连接
keepalive_timeout 70;
#HSTS策略
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
#证书文件
ssl_certificate ./ssl/www/todo.pem;
#私钥文件
ssl_certificate_key ./ssl/www/todo.key;
access_log /data/todo/access_nginx.log combined;
root /data/todo;
index index.html index.htm index.jsp;
#error_page 404 /404.html;
#error_page 502 /502.html;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻擊
add_header X-Xss-Protection 1;
#减少点击劫持
add_header X-Frame-Options DENY;
ssl_prefer_server_ciphers on;
}
# 80转443
server {
listen 80;
server_name gitlab.todo.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
复制代码
- 修改你的NGINX gitlab https 监听转发配置
server {
listen 443 ssl;
server_name gitlab.todo.com;
ssl_certificate ./ssl/gitlab/todo.pem;
ssl_certificate_key ./ssl/gitlab/todo.key;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://127.0.0.1:1443;
}
access_log /data/todo/gitlab_nginx.log combined;
}
复制代码
Yapi
需要注意的地方
ShowDoc
PgSQL
Tapd
扫码回复 "加群" 和我一起月入 20K+
深入浅出分享 Java 干货 , 找回对代码的 Passion , 助力月入 20K+