编辑
2023-08-09
操作系统
0

简介

Docker 是一个开源的应用容器引擎,使用go语言实现,它诞生于2013年,最早是dotCloud公司内部的一个项目,后来加入了Linux基金会,并采用Apache 2.0协议进行管理,代码托管在GitHub上。 Docker提供了一种轻量级操作系统虚拟化解决方案。它基于Linux容器(LXC)技术,在LXC之上,Docker进行了进一步的封装,让用户无需处理容器管理,使得操作变得更加简单。 它允许开发者将他们的应用程序和依赖包打包到一个可移植的镜像中,应用程序运行在容器中,每个容器都有自己独立的沙箱环境,相互之间没有任何接口。这意味着容器之间的应用程序不会相互干扰,提供了更高的安全性和隔离性。

目标

Docker 是容器技术的一种体现,而容器技术的根本是为了抹平软件运行的环境差异。

Docker通过build命令将应用程序和其依赖构建成镜像文件,镜像是只读的,这意味着构建完成后,镜像不会再发生任何变化。如此,基于该镜像启动的容器环境必然一致。同理,跑在这个容器中的应用程序所处环境也一致。

通过这种容器化技术,开发者可以更加方便地部署和管理应用程序,提高开发效率和应用的可移植性。容器是完全使用沙箱机制,相互之间不会有任何接口。

编辑
2023-06-27
服务端
0

限流算法

限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理延迟或者被拒,从而影响用户体验,因此也属于一种降级。限流的使用场景包括限制上游访问或者下游调用。常见的限流算法有下面几种。

编辑
2023-06-17
服务端
0

背景

前面提到随着用户请求并发量的上升,系统复杂度随之提高,单体应用无论从开发效率还是运维管理都已经无法适应时代的发展,于是微服务和分布式系统越来越流行,每个服务都关注自己的业务领域,并通过远程调用的形式互相通信,形成了清晰却又复杂的调用拓扑关系网。服务拆分后的好处不言而喻,但也带来了一些痛点问题。比如,服务发现,服务稳定性,定向的流量调度和负载均衡等等。解决上述问题有几种方式,比如,通过服务框架集成,虽然能做到部分屏蔽功能细节,但缺点是框架逻辑过重,每种框架和语言需要各自实现一套,兼容性差且不够灵活,开发者必不可少得需要学习和使用框架提供的API。所以,我们通常会通过下面介绍的几种方式实现。

编辑
2023-05-26
服务端
0

在各种流传甚广的C语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:

int * func(void) { int num = 1234; /* ... */ return # }

当函数返回后,函数的栈帧(stack frame)即被销毁,引用了被销毁位置的内存轻则数据错乱,重则 segmentation fault。

经过了八十一难,终于成为了 C 语言绝世高手,还是逃不过复杂的堆上对象引用关系导致的 dangling pointer:

image.png

当 B 被 free 掉之后,应用程序依然可能会使用指向 B 的指针,这是比较典型的 dangling pointer 问题,堆上的对象依赖关系可能会非常复杂。我们要正确地写出 free 逻辑还得先把对象图给画出来。

依赖人去处理这些问题是不科学,不合理的。C 和 C++ 程序员已经被折磨了数十年,不应该再重蹈覆辙了。

编辑
2023-04-22
前端
0

异步错误的获取

JS常见错误

当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误,常见的错误类型有

  • SyntaxError。 SyntaxError是解析代码时发生的语法错误
var 1a; //变量名错误 console.log 'hello'); // 缺少括号
  • ReferenceError ReferenceError是引用一个不存在的变量时发生的错误。 比如在函数中调用一个变量,但是这个变量不存在的时候
  • TypeError TypeError是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。
var obj = {}; obj.handle() //obj.handle is not a function

还有一些这里就不一一介绍了。