作为产品经理的你,每次被喷不懂技术的时候,是否也曾想过暗暗发力,恶补一波技术,然后惊艳所有人?但冷静之后,又觉得无从下手?
是不是还想过要不要学习一下编程?然后被人推荐了什么python、java、php,还在考虑学什么数据结构,算法?
实际上,这些只是技术的局部,如果缺少全局视野,技术问题就永远是一团浆糊。
今天,大王就来给各位产品同学聊一聊那些平时 “耳熟不详” 的问题。通过大王火锅店,建立Web系统部署架构的全局观。
第一章 大王火锅店
我们先来看看小明是怎么在大王火锅店里吃上火锅的。
* step1 小明打出租来到大王火锅店门口,首先接待他的是门迎。
* step2 门迎看他五官端正,衣着得体,应该是个正常的食客,就让他进去了。
* step3 进到店里面,大堂经理接待了他,把他领到座位,问他要什么菜。
* step4 大堂经理把小明的诉求告诉了服务员。
* step5 先后来个四五个服务员,有给他上锅底的,有给他拿果汁的,有给他端菜的,还有给他唱歌的 “对所有的烦恼说拜拜,对所有的快乐说嗨嗨……” 。
第二章 大王火锅门户网站
现在我们把出租车、门迎、大堂经理都换个名字,大王火锅店就会变成大王火锅门户网站。
* step1 小明在浏览器输入大王火锅店网址,浏览器会进行DNS域名解析,将浏览请求路由到大王火锅店门户网站的服务器。
* step2 在正式访问服务器前,访问请求会先进入防火墙,防火墙会判定请求是否合法,如果请求没有问题,就将请求转发给负载均衡。
* step3 负载均衡的作用就像是大堂经理,他并不处理具体的事物,而是将用户请求分发给其他服务,他最重要的任务是合理的分配工作。比如:将查询图片的请求发给图片服务,将处理文字的请求发送给文字服务。(Nginx是时下最常见的负载均衡服务。)
* step4 网站的服务大体可以分为前端服务和后端服务,前端服务负责网页的展示,后端服务负责处理数据并将数据传递给前端进行展示。
* step5 前端展示给用户的页面信息,有些是经常用到的,会放在缓存里,用的时候从缓存里去取会非常快。而更多的数据需要经过后端服务的深加工,就需要和后端服务进行交互,这就是服务间调用 。
* step6 数据库里存放着网站全部的数据,当用户需要查询某些信息时,后端服务也会先从缓存里去找,如果找不到,就会去数据库去找,在数据库里找就会比较慢。
到目前为止,我们知道了用户通过浏览器访问大王火锅店门户网站时:用户请求会先经过防火墙,然后经由负载均衡分发给web服务,web服务调用缓存或者数据库将数据返回给浏览器展示给用户。
第三章 部署大王火锅门户网站
防火墙+负载均衡+web服务+缓存+数据库,就构成了一个基本的软件架构。这些软件都安装在哪里呢?是随便放在一台电脑上?还是放到专业的服务器上?还是放在什么云服务器上?
答案是:都可以。
* 早期的时候,这些服务都部署在实体的机器里,通常是高性能的服务器。当然一个小的个人网站部署在个人电脑上也是完全没问题。
* 再后来,大家发现这样太浪费了,有些服务器性能很高,一个顶10个。就将这些服务器进行了虚拟化,把一个服务器用软件拆成了N份,每一份都相当与一个独立的服务器,这就是所谓的虚拟化部署。
* 到了现在,随着容器和微服务技术的发展,业务相关的服务会被拆分的非常小。这些微小的服务会被部署到一种叫Docker的容器中。(当然,容器本身也需要运行在实体机或虚拟机中。而且由于容器非常多,人工管理很麻烦,就需要一个叫做k8s 的技术去管理容器)这就是所谓的容器化部署。
在我们日常工作中经常听到的开发环境、测试环境、生产环境,基本上都是由Linux实体服务器、kvm虚拟机、docker容器或者k8s组成的。
为了方便起见,大王火锅店这个小网站,我们就部署在kvm虚拟机里吧,用kvm将一台高性能的linux服务器虚拟化出7个虚拟机,并分别安装1个防火墙、2个Nginx(负载均衡)、1个前端服务、1个后端服务、1个redis(缓存)、1个mysql(数据库)。ok,至此大王火锅店门户网站,正式上线!
第四章 运维大王火锅门户网站
软件部署到生产环境中后,就会对外提供服务,用户就可以通过浏览器访问了。这时候,如果软件系统或者部署环境出了问题,网站就会崩溃。
因此,就需要一套监控系统监控服务和环境的健康状态。当出现问题时,发出告警并通知运维人员,运维人员会经过一条秘密通道(vpn),再通过跳板机登陆到出现问题的服务或环境进行修复。
第五章 开发大王火锅门户网站
到目前为止,我们了解到大王火锅门户网站的部署架构是个什么样子了:由防火墙、负载均衡、web集群、缓存、和数据库组成,并部署在由kvm虚拟化出的7个linux服务器上。
其中负载均衡、缓存、数据库,这些服务都是现成的。开发团队对他们进行正确安装和配置就可以了。我们主要关注业务相关的web服务是怎么开发出来的。
这里会涉及很多编程语言,比如:java、python、js、php…… ;还会涉及很多技术点,比如:数据库、网络、并发 ... 我们不细究这些技术细节,从工程的角度看看开发阶段程序员都做了那些事情。
* step1 编写网站代码,并将代码推送到gitlab代码仓库中。(gitlab用于存放软件项目的源代码。靠谱的程序员还会顺便写上单元测试用例,确保主要的业务代码能通能通过单元测试。)
* step2使用Jenkins拉取gitlab中的代码,并将代码推送给SonarQube,SonarQube会对代码进行扫描,检测其中的错误。
* step3 通过了单元测试和代码扫描的代码,会进行编译构建生成一个制品,最后再由Jenkins将制品部署到对应的测试环境或生产环境中。
到这里,我们以大王火锅店门户网站为例,完整的介绍了一个软件项目所涉及的技术框架。
产品同学想了解技术问题,绝不是学学java、python、js 就可以了。这些仅仅是编程语言,更重要的是理解技术的框架并不断完善这个框架的细节。