RPC 原理详解 RPC(Remote Procedure Call),即远程过程调用,它允许像调用本地服务一样调用远程服务。是一种服务器-客户端(Client/Server)模式。远程:指的是需要经过网络的,而不是应用内部、机器内部进行的。过程:也就是方法。可以跨过一段网络,调用另外一个网络节点上的方法。以上就是对远程过程调用的简单理解。同步调用:客户方等待调用执行完成并返回结果。异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
MySQL逻辑架构 首先我们需要了解在 InnoDB 存储引擎中,缓冲池都包括了哪些。在 InnoDB 存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存的大部分,它用来存储各种数据的缓存,如下图所示:从图中,你能看到 InnoDB 缓冲池包括了数据页、索引页、插入缓冲、锁信息、自适应 Hash 和数据字典信息等。缓存池的重要性:缓存原则:位置 * 频次”这个原则,可以帮我们对 I/O 访问效率进行优化。首先,位置决定效率,提供缓冲池就是为了在内存中可以直接访问数据。其次,频次决定优先级顺序。
MySQL存储引擎 MySQL从3.23.34a开始就包含InnoDB存储引擎。大于等于5.5之后,默认采用InnoDB引擎。InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。表名.frm:存储表结构(在MySQL8.0时,合并到表名.ibd中)表名.ibd:存储数据和索引InnoDB是 为处理巨大数据量的最大性能设计。
在Gin框架中加入Zap日志中间件 在使用gin.Default()的同时是用到了gin框架内的两个默认中间件Logger()和Recovery()。所以我们可以模仿Logger()和Recovery()的实现,使用我们的日志库来接收gin框架默认输出的日志。这样就能在gin框架中使用我们上面定义好的两个中间件来代替gin框架默认的Logger()和Recovery()了。这样只需要在main.go文件中导入Logger()函数,那么就实现了Gin框架中使用Zap日志了。
日志管理工具Zap笔记 以上就是Zap库的基本使用。Zap提供了两种类型的日志记录器:Sugared Logger和Logger。对于性能要求不是非常高的应用可以使用Sugared Logger。相比于Logger,Sugared Logger提供了printf风格的日志记录。对于性能要求非常高的应用需要使用Logger来保证性能。不管是Logger还是Sugared Logger,它们都有三个预制化的日志:zap.NewProduction()、zap.NewDevelopment()和zap.Example()。
validator库的使用详解 在做API开发时,需要对请求参数的校验,防止用户的恶意请求。例如日期格式,用户年龄,性别等必须是正常的值,不能随意设置。以前会使用大量的if判断参数的值是否符合规范,现在可以使用validator库来进行参数校验。我们只需要在结构体的Tag中添加validator标签就可以实现参数校验。同时Gin框架当前内部也集成了validator.v10这个库,在Gin框架中只要在结构体的Tag中添加binding标签就可以实现参数校验。
Swagger-go学习笔记 在前后端分离的项目开发过程中,如果后端开发人员能够提供一份清晰明了的接口文档,那么就能极大地提高前后端开发人员的沟通效率和开发效率。可是编写接口文档历来都是令人头痛的,而且后续接口文档的维护也十分耗费精力。最好是有一种方案能够既满足我们输出文档的需要又能随代码的变更自动更新,而Swagger正是那种能帮我们解决接口文档问题的工具。
Docker Compose 对于现代应用来说,大多都是通过很多的微服务互相协同组成的一个完整应用。例如,订单管理、用户管理、品类管理、缓存服务、数据库服务等,它们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compose 就是解决这类问题的。Docker Compose 是一个需要在 Docker 主机上进行安装的 Docker 容器编排外部工具。
go-redis 框架基本使用 使用事务后,Redis会按照命令的顺序执行这些命令,并且在执行过程中不会立即返回结果,只有在所有命令都执行完毕后,才会一次性返回所有命令的执行结果。使用流水线就是将多个执行的命令放入 pipeline 中,然后使用1次读写操作就像执行单个命令一样执行它们,就相当于把多个命令打包,然后一起发送给redis服务器,让redis服务器一次性执行完毕。我们需要一个函数,可以安全地减少用户的积分。这段代码的目的是监视用户的当前积分,如果在事务执行过程中,其他客户端改变了这个键的值(也就是用户的积分),那么。
docker 安装 redis 在/root 中 mkdir 一个名称为 cluster 的目录,并将前面的配置文件/root/redisSave/redis.conf复制到这里。此时,再查看另外两个 redis 容器的状态数据,发现 redis-slave1 成为了 redis-slave2 的 slave,即 redis-slave2 成为了新的 master。对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为挂载点目录/etc/redis 中的 redis.conf。
docker 网络(单机环境) 先来看看那种比较正式的定义。Namespace是将内核的全局资源做封装,使得每个Namespace都有一份独立的资源,因此不同的进程在各自的Namespace内对同一种资源的使用不会互相干扰。这样的解释可能不清楚。举个例子:在Linux系统上,你想要改变系统的主机名,这个主机名就是一个内核的全局资源。但是内核通过实现UTS Namespace,可以将不同的进程分隔在不同的UTS Namespace中,在某个Namespace修改主机名时,另一个Namespace的主机名还是保持不变。
docker 数据持久化 数据卷是宿主机中的一个特殊的文件/目录,这个文件/目录与容器中的另一个文件/目录进行了直接关联,在任何一端对文件/目录的写操作,在另一端都会同时发生相应变化。在宿主中的这个文件/目录就称为数据卷,而容器中的这个关联文件/目录则称为该数据卷在该容器中的挂载点。数据卷的设计目的就是为了实现数据持久化,其完全独立于容器的生命周期,属于宿主机文件系统,但不属于 UnionFS。因此,容器被删除时,不会删除其挂载的数据卷。
Dockerfile详解 然后使用docker history test:1.0和docker history test:2.0这两条命令查看它们每层的镜像ID,会发现test1.0和test:2.0的前五个镜像层的ID一模一样,这也说明了test:2.0的镜像在构建过程中复用了test:1.0的镜像层。Dockerfile 文件内容没有变化,但 RUN 命令的外部依赖发生了变化,例如本例中要安装的 vim 软件源发生了变更(版本变化、下载地址变化等),那么从发生变化的这个指令层开始的所有镜像层 cache 全部失效。
CMD 命令和 ENTRYPOINT 命令的区别 Dockerfile的命令命令是否可以被覆盖是否可以添加选项CMD cal可以被覆盖不能添加选项,添加选项后会报错可以被覆盖不能添加选项,添加选项后会报错不可以被覆盖,添加的命令会被忽略不能添加选项,添加的选项被忽略不可以被覆盖,添加命令后会报错可以添加选项不可以被覆盖,添加的命令会被忽略不能添加选项,添加的选项被忽略在总结之前先来看看docker run命令的语法:可以看到:IMAGE的后面是可以接命令和参数的,但命令和参数并不是必须的,所以用 [ ] 括起来了。
docker容器详解 Docker容器运行的本质是运行一个进程,该进程在其自己的隔离环境中运行,该环境由Linux内核的特性(如cgroups和namespaces)提供。Docker 容器存在的意义就是为了运行容器中的应用,对外提供服务,所以启动容器的目的就是启动运行该容器中的应用。容器中的应用运行完毕后,容器就会自动终止。所以,如果不想让容器启动后立即终止运行,则就需要使容器应用不能立即结束。通常采用的方式有两种,使应用处于与用户交互的状态或等待状态。下面以tomcat镜像为例,进行容器的相关操作。
docker镜像详解 Docker镜像是Docker容器的基础组件,它包含了运行一个应用程序所需的一切,包括代码、运行时环境、系统工具、库和依赖等。Docker镜像的本质,可以分为以下几个方面来解释。文件系统层:Docker镜像是由多个文件系统层(Filesystem Layers)组成的。每个层都是只读的,并且包含了文件和目录的变更。这种分层的文件系统结构使得镜像的构建和复用变得非常高效。每个层只需要存储差异部分,大大减小了镜像的体积。只读性:Docker镜像是只读的,一旦创建就不能被修改。
初识docker 现在的服务器都牛的很,动不动128G内存,24个CPU,Linux本身就是个多租户的操作系统,可以多人共用,但是如果某个程序狂吃内存和CPU,占用了太多系统资源,这就会影响其他程序的运行。但是云主机提供商呢?不同的用户之间不认识,共用一台强大的计算机,结果某个程序耗尽了资源,其他用户肯定不乐意了。相对虚拟机的重量级虚拟化方案,Linux内核级的一些隔离方案让人们看到了希望,cgroups、namespace、tc、quota、chroot、lxc,终于,Docker出现了,Docker利用这些成熟的技术。
Lua 脚本语法学习 例如,如果要为一个 table 扩展加号(+)运算功能,则可重写该 table 元表的__add 元方法,而具体的运算规则,则是定义在该重写的元方法中的。由于协同函数的本质就是函数,所以协同函数的调用方式就是标准的函数调用方式。从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。table.maxn(table)该函数返回指定 table 的数组中的最大索引值,即数组包含元素的个数。
GORM---高级查询 数据表Users表:Email表:子查询是指一个查询语句嵌套在另一个查询语句内部的查询,内部的查询是外部查询的条件。运行结果如下:由于平均年龄需要计算,所以内层的SELECT语句的作用是为了得到平均年龄(connect.DB.Table(“users”).Select(“AVG(age)”)),外层的SELECT语句的作用就是条件判断。运行结果如下:虽然这个子查询的例子的实际意义不大,但实在是想不出什么好的例子了。首先subQuery变量存储的是内层SELECT语句的查询结果,就是查询在users表中