2.服务器开发的演进史

操作系统和计算机体系结构分别有自己的演进史:比如 

计算机从最简单的纸片机 一步步 发展成 具有专门io的模块,专门 计算的模块cpu 还有放临时数据的模块内存;

操作系统也逐渐壮大自己的功能,壮大的结构就是分模块,分层;

一个国家or人类的演进史:猿猴,单个猿猴活不下来呗淘汰了,然后一群猿猴,部落,部落组长亲自管理资源分配-人口登记关系协调等等-事必躬亲,扩大成国家,部落组长变皇帝,皇帝管所有,国家壮大,分出来礼部户部工部等,到如今的国家,商务部,外交部,司法部,军部-额暂且这么叫吧。其实这么多部,都是部落组长一个人干的活。扯远了~

同理,开发服务器端,接收tcp连接,处理连接,自己在一个main方法,几行代码就可以完成,但是,tcp连接的需求扩大,那么,那几行处理代码也分别变成处理模块,比如,专门接收连接的,专门处理连接的,专门回写的。可能原来main的一行代码,就对应了服务器系统的一个模块。另外阔能还会有一个专门的调度模块~~

所谓服务器架构师,主要是设计系统,都是踩坑出来的经验之设计,或亲自踩坑,或参考别人踩得坑,不过大部分是,参考别人的劳动果实--设计好的系统,嗯,这种方式比较快速高效,先模仿后创造,踩着前人的肩膀。


下面看一个微型服务器架构:不管是beego还是其他架构,都是这个原理,封装,模块化,其实干活的还是这些苦逼的go包code;

比如beego目的就是把业务抽离出来,让用户专注些业务,其他的接收连接关闭连接之类的,由框架写好。

package zinx

import (
	"fmt"
	"io"
	"net"
)

//一个五脏俱全的服务器架构
func readMe(){//全部模块 对应 server模块 line:11-40 f:ipversion ip port m:start stop serve;与此同时会在入口函数添加用户写的代码包装成route 传给server-再传给conn-供回调
	listen,err := net.Listen("tcp","0.0.0.0:8999")
	if err !=nil {
		fmt.Println("[listen err]:",err)
	}
	for{
		conn,err := listen.Accept()//模块connection 16-39 f:conn isclose handle connAddr  m:start  read send
		if err!=nil{
			fmt.Println("[build conn err]:",err)
		}
		go func() {
			defer conn.Close()
			for{
				buf := make([]byte,2018)//数据处理的专门模块-request 23-32 f:conn data len m:getConn getData getLen
				cnt,err := conn.Read(buf)
				if err!=nil{
					if err!=io.EOF{
						fmt.Println("[client closed]:",err)
						conn.Close()
					}else{
						fmt.Println("[receive err]:",err)
					}
				}

                //业务部分 用户自己写  比如持久化到数据库/redis  比如从数据库再取出来一部分数据 作其他用处 等等

				_,err  = conn.Write(buf[:cnt])//response 34-37
				if err!=nil{
					fmt.Println("[send err]:",err)
				}
			}
		}()
	}
}

如果没有框架,灭有go,我们如果需要在os上开发一个web后台,我们需要手动用二进制的机器码做什么:首先要系统调用向内核申请进程fork,然后这个进程需要调用os的tcpip功能,即需要监听某个端口和网卡的网络请求,然后解析传过来的二进制流,然后再把数据根据http协议解析出来属于路由的部分,数据格式,数据请求参数的部分,属于传递的data部分,然后根据这些信息分别开发对应的处理程序,期间需要持久化的部分就持久化,(需要再调用其他模块进一步处理的就进一步处理,比如负责与数据交互的module模块,负责日志的log模块,负责读取配置的config模块,等等,)最后,把处理的结果,返回写回socket,通过tcpip协议传输出去,然后这些二进制流被客户端的tcpip协议栈接收解析,传递给客户端程序比如浏览器,客户端程序就会解析出来,并传递给显示器。


好啦,现在明白整个过程了,那么,为啥会有go 或者java,然后还有beego 或者tomcat servlet这些东东呢,如果你用go+beego做过web开发,就肯定知道,你自己并没有手动像os申请进程调用吧-go做的,你也没有手动去管理连接,接收连接吧=-beego做的,你想开发一个web后台,基本上,你只需要傻瓜似低使用beego就可以。go只是beego对os的翻译机。

而golang,为我们做了什么,golang我觉得就是计算机内核和程序员的一个中介,当我们go run一个main.main的时候,先编译,编译的时候就加上了go做的系统调用那块代码合到你的代码里,编译好的二进制代码就开始进行系统调用申请空间和进程调用把我们的代码和go的原生代码变成内核的一个进程,load到内存里面,得到cpu的使用权(tip:进程是对cpu的抽象,其他内核模块,都为进程模块所用,都是辅佐大臣)。当然go还给我们提供了一些其他系统调用,除了进程调用没开放给我们,嘻嘻,为啥a ,自己想。想理解透整个开发,继续靠计算机赏饭吃,那就最好把os吃透,然后最好精通一下c语言,因为c语言是所有高级语言之母,重要的是,内核也是c开发的。也就是说我们勇go开发程序,全权通过go,那么,go就成为os的一个代理,我们所有需要计算机帮忙干的活都通过go实现。


计算机所做的工作;

计算机所做的工作,微观看就两个,cpu和io,就这两类指令集。

宏观看,按照作用,分为转换信息,转移信息,存储信息。

我认为所有计算机能干的活都可归到这三类上面,tcpip协议栈干的活,就是纯转移信息的活,而我们程序员,就是干的转换的活,持久化的活,目前我没接触到,我只是干了转换的活,转换好了之后,进行系统调用接口掉io存储,嗯,虽然转移信息也是io操作,我姑且把这一大块组织分到转移信息类吧,与普通信息存储的活的区别只是,io到网卡,还是io到磁盘,还有就是走的io协议不同,一个是走tcp ip,一个是走scsi之类?这样分类是否合适,不知,反正我就这么姑且理解吧,后续造诣提高再修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值