自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小小郭

内心谦下是功,外行于礼是德

  • 博客(133)
  • 资源 (2)
  • 收藏
  • 关注

原创 用go写一个docker(9)-初步构造容器

通过前面的准备我们可以开始写docker了。一口吃不出一个胖子,我们慢慢吃,到最后不会吃成胖子,但能把东西吃完也是极好的。所以我们先实现一个run版的docker,后续再慢慢加其他功能。本次的完整代码可参考:https://github.com/xianlubird/mydocker/tree/code-3.2为了便于理解,我精简了一下:https://github.com/warshipJian/jiandocker/tree/code-1主要看command.go文件:var runCo

2021-02-21 12:15:08 11

原创 用go写一个docker(8)-介绍两个库cli和logrus

有了前面知识就可以开始写一个简单的docker了,但为了让这个docker好看一点,我们先了解一下会用到的两个库:cli 和 logrusgithub.com/urfave/cligithub.com/sirupsen/logrus关于go的版本这里再啰嗦一下,go在1.12之后就正式支持go module了,通过go module管理使用第三方包非常的方便。如无特殊说明,这里用的go版本都是1.15的,使用go module来管理维护第三方库(和go path说再见吧)。cli我们

2021-02-04 23:57:46 19

原创 用go写一个docker(7)-linux的AUFS文件系统

​namespace和cgroup解决的是容器的资源隔离和限制问题。容器的另一个特点是镜像分层,我们可以在基础镜像上加自己定制的东西。今天我们就以AUFS为例,来看看docker的文件系统。什么是AUFSAUFS 的全称是 Advanced Multi-layered unification filesytem,它的主要功能是:把多个目录结合成一个目录,对外使用。以下面为例,我们先直观地体验一下。1.准备工作准备三个目录,分别命名为:base,mnt,top。在base目录下创建名为base.txt

2021-01-25 19:17:15 30

原创 用go写一个docker(6)-linux的cgroup

