获得徽章 0
- #青训营 x 字节后端训练营#
虚拟机三种网络模式的区别及特点
桥接网络(Bridged Networking)
桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。
NAT(地址转换模式)
如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择。在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。
Host-Only(仅主机模式)
Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。展开评论2 - #青训营 x 字节后端训练营#
Http协议(Hyper Text Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
Http协议是基于客户端(Cilent)/服务器(Server)模式,且面向连接的。简单的来说就是客户端(Cilent)向服务器(Server)发送http请求(Request),服务器(Server)接收到http服务请求(Request)后会在http响应(Response)中回送所请求的数据。
Go的标准库 net/http 则提供了对http协议支持的封装,提供了强大而又灵活的功能实现。
HTTP Request 结构
Http Requset指的是客户端发送给服务器的一个请求,或者是服务器收到的一个请求。
在命令行下查看HTTP协议,可以使用 curl 或 http命令发起HTTP请求;而在浏览器端下也可以使用开发者工具查看。
HTTP Response结构
HTTP Response(HTTP响应)是在客户端(Client)向服务器(Server)发送HTTP请求(Request)之后,服务器返回给客户端的数据。
同样可以使用 curl 或 http命令发起HTTP请求或者在浏览器端下也可以使用开发者工具查看。
Client
Client这里顾名思义就是HTTP客户端,用于发送HTTP请求( Request) 并获得响应Respone
Server
基于 HTTP 构建的网络应用包括两个端,即客户端 ( Client ) 和服务端 ( Server )。
两个端的交互行为包括从客户端发出 request、服务端接受 request 进行处理并返回 response 以及客户端处理 response。所以 http 服务器的工作就在于如何接受来自客户端的 request,并向客户端返回 response。展开评论1 - #青训营 x 字节后端训练营#
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。展开评论1 - #青训营 x 字节后端训练营#
Go语言作为一门著名的编程语言,因其简单易学、高效快速的特点,被越来越多的开发者所青睐。然而,即便是这样的优秀语言,在实际使用中还是会遇到性能瓶颈,甚至可能导致系统崩溃。以下几个方面介绍Go语言的性能优化指南,帮助在实践中更好地发挥Go语言的优势。
1.使用Go语言提供的工具进行性能分析
Go语言自带的pprof工具可以帮助开发者进行性能分析,在程序运行时对CPU占用率、内存使用情况等进行监控,从而找出潜在的性能问题。同时,Go语言还提供了一些第三方的工具,如:火焰图(Flame Graphs)、可视化分析工具(viz等),都可以帮助开发者更好地理解程序的执行流程和性能瓶颈所在。
2.避免过度内存分配
Go语言的垃圾回收机制非常强大,但过量的内存分配仍会影响程序性能。因此,应尽量避免不必要的内存分配。比如,可以通过池化技术(如sync.Pool)来重用对象,从而避免频繁的内存分配和垃圾回收。
3.并发编程原则
Go语言天生支持并发编程,但在使用中需要注意一些原则。首先,尽可能地减少锁的使用。锁会导致程序的串行化,影响程序整体性能。其次,应当使用无锁的并发编程方式,如使用通道(channel)替代共享变量等。
4.函数调用优化
函数调用是Go语言的基本操作之一,但调用过多的函数会影响程序性能。因此,在设计程序时应该尽量减少函数调用的层数。同时,可以将耗时的函数进行缓存或内联,从而提高程序的执行效率。
5.针对不同平台进行优化
Go语言的代码可以跨平台运行,但不同平台的性能表现存在差异。因此,在程序开发时需要针对不同平台进行优化,以充分发挥每个平台的优势。比如,在Linux平台上使用epoll来实现高效的IO事件通知机制,在Windows平台上使用I/O Completion Ports等。
总之,Go语言作为一门高效快速的编程语言,其性能优化问题既有技术性的难度,也离不开经验的积累。以上几点是本文笔者总结的一些指南,仅供参考。在实际应用中,还需要根据具体情况进行细致的分析和调优,才能真正发挥Go语言的性能优势。展开评论1 - #青训营 x 字节后端训练营#
排序算法种类繁多。根据处理的数据规模与存储特点,可分为内部排序和外部排序:前者处理的数据规模不大,内存足以容纳;后者处理的数据规模较大,必须将数据存放于外部存储器中,每次排序的时候需要访问外存。根据输入的不同形式,分为脱机算法和在线算法:前者待排序的数据是以批处理的形式给出的;而在云计算之类的环境中,待排序的数据是实时生成的,在排序算法开始运行时,数据并未完全就绪,而是随着排序算法本身的进行而逐步给出的。另外,针对不同的体系结构,又分为串行和并行两大类排序算法。根据算法是否采用随机策略,还有确定式和随机式之分。仅仅用执行效率和内存消耗来衡量排序算法的好坏是不够的。针对排序算法,我们还有一个重要的度量指标,稳定性。这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。展开评论1 - #青训营 x 字节后端训练营#
GORM是一种流行的Go语言ORM(对象关系映射)库,全称为"Go Object Relational Mapping"。GORM可以将Go语言的结构体和数据库的表进行映射,从而简化了数据库操作的流程,提高了开发效率。
GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite、SQL Server等。它提供了丰富的API,可以方便地进行数据库的增删改查操作,同时支持事务处理、预加载、关联查询等高级功能。
除了基本的ORM功能,GORM还提供了一些高级特性,例如自动迁移、软删除、钩子函数等。自动迁移可以根据Go语言结构体自动创建数据库表和字段,软删除可以在删除数据时将数据标记为已删除而不是真正删除,钩子函数可以在操作数据库前后进行一些自定义的处理。
总之,GORM是一种功能强大、易于使用的ORM库,可以大大简化Go语言开发者的数据库操作。展开评论1 - #青训营 x 字节后端训练营#
RPC算是近些年比较火热的概念了,随着微服务架构的兴起,RPC的应用越来越广泛。本文介绍了RPC和gRPC的相关概念,并且通过详细的代码示例介绍了gRPC的基本使用。
gRPC是什么
gRPC是一种现代化开源的高性能RPC框架,能够运行于任意环境之中。最初由谷歌进行开发。它使用HTTP/2作为传输协议。
在gRPC里,客户端可以像调用本地方法一样直接调用其他机器上的服务端应用程序的方法,帮助你更容易创建分布式应用程序和服务。与许多RPC系统一样,gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法。在服务端程序中实现这个接口并且运行gRPC服务处理客户端调用。在客户端,有一个stub提供和服务端相同的方法。
为什么要用gRPC
使用gRPC, 我们可以一次性的在一个.proto文件中定义服务并使用任何支持它的语言去实现客户端和服务端,反过来,它们可以应用在各种场景中,从Google的服务器到你自己的平板电脑—— gRPC帮你解决了不同语言及环境间通信的复杂性。使用protocol buffers还能获得其他好处,包括高效的序列化,简单的IDL以及容易进行接口更新。总之一句话,使用gRPC能让我们更容易编写跨语言的分布式代码。
IDL(Interface description language)是指接口描述语言,是用来描述软件组件接口的一种计算机语言,是跨平台开发的基础。IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用C++写成,另一个组件用Go写成。展开评论1 - #青训营 x 字节后端训练营#
Git是什么
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
官网地址为:git-scm.com
Git特点
优点:
适合分布式开发,强调个体;
公共服务器压力和数据量都不会太大;
速度快、灵活;
任意两个开发者之间可以很容易的解决冲突;
离线工作。
缺点:
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息;
权限控制不友好;如果需要对开发者限制各种权限的建议使用SVN。
Git与SVN的区别
SVN是集中式版本控制系统,而Git是分布式版本控制系统,Git与SVN的区别可参考Git与SVN的区别
Git工作流程
一般工作流程如下:
从远程仓库中克隆 Git 资源作为本地仓库;
从本地仓库中checkout代码然后进行代码修改;
在提交本地仓库前先将代码提交到暂存区;
提交修改,提交到本地仓库;本地仓库中保存修改的各个历史版本;
在需要和团队成员共享代码时,可以将修改代码push到远程仓库。展开评论1 - #青训营 x 字节后端训练营#
MySQL预处理
什么是预处理?
普通SQL语句执行过程:
客户端对SQL语句进行占位符替换得到完整的SQL语句。
客户端发送完整SQL语句到MySQL服务端
MySQL服务端执行完整的SQL语句并将结果返回给客户端。
预处理执行过程:
把SQL语句分成两部分,命令部分与数据部分。
先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。
然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。
MySQL服务端执行完整的SQL语句并将结果返回给客户端。
为什么要预处理?
优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本。
避免SQL注入问题。展开评论1 - #青训营 x 字节后端训练营#
Go语言标准库之net/http
net/http包提供了HTTP客户端和服务端的实现
Get、Head、Post和PostForm函数发出HTTP/HTTPS请求
Handle和HandleFunc函数可以向DefaultServeMux添加处理器
Go语言标准库之context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。
Go1.7加入了一个新的标准库context,它定义了Context类型,专门用来简化 对于处理单个请求的多个 goroutine 之间与请求域的数据、取消信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。
对服务器传入的请求应该创建上下文,而对服务器的传出调用应该接受上下文。它们之间的函数调用链必须传递上下文,或者可以使用WithCancel、WithDeadline、WithTimeout或WithValue创建的派生上下文。当一个上下文被取消时,它派生的所有上下文也被取消。
With系列函数WithCancel,WithDeadline,WithTimeout,WithValue
使用Context的注意事项:
推荐以参数的方式显示传递Context
以Context作为参数的函数方法,应该把Context作为第一个参数。
给一个函数方法传递Context的时候,不要传递nil,如果不知道传递什么,就使用context.TODO()
Context的Value相关方法应该传递请求域的必要数据,不应该用于传递可选参数
Context是线程安全的,可以放心的在多个goroutine中传递展开评论1