自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(172)
  • 资源 (1)
  • 收藏
  • 关注

原创 Golang原生rpc(rpc服务端源码解读)

创建rpc接口,需要几个条件方法的类型是可输出的方法的本身也是可输出的方法必须有两个参数,必须是输出类型或者是内建类型方法的第二个参数是指针类型方法返回的类型为errorrpc服务原理分析...

2021-03-27 11:01:10 1491

原创 设计模式——建造者设计模式

有时会出现一个类,构造函数需要大量的参数,但是有些参数是不经常用到的,这会很麻烦。我们可以使用建造者模式,像流水线,将所需要的对象组装并且返回。

2022-07-16 21:57:10 1828 1

原创 设计模式——抽象工厂

先用一个需求引入工厂模式这里我们的需求就是,按照不同的种类,生成不同种类的对象,当然,我们可以设计九个类,对应不同种类的对象,但是如果每次添加新的产品,我们可能就要修改核心代码,这样会引出一个解决方法——抽象工厂对于生成这类的对象,他们有共同点还有不同点,不同种类的风格,但是可以生成同一类产品,那么我们可以先声明不同物品要实现的接口,然后每个工厂生产这个对象都要实现这个接口。我们使用go来实现。总结:......

2022-07-10 15:35:27 1833

原创 cka——第一天

etcd组件:etcd是键值对数据库,安全 & 快速安装etcd:运行etcd:操作etcd如果手动部署集群,我们可以下载二进制文件部署。如果使用kubeadm部署集群,etcd将以pod的形式部署在机器上。(部署在kube-system的命名空间中)查询通过kubernetes存储的键值对:通常部署的etcd集群都是多节点etcd,防止单点故障。所以就要配置etcd的集群。在etcd.service中的 --initial-cluster中指定etcd服务的不同的实例(键值对的形式)...

2022-06-30 23:57:40 1836

原创 go get失败解决方法

首先,由于网络原因,国内可能使用dgo get不能正常访问。两种解决方法:添加代理使用git下载添加代理具体可以看这个网站七牛云代理使用git下载比如我们下载gin框架我们先找到gin框架的所在github的地址github-gin我们先将代码拉到本地。git clone https://ghproxy.fsofso.com/https://github.com/gin-gonic/gin.git#这里最好使用代理拉取,并且是没有缓存的代理,如果是有缓存的代理,可能导致没有下载到

2022-04-27 20:53:15 4418

原创 rabbitmq——交换机fanout和direct

交换机:生产者将消息发送到交换机上,根据交换机不同的种类,将消息体按照不同的规则转发给不同的消费者。fanout此模式是将生产者生产的消息,通过交换机绑定的所有队列,发送到所有绑定到此交换机上的队列。product.go...

2022-03-04 20:17:35 3636 1

原创 rabbitmq——持久化消息