namespace可以帮我们把资源隔离,但不能对资源的使用做限制。比如我想限制某个进程用多少CPU,多少内存话,怎么办呢?答案就是用cgroup什么是cgroupcgroup是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。体验下cgroup我们直接体验下cgroup的内存和CPU限制。一.cgroup的内存限制示例代码mem.go:package main​import ( "fmt"

2021-01-17 12:23:21 26

原创 极简jmeter使用教程

起因测试美眉对性能压测很感兴趣,说想试试jmeter,问有没有保姆级的jemter教程。我思考了一下决定亲手写一个。什么是jmeterjmeter是一款压力测试工具。ok,那我们先搞清楚什么压力测试?打个比方,有个网站:www.xiaoxiaoguo.cn,我想知道这个网站能不能同时承受10个人访问的话,要怎么做呢?最简单的办法就是找10个人,喊3,2,1,然后这个10个人同时操作电脑打开网站。找10个人应该不是很难,但假如要测试100个人,1万个人呢?这个方法就不行了。在实际的测试工作中,我们

2021-01-14 17:25:03 55

原创 用go写一个docker(5)-linux的namespace(下)

上篇我们用go语言体验了namespace,今天了解下namespace的实现。namespace的目的是资源隔离,即资源都在,但不能让你看到。比如进程a只属于namespace A,则不能让a看到namespace B的资源,除非把a拉到namespace B中。namespace隔离的资源有:系统的hostname网络资源(网卡信息,路由信息等)进程信息(有哪些进程,父进程子进程间的关系等)用户信息(有哪些用户,组,用户的权限是什么)文件系统信息(有什么可用的文件系统等)等等...那

2021-01-11 12:05:12 19

原创 用go写一个docker(4)-linux的namespace(上)

​温馨提示:之后环境使用的系统如无特殊说明,都是用Linux,代码要在Linux上跑,在Windows或macos上是跑不起来的。这里使用的内核是4.15.0-88-generic,系统是Ubuntu 18.04。Namespace 是Linux提供的一种内核级别隔离机制,目前提供的能力如下:名称标识符隔离资源CgroupCLONE_NEWCGROUPcgroup根目录IpcCLONE_NEWIPCSystem V IPC(信号量、消息队列和共享内存)和POSIX m

2021-01-03 23:02:40 28

原创 用go写一个docker(3)-linux的proc

​proc是虚拟文件系统,放在内存里面。root@xxg_txy:~# ls /proc/1 1114 13 15 18922 22 27 30153 35 435 78 8638 consoles interrupts kpageflags partitions sysvipc10 1130 1303 16 18923 22846 270 3020 36

2020-12-27 22:56:55 18

原创 用go写一个docker(2)-go的Goroutine和通道

如果熟悉go的话请关掉这篇文章,不用往下读了。并发和并行并发强调的是可同时做多个事情(非阻塞),并行强调的是同一时间内多个事情同时进行。可以用CPU多核来理解:在单核CPU中,系统是可并发的,我们可以在打开浏览器的同时打开播放器听歌。CPU分了很多时间片,轮流给各进程使用,这些进程“看起来像”同时运行,但同一时间内只有一个时间片。而要并行的话则必须要多核CPU,因为并行强调的是同一时间内多个进程同时运行,即同一时间内要多个时间片。简而言之:单核CPU的并行能力是0,N核CPU的并行能力是N。阻塞和非

2020-12-14 16:07:35 27

原创 go使用第三方包和本地包

前言go之前对第三方包的管理不上心,其他语言比如python有pip,nodejs有npm,而go却没有一个官方的管理工具。在go 1.11之前,开发者需要要关注GOPATH环境变量,这对于开发者来说不友好。经过几次变更后,go于1.12版本开始正式使用go Module,go终于有了一个官方的处理方式,开发者也可以抛弃GOPATH了。本次使用的go版本为1.15.6,建议使用1.13或以上的版本,旧的方式就不要再关注了,让它随风而去吧。go version go1.15.6 darwin/amd

2020-12-10 16:58:15 193

原创 用go写一个docker(1)-go的类型、变量、切片、字典、控制流程、函数、指针、结构体、方法和接口

如果熟悉go的话请关掉这篇文章,不用往下读了。安装go如果电脑上没装go,参考这篇文章安装:https://golang.org/doc/install类型高级语言分静态类型和动态类型。比如PHP,JavaScript是动态类型,go是静态类型。go的基本数据类型有:布尔、整形、浮点型、字符串、数组package mainimport ( "fmt" "reflect")func main() { // 布尔类型 a := true fmt.P

2020-12-08 11:27:31 70

原创 PHP8.0正式版的编译安装与使用

2020-11-26发布了PHP8.0的正式版介绍下它的安装,并使用laravel对比下PHP7安装与配置本次使用的操作系统Ubuntu 18.04.4 LTS安装1.准备必要库apt-get install -y autoconf libxml2-dev libsqlite3-dev \libcurl4-openssl-dev libssl-dev libonig-dev libtidy-dev zlib1g-dev2.去官网下载8.0正式版 https://www.php.net/.

2020-11-27 23:12:30 2025 1

原创 浅谈CORS跨域问题

前言在web开发中,有时会遇到如下错误:Access to XMLHttpRequest has been blocked by cors policy这个错误经常出现在新项目刚开始的时候,处理的方式一般有两种:1. 在浏览器上装个跨域插件或跑个本地代理,适用于本地调试。2. 调整服务端配置,从根本上解决。这是个老生常谈的跨域问题,今天我们来重新认识一下。什么是跨域一个URL的组成可以简化为四部分:协议,域名,端口号,路径。格式为:协议://域名:端口号/路径。比如地址: http

2020-11-24 18:34:47 70 1

原创 在k8s上平均分配容器到每个Node中

有时会遇到这样一个场景:每个pod上只需运行一个某应用的容器。k8s默认的容器调度策略是满足不了的,虽然它会尽量往负载低的服务器上调度,但难免会出现一台服务器上有两个或多个以上相同的容器。此时可通过nodeAffinity和podAntiAffinity配合使用来实现。示例如下:spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerm

2020-10-20 15:42:41 345

原创 非docker环境下的fastapi开机启动

有个方式是用Supervisor托管fastapi,配置Supervisor开机启动,从而达到fastapi开机启动的目的。但我只是想启动fastapi,能否不用Supervisor,当然是可以的。假设fastapi项目的路径是/opt/fastapi,则启动fastapi的命令可以是:/usr/local/bin/uvicorn --app-dir /opt/fastapi main:app那么把这条命令放到/etc/rc.local中就可以开机启动了。但这样又显得不是那么优雅,不如就用系统本

2020-10-19 15:30:19 107

原创 docker核心技术简介之namespace

前言时光匆匆,转眼2020年也只剩下2个多月了,感慨之。今天来介绍下docker中用到的一个核心技术Namespace,由于个人能力有限,不会深入到具体的细节。私认为一个基础的docker需具备以下功能:1.资源隔离。即各个容器都是独立的,只能使用本容器的资源。比如每个容器只能看到自己的进程和文件,而看不到服务器上其他的进程和文件。每个容器的CPU和内存资源也是需要隔离的,不能出现某个容器把CPU占满,导致其他容器无法工作。2.镜像功能。一处构建,到处执行。用户在安装好docker后,直接拉取镜像

2020-10-10 18:38:42 75

原创 PHP框架下配置文件读取k8s环境变量,实现node的custom-environment-variables效果

如果用过node的话,会发现它的环境配置管理在docker容器集群中使用起来比较方便。以koa为例,在config下定义好custom-environment-variables.json相关环境变量,比如:{ "mysql_host": "MYSQL_HOST", "mysql_user": "MYSQL_USER", "mysql_password": "MYSQL_PASSWORD", "mysql_db": "MYSQL_DB", "redis": "REDIS"}之后

2020-09-28 18:17:09 108

原创 解决cURL error 60 Peer‘s Certificate issuer is not recognized.问题

有时更新了SSL证书后,在浏览器端正常访问,但在服务端,比如PHP不能正常请求该接口,报错如下:cURL error 60: Peer's Certificate issuer is not recognized.如果使用PHP的file_get_contents函数,报错如下:PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL

2020-09-27 17:24:17 1353

原创 gitlab的runner实践

公司的项目有个特点:项目多。这意味着每有一个新项目,就需要在gitlab,jenkins,k8s上新建对应的项目。虽然每次配置只花10分钟,但这种重复的劳动终究不是我们想要的。仔细一看,发现每次新建项目基本是改下名字,其他配置都没怎么改过,于是便有了改造思路:去掉中间商jenkins(jenkins是很优秀的,这里不用它是为了偷懒)利用gitlab的runner来做CI/CDCI/CD 流程去掉jenkins后,代码的打包发布工作就交给了gitlab的Runner。Runner是

2020-08-26 14:22:41 74

原创 ECS云盘在线扩容

今天分享一个运维小知识。有时候我们的服务器硬盘空间不足了,需要扩充空间。如果是单硬盘,又没有做LVM这些,能否不停机且将硬盘的容量扩大呢?当然是可以的,用云厂商的在线扩容实现。以阿里云的ECS为例,步骤如下:1. 找到服务器云盘,先创建一个快照(扩容失败时还原数据,虽然基本不会发生),快照创建完成后,选择云盘扩容。2. 勾选在线扩容,填好要扩容的容量。这里扩到200G3. 完成后可以看到硬盘变成了200G了,但进入服务器发现还是40G,此时要手动处理下。4. 先安装好用于扩容硬盘的工具Ce

2020-08-20 18:03:54 118

原创 laravel admin-03-验证码和防XSS攻击

一.验证码有个现成的库:https://github.com/Iamtong/laravel-admin-login-check-safe 直接拿来用吧。安装一下composer require iamtong/laravel-admin-login-check-safephp artisan vendor:publish --provider=Encore\LoginCheckSafe\LoginCheckSafeServiceProvider根据需求修改配置文件config/admin.p

2020-07-31 15:01:35 82

原创 laravel admin-02-数据导出

默认的csv导出有中文乱码的问题,需修改一下CsvExporter.php文件打开 vendor/encore/laravel-admin/src/Grid/Exporters/CsvExporter.php在public function export() 的$headers后面添加print(chr(0xEF).chr(0xBB).chr(0xBF));但还是不太方便,改为用laravel-excel吧一.安装对于laravel5.6及以上的,直接composer安装即可compose

2020-07-28 18:04:21 131

原创 laravel admin-01-按钮隐藏

laravel admin提供了模板化的管理后台,可以让后端在10分钟内就做出一个管理后台,非常的方便。优点:自带角色,权限管理,无需再做一套权限管理系统丰富的字段类型,无需另外去写相关的样式和交互基于laravel开发,可以说是没有学习成本了当然,不吹不黑,有一说一。作为一个已经迭代多年的框架,UI和交互方面显得不是那么的fasion,用它来处理一些定制化多的场景时,开发起来也比较繁琐。一.安装和入门认真学习的同学应该发现了,这些在小学二年级的时候学过了,所以安装和入门使用就不赘述了,

2020-07-27 21:20:06 88

原创 缩减docker镜像体积

以一个C语言的hello word为例:#include <stdio.h>#include <unistd.h>int main () { printf("Hello, world!"); sleep(100000); return 0;} dockerfile 如下:FROM gccCOPY hello.c .RUN gcc -o hello hello.cCMD ["./hello"]打包一下:docker build -f gcc -t

2020-06-03 15:05:54 94

转载 AUFS简介

早期docker的默认文件系统是AUFS(后来是Overlay),今天来简单学习一下。我们先实验一下,真实感受下aufs。在Ubuntu中默认就安装了aufs,可以直接使用。AUFS实验准备准备三个目录: base ,mnt , top。在base目录下准备base.txt 和 common.txt文件,在top目录下准备common.txt和foo.txt文件, mnt目录用于挂载# tree.├── base│ ├── base.txt│ └── common.txt├──

2020-06-03 14:40:59 1499

原创 一次小并发的上线复盘

由于有的人喜欢说高并发,百万并发,所以这个2万并发的项目就叫小并发吧。开发阶段之前给客户A做过一个活动,当时说活动会有1万并发,我们做了大量的优化和准备,结果上线后并发只有2千多,这个数据让我们觉得客户A喜欢吹牛。几个月后客户A又找过来,说要做一个新的活动,称这个活动会有2万的并发。由于之前的"经验",我们觉得顶多也就3千多吧,于是开发时就比较放飞。比如核心字段用TEXT,取全表数据来排名,用了大量的MySQL等等,这些设计给后面的上线埋下了小地雷。在上线前做了几次压测,压测目标2万,结果也还行,错

2020-05-19 10:35:23 105

原创 关于并发,QPS和TPS

并发有时候我们醉心于业务逻辑的书写,可能忽视了并发,这里鄙人斗胆说一下对并发的理解,如果错了请指正。在web开发中,并发指的是某个时间单位内对服务器产生的请求数,一般指1秒内产生的会话请求。比如我们说1千并发就是指1秒内有1000请求发送到web服务器。值得注意的是并发数和会话数是不同的,并发是一定会对服务器产生压力的,而会话数可能只是‘挂’在服务器上,并没有查询数据库等操作。比如我们说秒杀场景并发高,是由于在那几秒内要完成下单,库存扣减等操作,这些操作会对服务器,数据库等产生巨大的压力。而要做一个大流

2020-05-18 14:34:36 146

原创 在koa中调用微信图片检测接口

需求: 写个接口给前端,前端传图片给你,然后你调用下微信的接口 https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN。第一眼看到,感觉就是很普通的一个简单的,直接用axios即可,代码类似如下:const accessToken = await wxUtil.getMPAccessToken();const...

2020-03-06 23:29:05 321

原创 守护进程4-nohup

我们要结束一个进程时可以通过kill命令来实现,kill的过程简单来说是这样:使用kill将信号发送到进程的task_struct中,task_struct的特定的成员变量里记下这个信号下一次CPU调度到这个进程的时,内核会先执行do\_signal,处理信号使用kill -l 命令可以查看kill能发送的信号nohup除了利用工具(tmux,screen等),daemon自守护,s...

2020-02-01 18:12:14 64

原创 守护进程3-systemed

看当前shell的pidecho $$ 看某个进程的pid可以用pidof,比如看nginx的pidof nginx在centos 6时代我们要配置一个开机启动的程序时,可以在/etc/rc.local中添加启动命令,在/etc/init.d中添加启动脚本。到了centos 7 时发现不推荐用init了,有了一个船新的系统systemed。systemed实现守护进程的方法除了利用...

2020-01-31 21:48:45 406

原创 守护进程2-daemon

如何看一个进程是不是守护进程呢?一个简单的方式是看下它的tty是不是?比如nginx的root@lan-dev-215:~/test# ps -e -o pid,ppid,cmd,tty | grep nginx 1436 1 nginx: master process /usr/ ? 1437 1436 nginx: worker process ? 1438 ...

2020-01-31 20:25:35 65

原创 守护进程1-tmux

前言一般要在服务器上做一些花里胡哨的操作时,都是打开终端(如果是远程服务器,则还需要通过ssh连接下)在上面操作。你会发现当你的ssh断开或关闭terminal时,你在上面临时运行的程序也停掉了,这是为什么呢,今天就来讨论下这个问题。terminal和shell关于终端和shell的来由说起来就话长了,这里不做赘述,可以看下这篇文章Linux Cygwin知识库(一):一文搞清控制台、终端、...

2020-01-31 15:29:08 124

原创 PHP调用java的webservice(SOAP)

现在都是用微服务了,早期有个概念和微服务差不多的东西,叫SOAP。最近有个项目就需要调用java那边的webservice获取订单状态,由于之前不了解走了些弯路,此次记录一下。soap client 使用PHP要开启soap调用步骤连接soap找出对外的function找出支持的参数types传参调用function,获取结果。连接soap$wsdl = 'http://...

2020-01-13 17:23:54 270

原创 K8s Ingress 支持socket.io多实例

socket.io 多实例间通信在实际工程中不会只用一个node实例,用户多的时候会需要开多个node实例。这些实例间的通信可以用redis适配器来实现,socket.io官方有个现有的封装socket.io-redis,它是利用redis的发布订阅模式来实现的,使用示例如下:const redisAdapter = require('socket.io-redis');var redis_...

2020-01-05 21:11:19 783

转载 在线修改表结构DDL

表的数据比较大时,如果直接修改会阻塞表,影响业务数据。有两个工具可以实现:pt-online-schema-change 和 gh-ost这次使用pt-online-schema-change参考:https://segmentfault.com/a/1190000014924677一.安装进入官网选择好对应的版本,下载到服务器 https://www.percona.com/downl...

2019-10-29 20:31:52 198

原创 使用faketime修改docker内的时间,解决date: cannot set date: Operation not permitted问题

docker本质是个进程,有很多资源是使用宿主机的,比如系统时间。正常使用时是会觉得很方便,但涉及到对系统资源的修改时,就比较麻烦了。场景使用docker部署了一个后端服务,测试需要改系统时间,如果直接改宿主机时间则会影响到其他的docker(不管是在宿主机上改还是通过–cap-add SYS_TIME参数在docker中修改)。有没有什么既能满足测试要求又不影响其他docker的方法呢?答案...

2019-08-25 23:46:47 5740

原创 ESXI + pfsense + 公网ip ,实现内网服务器端口映射

暴露内网服务器端口的方法有很多,之前介绍过ngrok和frp,今天我们用 ESXI +pfsense 来做下。0. 准备材料ESXI服务器一台,双网卡,版本5.5以上公网ip一个(有固定IP是最好的)fpsense镜像1. 拓扑&规划1.内网网段 192.168.0.0/24 , 公司路由器网关192.168.0.12.ESXI服务器的两张网卡: 一张接内网交换机,一张接外...

2019-07-10 16:05:38 4777

原创 k8s下使用Ingress开启跨域(CORS)

在Ingress中,跨域(CORS)的配置如下:nginx.ingress.kubernetes.io/cors-allow-headers: >- DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorizatio...

2019-06-30 22:43:23 7602 1

原创 介绍几个linux命令/工具

pastepaste可以帮你把两个文件自动合成一个文件。文件a的内容为:111222333文件b的内容为:aaabbbcccddd使用paste命令,把a,b合成文件cpaste a b > cc的内容为111 aaa222 bbb333 ccc444 ddd加 -d 指定不同的分隔符paste -d '-' a b 111-a...

2019-05-01 22:42:56 337

原创 闲谈docker

原本计划在3月将linux进程的内容总结完,但途中遇到其他事情耽搁了,只能延后,争取在5月底前完成这部分内容。2014python年会上印象最深的就是docker主题,docker开始进入大众视野,方心未艾。而今5年过去了,由docker衍生出来的技术越来越多,如k8s,rancher等,docker也逐渐成为必备工具。这次闲谈下docker和虚拟机的区别以及怎么用dockerdocker和...

2019-03-28 11:34:25 150

2018年9月全国标准省市县行政划分代码数据表

爬取的是2018年9月县以上行政区划代码,做了下调整,表包含省,市,县区三个划分

2018-11-01

graphios脚本

用于将nagios的数据发送给graphite的一个脚本,属于github上的一个旧版本。

2015-01-12

空空如也

空空如也

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

TA关注的人 TA的粉丝

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