Channel 信道
说到channel,就一定要说一说线程了。任何实际项目,无论大小,并发是必然存在的。并发的存在,就涉及到线程通信。在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递。共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯。消息传递即通过类似聊天的方式。golang对并发的处理采用了协程的技术。golang的goroutine就是协程的实现。协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通信而设计的。golang解决通信的理念是:不要通过共享内存来通信,而应该通过通信来共享内存。golang解决方案是消息传递机制,消息的传递就是通过channel来实现的。 Channal是什么?Channal就是用来通信的,就像Unix下的管道一样,在Go中是这样使用Channel的。 下面的程序演示了一个goroutine和主程序通信的例程。这个程序足够简单了。 12345678910package mainimport "fmt"func main() { //创建一个string类型的channel ...
Jenkins
超级详细!开发集成工具Jenkins使用教程 docker | jenkins 自动化CI/CD,后端躺着把运维的钱挣了!(下) docker + jenkins:使用jenkins监听git仓库的变化,一旦发生变化就自动拉取git仓库代码,构建docker镜像,然后自动部署,运行容器。只要push了代码,则新一版的项目就会由jenkins自动部署到指定服务器。 账号:浅蝶果果 密码:qqx 创建仓库 访问https://hub.docker.com/ 点击菜单栏 Repositories -> Create Repository 安装Jenkins 官方连接 123456789docker run \ -d \ --rm \ -u root \ -p 9026:8080 \ -v jenkins-data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$HOME":/home \ jenkinsci/blueocean ...
ICE协议下NAT穿越的实现(STUN&TURN)
这一篇感觉写得真好。 NAT是什么?看上一篇《P2P通信原理与实现》 NAT的副作用以及解决方案 国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。 这是NAT带来的第一个副作用:NAT超时:而国内的运营商一般NAT超时的时间为5分钟,所以通常我们TCP长连接的心跳设置的时间间隔为3-5分钟。 而第二个副作用就是:我们这边文章要提到的NAT墙。NAT会有一个机制,所有外界对内网的请求,到达NAT的时候,都会被NAT所丢弃,这样如果我们处于一个NAT设备后面,我们将无法得到任何外界的数据。 但是这种机制有一个解决方案:就是如果我们A主动往B发送一条信息,这样A就在自己的NAT上打了一个B的洞。这样A的这条消息到达B的NAT的时候,虽然被丢掉了,但是如果B这个时候在给A发信息,到达A的NAT的时候,就可以从A之前打的那个洞中,发送给到A手上了。 简单来讲,就是如果A和B要进行通信,那么得事先A发一条信息给B,B发一条信息给A。这样提前在各自的NAT上打了对方的洞,这样下一次A和B之间就可以进行通信了。 四种NAT类型,看上一篇...
P2P通信原理与实现
当今互联网到处存在着一些中间件(Middle Boxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。 目前部署的中间件多都是在C/S架构(client/server)上设计的,其中相对隐匿的客户机主动向周知的服务端(拥有静态IP地址和DNS名称)发起链接请求. 大多数中间件实现了一种非对称的通讯模型,即内网中的主机可以初始化对外的链接,而外网的主机却不能初始化对内网的链接, 除非经过中间件管理员特殊配置。 前言 在中间件为常见的NAPT的情况下(也是本文主要讨论的),内网中的客户端没有单独的公网IP地址, 而是通过NAPT转换,和其他同一内网用户共享一个公网IP. 这种内网主机隐藏在中间件后的不可访问性对于一些客户端软件如浏览器来说并不是一个问题,因为其只需要初始化对外的链接,从某方面来看反而还对隐私保护有好处。 然而在P2P应用中, 内网主机(客户端)需要对另外的终端(Peer)直接建立链接,但是发起者和响应者可能在不同的中间件后面, 两者都没有公网IP地址. 而外部对NAT公网IP和端口主动的链接或数据都会因内网未请求被丢弃掉...
R系列-1
缓存雪崩 (大量key失效,导致大量访问,犹如雪崩) 在高并发场景下,大量缓存key在同一时间失效,造成大量请求直接落在数据库上,导致数据库宕机。 解决方案: 随机设置key失效时间,避免大量key集体失效。 1setRedis(Key,value,time + Math.random() * 10000); 若是集群部署,可将热点数据均匀分布在不同的Redis库中也能够避免key全部失效问题 不设置过期时间 跑定时任务,在缓存失效前刷进新的缓存 缓存穿透(绕过redis,实现穿透) redis缓存和数据库中没有相关数据(例用户直接携带id<=0的参数不断发起请求),redis中没有这样的数据,无法进行拦截,直接被穿透到数据库,导致数据库压力过大宕机。 解决方案 对不存在的数据缓存到redis中,设置key,value值为null(不管是数据未null还是系统bug问题),并设置一个短期过期时间段,避免过期时间过长影响正常用户使用。 拉黑该IP地址 对参数进行校验,不合法参数进行拦截(认为最有效的之一) 布隆过滤器 将所有可能存在的数据哈希到一个足够大的b...
Redis数据库查看工具
工具 Redis Desktop Manager(被推荐,但未使用过) DBeaver(不仅支持redis,还支持多种数据库) 下载地址mac安装Redis可视化工具-Redis Desktop Manager DBeaver Enterprise 21.0 企业版激活方法 DBeaver配置 Mac查询文件 mdfind -name 文件名字 Mac查询文本 mdfind “John”mdfind -onlyin ~/Library txt dbeaver.ini文件地址 /Applications/DBeaverEE.app/Contents/Eclipse/dbeaver.ini dbeaver.ini内容 1234567891011121314-startup../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.0.v20200915-1508.jar--launcher.library../Eclipse/plugins/org.eclip...
PAW API接口调试
推荐PAW一款类似postman的接口调试工具,curl导入效果感觉比postman要好,另外也有请求的多种代码方式源码。 环境本文提供的下载链接仅支持Mac 下载安装链接(破解版)https://macwk.com/soft/paw
GO包管理的前世今生
早期的GO包管理(了解)早期根本没有所谓的包管理,项目依赖一塌糊涂。那么这样会出现什么问题? 在没有包管理方案之前,项目依赖于 GOPATH,带来一些不便之处 多项目难以管理。试想一下,A 项目和 B 项目 同时依赖于一个 C 项目,但是依赖于 C 项目的不同版本,如何解决,只能通过多 GOPATH 设置。 123go命令依赖一个重要的环境变量:$GOPATHGOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;,Linux系统是冒号:[设置Golang的GOPATH](https://blog.csdn.net/chenjh213/article/details/51381024) 项目的依赖只能够手动 go get 下载到 GOPATH 中,如果换一台服务器开发项目,光是包依赖都得弄半天。 如果是本地想搭建对应的项目,还无法知道之前包的版本,只能通过当初项目创建时间进行git tag切换对应版本。 123456git tag #展示全部taggit checkout release-v1.0.0 #切换到tag分支无关...
Docker-部署gitlab
一、前提条件1.存在docker2.服务器可以联网(外网)3.服务器内存至少4G(内存不够会出现502错误) 内存不足502错误如下图所示: 二、安装安装环境:Centos7 1.查找GitLab镜像 1docker search gitlab 2.拉取gitlab docker镜像 1docker pull gitlab/gitlab-ce:latest 3.运行GitLab并运行容器 1234567891011docker run \-itd \-p 9980:80 \-p 9922:22 \-v /usr/local/gitlab-test/etc:/etc/gitlab \-v /usr/local/gitlab-test/log:/var/log/gitlab \-v /usr/local/gitlab-test/opt:/var/opt/gitlab \--restart always \--privileged=true \--name gitlab-test \gitlab/gitlab-ce 成功会返回的容器ID哦!! 命令解释: 12345678910...

