先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
Web 文档根据文档内信息改变的时间可分为三类。静态文档的信息只有当作者修改时才会改变,动态文档的信息在服务器端收到文档申请时改变,活动文档显示的信息在文档下载到浏览器一端运行后改变。由于创建动态文档的责任在管理文档的服务器一端,支持动态文档也只需修改服务器。实际上,变化意味着扩展,管理动态文档的服务器也包含了处理静态文档的代码。处理动态文档的Web服务器需要三个特性。
首先,服务器程序必须扩展,当每次请求到达时,能够执行一个单独的创建文档的应用程序。服务器必须编成能够捕获应用程序的输出,并且将该文档返回给浏览器。
其次,必须为每个动态文档写一个单独的应用程序。
最后,服务器必须配置成能够知道哪一个URL 对应于动态文档和哪一个URL 对应于静态文档。对每个动态文档,配置时必须说明产生文档的应用程序。每个申请包含着一个对应动态或静态文档的URL,服务器使用配置信息和收到的请求中的URL决定如何处理。如果配置信息说明申请中的URL对应着一个静态文档,服务器就跟往常一样取出文件。如果申请中的URL对应着动态文档,服务器选择生成该文档的应用程序,运行程序,并且把程序的输出作为文档返回给浏览器。
区别
应用服务器和WEB服务器的区别
通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)。
下面让我们来细细道来:
Web型
Web服务器(Web Server)可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应 (response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片, 进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们(译者 注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。
企业WEB服务器是面向企业网络用户的信息交流平台,WEB在企业生产管理过程中的应用越来越多,是信息化应用的入口,一些应用系统都集成在WEB服务器上。要知道,Web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求 (request)的程序(译者注:服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响 应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing),数据库连接(database connectivity)和消息(messaging)等功能。
虽然Web 服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability),例如负载平衡(load balancing),缓冲(caching)。集群特征(clustering-features)经常被误认为仅仅是应用程序服务器专有的特征。
应用程序型
应用程序服务器(The Application Server)
根据定义,作为应用程序服务器,它通过各种协议,可以包括HTTP,把商业逻辑暴露给(expose)客户端应用程序。Web服务器主要是处理向 浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就像你调用对象的一个方法(或过程 语言中的一个函数)一样。
应用程序服务器的客户端(包含有图形用户界面(GUI)的)可能会运行在一台PC、一个Web服务器或者甚至 是其它的应用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻 辑(program logic)。 正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态HTML,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。
在大多数情形下,应用程序服务器是通过组件(component)的应用程序接口(API)把商业逻辑暴露(expose)(给客户端应用程序)的,例 如基于J2EE(Java 2 Platform, Enterprise Edition)应用程序服务器的EJB(Enterprise JavaBean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括安全(security),事务处理(transaction processing),资源池(resource pooling), 和消息(messaging)。就象Web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。
严格意义上Web服务器只负责处理HTTP协议,只能发送静态页面的内容。而JSP,ASP,PHP等动态内容需要通过CGI、FastCGI、ISAPI等接口交给其他程序去处理。这个其他程序就是应用服务器。
比如Web服务器包括Nginx,Apache,IIS等。而应用服务器包括WebLogic,JBoss等。应用服务器一般也支持HTTP协议,因此界限没这么清晰。但是应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化,所以很少有见Tomcat直接暴露给外面,而是和Nginx、Apache等配合,只让Tomcat处理JSP和Servlet部分。
3.文件服务器
文件服务器(File server),又称档案伺服器,是指在计算机网络环境中,所有用户都可访问的文件存储设备,是一种专供其他电脑检索文件和存储的特殊电脑。 文件服务器通常比一般的个人电脑拥有更大的存储容量,并具有一些其他的功能,如磁盘镜像、多个网络接口卡、热备援多电源供应器。文件服务器已进化成带有RAID存储子系统和其他高可用特性的高性能系统。文件服务器增强了存储器的功能,简化了网络数据的管理。一方面改善了系统的性能,提高了数据的可用性,另一方面减少了管理的复杂程度,降低了运营费用。
简介
在客机与服务器模式下,文件服务器(file server)是一台对中央存储和数据文件管理负责的计算机,这样在同一网络中的其他计算机就可以访问这些文件。文件服务器允许用户在网络上共享信息,而不用通过软磁盘或一些其它外部存储设备来物理地移动文件。任何计算机都能被设置为主机,并作为文件服务器(file server)运行。最简单的形式是,文件服务器可以是一台普通的个人计算机,它处理文件要求并在网络中发送它们。在更复杂的网络中,文件服务器也可以是一台专门的网络附加存储(NAS)设备,它也可以作为其他计算机的远程硬盘驱动器来运行,并允许网络中的人像在他们自己的硬盘中一样在服务器中存储文件。文件服务器具有分时系统文件管理的全部功能,提供网络用户访问文件、目录的并发控制和安全保密措施的局域网(LAN)服务器。因此,文件服务器应具备完善的文件管理功能,能够对全网实行统一的文件管理,各工作站用户可以不参与文件管理工作。文件服务器能为网络用户提供完善的数据、文件和目录服务。 [3]
NAS(网络附加存储)和SAN(存储区域网络)是文件服务器行业主流的两种集中存储的技术。两种技术均将存储与使用存储的系统分离,利用网络实现连通及共享,从而达到存储设备统一使用、统一管理,具有良好的可扩充性。通过合理的、动态的空间划分达到空间的最合理使用,减少扩容的盲目性和降低不必要的扩容成本。通过设备共享和统一管理,减少存储设备的维护和升级的复杂度,降低运行成本,提高维护效率。 [1]
功能
文件服务器在网络上提供一个中心位置,可供用户存储文件并通过网络与其他用户共享文件。文件服务器负责共享资源的管理、传递和接收,管理存储设备(硬盘、光盘、磁带)中的文件,为网络用户提供文件共享服务,也称文件共享服务器。 [4]
文件服务器具有分时系统管理的全部功能,能够对全网统一管理,能够提供网络用户访问文件、目录的并发控制和安全保密措施。
文件服务器是一台特殊功能的计算机,其主要目的是向客户机提供文件服务。文件服务器可以是一台能够运行其他应用的通用计算机,也可以是一台专门提供文件服务的专用计算机。
分类
按照是否采用了分布式技术,文件服务器可以分成集中式文件服务器和分布式文件服务器两大类。事实上,集中式与分布式文件服务器并没有明确的界限,可以说只是技术进步而导致的更新换代。如果只在存储环境中部署了单一的具有分布式功能的文件服务器,那么它还是一台集中式的文件服务器。 [1]
集中式文件服务器
NAS(网络附加存储)和SAN(存储区域网络)是文件服务器行业主流的两种集中存储的技术。
(1)SAN
SAN—存储区域网络,即通过特定的互连方式连接的若干台存储服务器组成一个单独的数据网络,提供企业级的数据存储服务。SAN是一种特殊的高速网络,连接网络服务器和诸如大磁盘阵列或备份磁带库的存储设备,SAN置于LAN之下,而不涉及LAN。利用SAN,不仅可以提供大容量的存储数据,而且地域上可以分散,并缓解了大量数据传输对于局域网的影响。SAN的结构允许任何服务器连接到任何存储阵列,不管数据置放在哪里,服务器都可直接存取所需的数据。
(2)NAS
NAS—网络附加存储,即将存储设备连接到现有的网络上,提供数据和文件服务。NAS以网络为中心,支持开放的标准协议,提供跨平台的文件和数据共享服务;部署简单快捷,具有多方位的高扩展性和独立优化的存储操作系统;采用集中的存储模式;可在线扩容和增加设备;支持多种协议的管理软件、日志文件系统、快照和镜像等功能;即插即用。NAS技术主要应用于以文件应用为主的、升级灵活性强和数据在线性高(与SAN在线性高的特点不同的是,可在线扩充系统结构)的企业,代表企业包括ISP、 ICP、 IDC、石油、出版、教育行业和办公环境等。
分布式文件服务器
从SAN和NAS扩展出来的分布式文件服务器。
由于SAN系统本身具有极高的扩展能力,开发商比较容易就能实现SAN网络中的服务器集群。如IBM的S/390 Paralle Sysplex已经提供了跨多个服务器联合体的成员进行无缝负载均衡的服务和操作系统工具。联想也有支持多服务器的SAN解决方案,比较典型的是SureFibre400系列。
利用联想的SureFibre400搭建的分布式文件服务器系统。该方案使用了两个Brocade3200交换机,每台服务器通过两块光纤通道适配卡(HBA),两条光纤线路分别接入到两台交换机上,提供线路冗余;光纤阵列提供两个主机接口,它们分别接入到两台交换机上,以提供线路冗余和提高性能。
由于NAS对硬件没有特殊依赖,而主要是依靠软件进行协调的网络存储系统,只要提供支持集群服务的操作系统及相关软件,NAS服务器也能很容易做到分布式布局。NetworkAppliance的NetApp Filer系列就包括用于集群、数据损坏的即时恢复、远程镜像和灾难恢复的软件产品。
应用NetApp Filer作为存储设备的简单服务器系统。连接到以太网中的两台Filer通过Network Appliance的Data ONTAPTM操作系统组建虚拟文件系统,并可通过增值软件工具Snapshot和SnapRestore提供即时恢复机制。使用Data ONTAP,操作系统甚至可以实现SAN和NAS服务器的整合,将UNIX, Windows, SAN,和WEB数据集中到中央站点。
4.数据库服务器
数据库服务器由运行在局域网中的一台/多台计算机和数据库管理系统软件共同构成,数据库服务器为客户应用程序提供数据服务。
1.数据库服务器是什么
数据库服务器其实就是装有一台数据库的Server,应用于Internet或Intranet。一个数据库服务器是指运行在局域网中的一台或多台服务器计算机上的数据库管理系统软件,数据库服务器为客户应用提供服务,这些服务是查询、更新、事务管理、索引、高速缓存、查询优化、安全及多用户存取控制等。数据库软件有很多种大型的数据库软件有Oracle,DB2,Sybase等,中型的有SQL Server,还有通常用于个人网站的MySQL等小型数据库软件。
企业业务对数据库服务器的要求
(1)数据库服务器要具有极强的承载能力。当企业内部需要查询一些信息时,其后台处理系统(数据库服务器)就要开始查询,并将查找到的信息反馈给用户。当大量的用户在查询信息时,如果数据库服务器不具备极强的承载能力,是无法满足其需求的。
(2)数据库服务器要具有很强的实时应答能力。当数据信息被检索到后,会反馈给用户,如果数据库服务器不具有很强的应答能力,会造成反馈信息速度非常缓慢,甚至造成数据库服务器死机的情况。
(3)数据库服务器要具有很强的扩展能力。数据库中的信息随时都会发生变化,如今是信息时代,大量数据需要录入、处理等,因此,数据库服务器的扩展能力不容忽视。
(4)数据库服务器的可用性和可靠性。数据库服务器要具备365天7*24不间断运行的能力,这样才能满足需要。当然,一台服务器要真正保持这样的运行,也不太现实。因此许多企业的数据库服务器并不只有一台,通常具有多台,并且还配备了备份服务器等。
大型企业需要的数据库服务器性能和扩展能力等方面要求更高,它们在组建数据库系统时,不仅仅是使用多台数据库服务器,还需要存储系统等。而中小企业则有些不同,它们需要的数据库服务器性能不需要像大型企业数据库服务器那么强,数量要求也没那么多,因此在选择服务器时更轻松一些。
2.数据库服务器特点
1. 编程量减少
数据库服务器提供了用于数据操纵的标准接口API(Application Programming Interface,应用程序编程接 口)。
2. 数据库安全高
数据库服务器提供监控性能、并发控制等工具。由DBA(Database Administrator,数据库管理员)统一负 责授权访问数据库及网络管理。
3. 数据可靠性管理
数据库服务器提供统一的数据库备份/恢复、启动/停止数据库的管理工具。
4. 计算机资源利用充分
数据库服务器把数据管理及处理工作从客户机上分离出来,使网络中各计算机资源能灵活分配、各尽其用。
5. 系统性能提高
能大大降低网络开销。
协调操作,减少资源竞争,避免死锁。
提供联机查询优化机制。
6. 易扩展
支持多处理器(相同类型)的水平扩展。
支持多个服务器的水平扩展。
支持垂直扩展,服务器可以移植到功能更强的计算机上,不涉及处理数据的重新分布问题。
3.数据库服务器应用
应用:
数据库服务器其实是应用服务器中的一种,而应用服务器又分很多类,包括邮件服务器,文件服务器,DNS服务器,他们实现的是一种作用,这种作用主要是再硬件服务器设备上集成软件实现,数据库服务器的作用主要是完成数据的处理、缓存、转换等作用,当然,服务器的选择是需要考虑性能参数的。
三、C语言在Linux上实现一个简易Web服务器
可以参考这篇博客:【网络编程学习记录1】Linux下的socket演示程序
服务器端代码 server.cpp:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(){
//创建套接字
int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//将套接字和IP、端口绑定
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//进入监听状态,等待用户发起请求
listen(serv_sock, 20);
//接收客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
//向客户端发送数据
char str[] = “http://c.biancheng.net/socket/”;
write(clnt_sock, str, sizeof(str));
//关闭套接字
close(clnt_sock);
close(serv_sock);
return 0;
}
客户端代码 client.cpp:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(){
//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//读取服务器传回的数据
char buffer[40];
read(sock, buffer, sizeof(buffer)-1);
printf(“Message form server: %s\n”, buffer);
//关闭套接字
close(sock);
return 0;
}
启动一个终端(Shell),先编译 server.cpp 并运行:
[admin@localhost ~]$ g++ server.cpp -o server
[admin@localhost ~]$ ./server
#等待请求的到来
正常情况下,程序运行到 accept() 函数就会被阻塞,等待客户端发起请求。
接下再启动一个终端,编译 client.cpp 并运行:
[admin@localhost ~]$ g++ client.cpp -o client
[admin@localhost ~]$ ./client
Message form server: http://c.biancheng.net/socket/
client 接收到从 server发送过来的字符串就运行结束了,同时,server 完成发送字符串的任务也运行结束了。大家可以通过两个打开的终端来观察。
注意这里一定要打开两个终端来进行,因为,执行./server后所在终端就会被占用,无法继续输入命令了,因此执行 ./client需要在另一个终端。结果如下图
client 运行后,通过 connect() 函数向 server 发起请求,处于监听状态的 server 被激活,执行 accept() 函数,接受客户端的请求,然后执行 write() 函数向 client 传回数据。client 接收到传回的数据后,connect() 就运行结束了,然后使用 read() 将数据读取出来。
server 只接受一次 client 请求,当 server 向 client 传回数据后,程序就运行结束了。如果想再次接收到服务器的数据,必须再次运行 server,所以这是一个非常简陋的 socket 程序,不能够一直接受客户端的请求。
源码解析
先说一下 server.cpp 中的代码。
第 11 行通过 socket() 函数创建了一个套接字,参数 AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用面向连接的套接字,IPPROTO_TCP 表示使用 TCP 协议。在 Linux 中,socket 也是一种文件,有文件描述符,可以使用 write() / read() 函数进行 I/O 操作,这一点已在《socket是什么》中进行了讲解。
第 19 行通过 bind() 函数将套接字 serv_sock 与特定的 IP 地址和端口绑定,IP 地址和端口都保存在 sockaddr_in 结构体中。
socket() 函数确定了套接字的各种属性,bind() 函数让套接字与特定的IP地址和端口对应起来,这样客户端才能连接到该套接字。
第 22 行让套接字处于被动监听状态。所谓被动监听,是指套接字一直处于“睡眠”中,直到客户端发起请求才会被“唤醒”。
第 27 行的 accept() 函数用来接收客户端的请求。程序一旦执行到 accept() 就会被阻塞(暂停运行),直到客户端发起请求。
第 31 行的 write() 函数用来向套接字文件中写入数据,也就是向客户端发送数据。
和普通文件一样,socket 在使用完毕后也要用 close() 关闭。
再说一下 client.cpp 中的代码。client.cpp 中的代码和 server.cpp 中有一些区别。
第 19 行代码通过 connect() 向服务器发起请求,服务器的IP地址和端口号保存在 sockaddr_in 结构体中。直到服务器传回数据后,connect() 才运行结束。
第 23 行代码通过 read() 从套接字文件中读取数据。
四、熟悉在Linux上进行开发
参考这篇博客:Vscode远程连接linux服务器(阿里云服务器)
配置一下阿里服务器的信息
更改设置,输入密码
点击登入
输入密码之后,就可以连接上服务器
打开文件夹到相应目录就可以进行开发了,文件也会实时同步到服务器上
现在我们在Linux服务器上对上面的简易服务器代码进行重现。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
44f09d26ed6efa5c524b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP54aKY29kZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-hZwSaG3q-1713173920588)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!