使用rabbitmq做持久化消息,我们有两种方式。使用自动确认机制,如果使用这种机制,消费者接收到消息之后自动确认,但是如果接收到消息之后,服务卡顿,就会导致这条消息不会重新发送给其他或者重启之后的消费者所在的服务器。导致间接性消息丢失。使用手动确认机制,当消息接收到之后,不要立即确认收到,而是先处理,处理之后,再确认这条消息。product.goque , err := c.QueueDeclare("hello-test" , false , false , false , false ,

2022-03-04 16:39:18 3652

原创 docker常用命令

docker search#搜索镜像docker search tomcat#搜索官方镜像docker search tomcat --filter "is-official=true"#搜索star大于5的镜像docker search tomcat --filter-stars=5#搜索镜像,返回5条数据docker search tomcat --limit=5docker ps#显示正在运行的容器docker ps#显示创建过的容器docker ps -a#显

2022-02-22 17:28:02 2228

原创 MYSQL常见问题

MYSQL主从复制原理主:将修改数据的sql语句放进binlog中。从:开启从模式之后,负责从master节点中拉取binlog。从数据库拿到binlog后,执行sql语句。MYSQL中Myisam和Innodb有什么区别Innodb支持事务,Myisam不支持事务。Innodb支持行级锁,Myisam支持表级锁Innodb支持外键,Myisam不支持外键Innodb引擎四大特性插入缓冲二次写自适应哈希索引预读哪一种驱动count(*)更快Myisam更快,会维护一

2022-01-28 17:53:16 3564

原创 Golang之gc

常见的GC算法引用计数法根据对象自身引用计数来判断是否被回收,当自身引用数为0时,对象会被回收优点:简单直接,回收速度快缺点:每个对象都要维护一个自身的引用数,需要额外的开销。...

2022-01-22 15:18:26 2099

原创 golang之gmp调度模型

原始调度模型我们把线程分为内核级线程和用户态线程,内核级的线程在切换线程时,开销比较大,需要系统调用,但是,用户态线程不是这样,用户态的线程之间的切换不需要系统调用,从而把切换的开销比较小。golang开始并没有使用gmp调度模型,只有gm。也就是说没有局部队列,每一个m执行完一个g之后,从全局队列中拿到一个g运行,这样的结果就是每一个m从全局队列中拿取g时,都要对全局队列加锁。这也是导致原始调度模型效率低的一个原因。GMP调度模型G:goroutine ,协程,用户态线程M:thread,对应

2022-01-19 13:21:53 3234

原创 Rabbitmq入门

Rabbitmq使用demorabbitmq分为生产者和消费者,生产者是创建消息,消费者是使用消息。先写生产者。package mainimport ( "fmt" "github.com/streadway/amqp" "log" "time")func main() { //链接rabbitmq服务器 con, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Print

2022-01-18 11:07:34 2792

原创 Mysql常问问题

数据库的三大范式第一范式:每个列都不可以再拆分第二范式:在第一范式基础上,非主键列完全依赖于主键,而不是部分依赖第三范式:在第二范式的基础上,非主键列只依赖于主键。Mysql的binlog有几种格式,有什么区别statement:每一条会修改数据的sql,都会记录在binlog中,不需要记录每一行的变化。row:不记录sql语句的上下文关系,仅保存哪一条数据被修改。mixed:折中方案Mysql存储引擎与InnoDb的区别锁的粒度方面:由于锁的粒度不同,InnoDb比MyIsa.

2021-12-10 20:33:49 2582

原创 GO大厂面试题(1)

今天看了一部分大厂面试题关于golang的,有一些没听过的,一些不熟悉的。记录一下。什么是 Goroutine?你如何停止它?一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的Goroutine 线程。Goroutine 线程比标准线程更轻量级。可以使用channel停止。两个接口之间可以存在什么关系?等价关系和子集关系。Go 语言当中 Channel(通道)有什么特点,需要注意什么?如果给一个 nil 的 channel 发送数据,会造成永远阻塞。如果从一个

2021-11-21 17:10:31 2281

原创 GO标准库math/rand包

source接口int63(),生成一个int64的数seed(),初始化一个生成器。rand.NewSource(int64)//传入一个int64的数,作为种子Rand结构体rand.New(Source)//传入实现source接口的结构体r := rand.New()r.Int()r.Int31()r.Int63()//int系列返回对应的类型的数字r.Uint32()//返回uint32类型的随机数r.Intn(n int)r.Int31n(n int32)

2021-11-20 16:05:01 2285

原创 大顶堆,小顶堆——排序问题

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例 1:输入:[“Med

2021-11-19 21:46:08 2511

原创 贪心算法——跳跃游戏ii

跳跃游戏 II给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。示例 1:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。题目来源:力扣网址:https://leetcode-cn.com/pro.

2021-11-16 19:21:53 3941

原创 动态规划——不同路径ii

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths-ii思路这道题有一道题目大意相同,但是比这道题简单一些的题。可以先做会不同路径,再来做不同路径ii。我们会想到动态规

2021-11-13 19:25:51 1763

原创 动态规划+递归——礼物的最大价值

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof得到礼物最大的价值,从左上角到右下角,从题意上来说,从左上角出发,每次可以向下走,可以向右走,目标是右下

2021-11-11 16:01:24 1828

原创 回溯算法——全排列

回溯算法框架if 退出条件 { //将得到的值,保存到变量中}for _ , 变量 := range 所有变量 { if 变量符合条件 { 将变量设为不符合条件,防止回溯之后重复选择 backtrace() //选择 将变量的不符合的释放,可以再次选择 }}例题给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1]

2021-11-10 11:02:26 1990

原创 自动提交数据

使用自动填报有两种方式使用二进制文件直接部署到机器上使用docker,但是要求机器配置docker环境,这里就不介绍搭建docker环境了l使用二进制文件部署到机器上使用git下载git clone https://hub.fastgit.org/silves-xiang/jkrb.git如果没有git环境。在url中复制这个网址。就会下载https://github.com/silves-xiang/jkrb/archive/refs/heads/master.zip下载之后,有

2021-11-03 18:49:28 553

原创 Go——cap

先分析这段代码:package mainimport "fmt"func main() { var SliceNumber []int = []int{1, 2, 3, 4, 5, 6, 7, 8} var SliceNumbert []int = make([]int, 0) var SliceNumberf []int = make([]int, 0) SliceNumbert = SliceNumber[:5] SliceNumberf = SliceNumber[2:] fmt

2021-11-01 20:23:50 515

原创 基于kubernetes搭建个人服务

使用kubenetes部署写的程序,先使用docker,打包个人镜像,再进行部署。大致步骤程序写dockerfile打包镜像,并上传至远程仓库部署程序这次的程序,使用二进制程序,并不使用源码封装到镜像中再运行,二进制程序好处有,启动速度快,不许要环境,如果不需要环境,则写dockerfile就会少很多内容。我部署的程序是我的私有云上的镜像,读者可以换成你的公开镜像,我部署的二进制程序,有关个人信息,所以放在私有云上,在镜像方面,读者需要换成公开镜像。准备好二进制程序其中p_main

2021-10-30 15:19:14 410

原创 版本控制器——git常用控制命令

git的结构图片转自https://blog.csdn.net/u011535541/article/details/83379151我们一般写代码在工作区,提交时,我们将工作区的代码先提交到暂存区,通过commit提交到本地仓库。常用版本控制命令#将目录下代码提交到暂存区git add ./#将暂存区的代码提交到本地仓库git commit -m "说明"#创建其它分支git branch dev#切换分支git checkout dev#回滚git checkout HEAD

2021-10-30 10:21:36 370

原创 Kubernetes——pod与集群节点的自动伸缩和高级调度

pod的横向伸缩

2021-10-28 17:11:12 436

原创 kubernetes——计算资源管理

在pod中申请资源apiVersion: v1kind: Pod## 标题metadata: name: kubia-ce namespace: test labels: name: kubia-cespec: containers: - name: kubia-ce image: luksa/kubia resources: requests: cpu: 100m memory: 10Mi limi

2021-10-27 14:14:20 428

原创 kubernetes——了解kubernetes机理

架构控制平面组件etcd分布式持久化存储API服务器调度器控制管理器工作节点上运行的组件KubletKublet服务代理(kube-proxy)容器组件间如何通信Kubernetes系统组件只能通过API服务器通信,它们之间不会直接通信。单组件运行多实例为了保证高可用性,控制平面的美国和组件可以有多个实例。etcd和API服务器的多个实例可以并行工作,但是调度器和控制管理器在给定时间内只能有一个实例起作用API服务器API服务器先提供了一种一致的方式将对象存储到etcd

2021-10-26 20:10:12 320

原创 kubernetes——部署有状态的多副本应用

有状态应用要求管理者配置文件中列出所有其它的集群成员和他们的ip地址。StatefulSet有状态的应用中每一个实例都是不可替代的个体,都拥有稳定的名字和状态如果使用StatefulSet,当有一个pod挂掉后,这个实例需要在别的节点上重建,但是新的实例必须与被替换的实例拥有相同的名称、网络标识和状态。因为有状态的服务会根据先前的访问做一些不同的处理,所以,我们要将所有的有状态的pod做headless service。当调用时,会返回每个pod的ip。创建StatefulSet控制器管理的pod

2021-10-26 18:50:43 751

原创 kubernetes——Deployment资源

当创建一个Deployment时,也会ReplicaSet也会创建,pod是由Deployment和ReplicaSet共同管理的。创建DeploymentapiVersion: apps/v1kind: Deploymentmetadata: name: test-deployspec: selector: matchLabels: app: test-deploy template: metadata: labels: app

2021-10-25 16:47:49 335

原创 kubernetes——从应用中访问元数据

容器中可以通过环境变量或者挂载的方式,获取pod的一些数据通过环境变量访问元数据apiVersion: v1kind: Podmetadata: name: test labels: name: testspec: containers: - name: test image: luksa/kubia resources: limits: memory: "128Mi" cpu: "500m" ports:

2021-10-25 13:36:46 360

原创 kubernetes——ConfigMap配置应用程序

ENTRYPOINT与CMD我们使用entrypoint指定的是可执行文件,cmd指定的是可执行文件所需要的参数通过使用yaml文件指定执行的命令和参数apiVersion: v1kind: Podmetadata: name: kubia-ce labels: name: kubia-cespec: containers: - name: kubia-ce image: luksa/kubia resources: limits:

2021-10-23 14:49:25 403

原创 kubernetes——发现pod并与之通信

介绍服务kubernetes中服务是一种为一组相同功能的pod提供一个单一不变的接入点的资源。可以将一组提供相同服务的pod给定一个不变的接入资源。创建服务服务的后端可以不止有一个pod,服务连接所有的后端指定的pod,服务对后端的pod是负载均衡的。服务是如何区分哪些pod属于服务,哪些pod不属于服务?服务根据标签来选择pod。也就是说,控制器根据标签控制pod,服务根据标签判断是否属于本服务。通过yaml文件创建服务apiVersion: v1kind: Servicemetada

2021-10-21 18:27:27 456

原创 kubernetes——部署托管的pod

存活探针有三种探测方式,测试服务是否正在正常运行HTTP GET探针针对容器的IP地址执行HTTP GET请求,如果收到响应,并且状态码不代表错误,则认为服务正常运行TCP套接字探针尝试与容器指定端口建立TCP连接,如果连接成功则探测成功Exec探针在容器内执行命令,并检查命令的退出状态码。创建带存货探针的podapiVersion: v1kind: Podmetadata: name: kubia-web labels: name: kubia-webspec:

2021-10-20 16:49:38 371

原创 在kubernetes中运行的容器

Pod首先了解到容器之间彼此是完全隔离的,但是我们期待是隔离的容器组,而不是单个容器,每个容器组内共享一些资源,而不是全部。kubernetes通过配置Docker让一个pod内的所有容器共享相同的linux命名空间。pod内运行的容器位于相同的Network命名空间中,因此它们共享相同的IP地址和端口空间,也就是说,在同一个pod内的两个容器的服务不能占用同一个端口。每个pod可以通过其它pod的IP地址来实现互相访问。创建Pod#版本apiVersion: v1#资源类型kind: Pod

2021-10-19 17:11:21 485

原创 minikube入门+踩坑日记

环境搭建minikubekubectldocker下载并配置好环境变量运行minikube从这里就开始踩坑首先这条命令是对的,但是国内的电脑一般访问不到minikube的镜像源,或者访问到也是很慢,所以我们要添加代理或者配置其它镜像源。有两种方法使用镜像源第一种(我没有试过)minikube start#替换成minikube start --registry-mirror=https://registry.docker-cn.com#注意:这里使用的是官方的代理镜像源,可以访

2021-10-18 18:59:05 1495

原创 现代操作系统——死锁

先明确两个概念:可抢占资源:可以从拥有它的进程中抢占而不会产生任何副作用。不可抢占资源:在不引起相关的计算失败的情况下,无法把它从占有它的进程中抢占过来。死锁检测每种类型一个资源将资源和需要它们的进程做出一个图,如果这张图包含了一个及一个以上的环就会发生死锁每种多个类型出现死锁基于矩阵算法来实现检测,有现有资源向量矩阵,可用资源向量矩阵,当前分配矩阵,请求矩阵,可以通过这三个矩阵来判断是否会出现死锁,如果出现任何个资源其中的可分配资源不足以满足任何一个进程的使用,则会发生死锁。死锁的恢复利

2021-10-18 13:31:59 359

原创 现代操作系统——磁盘

磁盘被组织成的结构:磁盘被组织成柱面,每一个柱面包含多个磁道,磁道数与垂直堆叠的磁头个数相同。磁道又被划分为多个扇区。磁盘的格式化每个磁道包含若干个扇区,扇区之间存在短的间隙,一个磁盘的扇区包括:前导码,数据,ECC。前导码:包含柱面与扇区号以及某些其他信息。数据:存储的数据ECC:包含冗余信息,可以用来恢复数据通常来说内侧的第0号扇区相对于外侧的第0号扇区在旋转的方向之后,因为如果磁头进行更改磁道,需要一定的时间,但是这个时间之内磁盘会转动,所以提高读写速度,里外侧的第0号位置会有相对的偏

2021-10-18 12:47:44 432

原创 操作系统——内存管理——虚拟内存

考虑一种情况,如果需要运行一个程序,按照之前学习,应该是将该进程全部装入内存中,但是,如果进程所占内存过大,内存不够使用,怎么办?使用虚拟内存。虚拟内存:每个程序拥有自己的地址空间,这个空间被分割成多块,每一块称作一页,或者页面,每一页有连续的地址范围。这些页被映射到物理地址空间中。如果运行程序时,没有在内存中找到该页,由操作系统负责将缺失的部分装入物理内存,并重新执行。分页程序产生的地址被称为虚拟地址,程序运行时,使用虚拟地址通过mmu映射到物理地址。虚拟内存对应的物理单元被称为页框。使用分页时

2021-10-11 21:36:30 401

原创 操作系统——内存管理(一)

在不使用存储器抽象的情况下运行多个程序,内存会同时装载多个程序,但是,在编写程序时每个程序都有自身的相对地址,如果装载多个程序在内存中,地址不变,就会导致,程序地址错误。基址寄存器与界限寄存器我们可以使用一张表来记录程序的起始地址和程序的长度装载到界限寄存器中。通过程序段的原始地址,加上基地址得到实际内存地址。内存管理使用位图进行内存管理内存被划分为多个存储单元,每一个存储单元都是链表中一个元素,如果需要内存,就会查找位图,碰到能装下进程的位置,就会占有该位置。使用链表的存储管理管理方法是维

2021-10-11 14:00:56 349

原创 现代操作系统——进程间调度

不用操作系统有不同的目标批处理操作系统吞吐量周转时间cpu利用率交互系统相应时间均衡性实时系统满足截止时间可预测性调度算法批处理操作系统先来先服务(FIFO)将所有进程添加至队列中,一个进程执行结束之后,执行下一个进程最短作业优先将现有的、同等重要的作业按照执行时间由小到大进行排序。最短剩余时间优先将所有程序运行时间进行比较,按照执行时间由小到大进行排序。执行时间最短的程序先运行。它与最短作业优先不同的地方在于,如果现有最小执行时间的程序正在运行,当进入一个比现有运行程序

2021-10-11 13:36:39 382

pcmysql.php

利用PHP操作Mysql,个人封装的接口,在简单的查询中可以极大的简化操作,具体使用规范的文档,在主页中的博客可以看到,只要下载之后,创建对象,就可以使用封装好的函数,具体使用规范,在我的主页中的置顶博客查看

2020-06-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除