全栈开发的几个调试方法

2017技术博文第一弹,先分享一下一些周边。这里所谓的周边,包括很多议题,比如 IDE, 开发环境,系统,测试环境,调试环境等。。。叔叔打算分几个章节来分享,谈谈本叔叔在开发中所用到的一些小技巧,当然可能有更好的方案,可以通过Email 联系到叔叔, ecstorm(AT)gmail.com。

本文打算讲讲调试部分,叔叔目前的技术栈是 Java , Vuejs。操作系统 Mac OS Sierra。Web 服务器使用 Nginx 。 JVM 容器使用 Jetty。

问题

先讲讲问题,目前互联网的 Web 应用,很多都倾向于使用前端框架,例如单页面的应用,后台应用等场景,当然,手机Web网站也可以使用,做成多个入口,既多个单页应用。对于后端的数据,完全使用 Ajax 来加载数据,甚至使用 WebSocket。

那么以此种方式开发,技术上,必然分成前端和后端不同的两组或者多组人,或者说对于全栈开发来说,必然要估计前端后端两方面,开发和调试就比较麻烦了。

方案

面对以上的问题,加之叔叔有个重要的属性:懒。因此,折腾了下用了几个方案。

单兵作战

作为一个全栈,首先要有台 Mac,首先,准备工作做好

  • 安装好 Nginx,无所谓 brew 或者 源码安装。叔叔年轻时都是源码安装,老 Mac 当 Linux 用,后来折腾的差不多了,嫌麻烦,新 Mac 都是 brew。
  • 修改 /etc/hosts ,增加你要调试的域名,之后访问就用此域名。叔叔年轻时都是 Vi 或者 Vim 修改,老了又变懒了,做软链接,或者外面修改好sudo 拷贝过去,因为要把 google 的 host 更新进去,啊哈哈哈。
  • 修改 Nginx 配置,下面贴出一些 demo 示例,基本思路就是 80 端口用来访问域名,后端开个端口让 Nginx 监听,比如 8080, 然后前端应用起个端口,比如 4000,也让 Nginx 监听,然而路径分开,比如 前端直接在根目录 / 下,后端在 /app-name 下,那么前端所有 Ajax 请求就会是以 host 里面加的域名 + /app-name 来的路径来请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name www.mydomain.dev mydomain.dev; //这里是在host里面新加的调试域名
// 下面的 location 用来监听前端起的服务,并代理到 80 端口
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://localhost:4000;
}
// 下面的 location 用来监听后端起的服务,并代理到 80 端口
location /app-name {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://localhost:8080/app-name;
}
}

然后讲后端, 后端必然有个 Web 服务,如下:

Web 服务器 技术语言 容器/应用 端口
Nginx Java Tomcat/Jetty 8080
Nginx PHP PHP-Fpm 9000
Nginx Python gunicorn 5000
Nginx Ruby Rails 3000
Nginx NodeJs ExpressJS 6000

是的,以上列出,本叔叔都尝试过,思路上大致是一样的。

前端目前主要使用 VueJS, 叔叔虽然不大写了,看还是能看懂的,基本上的原理也明了,因此,这里有点概念上的东西要理理清楚,因为此处所用的事实上也是依托 ExpressJS 来启动了一个应用,

事实上,Gulp 和 Webpack 都可以启动个 HTTP 服务,来查看前端页面,当然外置个 ExpressJS 事实上也一样。

一切的准备完成,npm 把前端代码 run 起来,后端服务开起来,Nginx 开起来,然后域名就能访问了。这里 Nginx 无需重启,如果要修改后端,那么重启后端,要修改前端,那么重启前端,十分方便。

多人协作

多人的思路大致也一样,只是有相当的演进,花了不少时间,按照问题来说

  • 测试域名问题,有网关的做网关,之后网关来起 DHCP,各种host 加,会影响全部局域网的机器。当然域名也可以,就是每台机器都要自己配好。这里因为是多人协作,可能需要很多个域名,按照规则分开,比如叔叔的域名结尾以前一直用jk,www.mydomain.jk。
  • Nginx 问题,此处,Nginx 必定要放到局域网的某一台公用服务器上。
  • 服务端口的,这里要看如何操作,一般要多人协作的不大可能是全栈开发,所以,此处有两种方式,一种是后端代码打包放在局域网服务器,供Nginx 监听,之后,前端开发人员可以起服务,端口各自分配协定好,那么自己的应用自己调试。第二种,前端代码放在服务器上,道理一样,开发人员启动服务,让Nginx 监听,使用公用的前端调试。

多人协作其实和单名开发者非常相似,主要是一定要协商好,域名各自用什么,IP尽量用网关配,或者自己配静态IP。

讲讲以前的演进,以前叔叔没有用 Mac 的时候,开发人员公用一台强劲的服务器,各自协商,共用服务,主要是以服务器共享磁盘,或者客户机共享磁盘的方式,这里的坑有个 Nginx 的 sendfile,对网络磁盘挂载的目录有点问题。还有一种方式是用虚拟机,叔叔比较喜欢 FreeBSD,因此用的是上面的虚拟化工具 jail, 挺好用的。

工具

总结一下工具,以上其实已经说的很清楚了,Nginx,Tomcat/Jetty, Nodejs等。

最主要的有几点

  • 平台统一化,使用 *nix 系统,不要因为兼容性的问题降低开发效率,资深的开发人员,公司给配台高配的 MBP,绝对有必要
  • 脚本化,发挥“懒”字诀,能自动化的尽量自动化,重心移到业务开发上来
  • 可监控化,调试必须要能看到日志输出,*nix 的tail 命令无疑是性价比高的最佳选择