自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 收藏
  • 关注

原创 NAT技术

网络

2024-04-14 19:04:04 162

原创 go解码url

【代码】go解码url。

2023-07-26 22:22:08 153

原创 websocket和http2

网络

2022-10-15 17:18:55 1507 1

原创 时序图学习

时序图

2022-09-15 10:18:00 258

原创 golang之错误处理

golang的错误处理

2022-07-30 14:59:28 394

原创 golang指针操作

指针

2022-06-22 14:27:19 176

原创 curl命令

curl

2022-06-18 15:24:59 101

原创 golang消息中间件 - nats

nats是使用golang开发一款高性能消息中间件

2022-06-04 01:40:25 2127

原创 用go开发简单的聊天系统

基于Gin + websocket + Vue + Element UI的前后端分离即时通讯系统,只需要配置redis,即可启动github源码: https://github.com/jiangxyb/goim-websocket特性登录:http鉴权与websocket鉴权向单个用户发送消息向多个用户发送消息离线消息查看已注册用户查看在线用户单一用户多客户端登录注销视频演示地址https://www.bilibili.com/video/BV1N44y137KT/快速启动

2022-04-30 15:11:46 1661

原创 makefile编写规则

文章目录00.基本写法01. 学习目标02. Makefile简介03. Makefile语法规则04. make命令格式05. Makefile工作原理06. Makefile示例07. Makefile中的变量08. Makefile中的函数09. Makefile中的伪目标00.基本写法目标:依赖Tab键 规则执行顺序:先去根据目标找依赖,再从下面的目标找依赖,如果没有从当前路径下文件找依赖,再执行对应规则,如果找不到依赖,会报错使用方式,make是执行第一个目标,make 目标,执行对应目

2022-04-12 16:41:51 17690

原创 go-reflect反射

go的反射

2022-04-02 20:42:59 399

原创 go-循环队列

golang实现的循环队列package mainimport "fmt"type Queue struct { arr []int front int rear int}func NewQueue(maxSize int) *Queue{ return &Queue{ arr: make([]int,maxSize), front: 0, rear: 0, }}func (q *Queue)Push(data int) { q.arr[q.rear] =

2022-02-14 14:17:12 414

原创 限流、熔断库sentinel-golang

限流文档github链接官方文档简单示例package mainimport ( sentinel "github.com/alibaba/sentinel-golang/api" "github.com/alibaba/sentinel-golang/core/base" "github.com/alibaba/sentinel-golang/core/flow" "log")func main() { if err := sentinel.InitDefault();err

2022-02-12 20:06:33 1518

原创 幂等性问题与解决

什么是幂等性如果一个接口满足:同样的请求数据,提交多次,造成接口的调用多次,和调用一次的结果相同就说这个接口实现了幂等性考虑幂等性的情况重试机制 (如rpc的重试机制)post请求,比较常简如新建用户,put请求,不一定要实现幂等性a. 改商品价格到200,发送多次仍然是一样,不需要考虑,(put多是这种情况)b.购物车中的商品增加商品数量,需要考虑幂等性get 和 delete不需要考虑如何解决设置唯一索引:如注册请求的手机号,或邮箱,或用户名设置辅助日志表,下次请求来了

2022-01-25 15:07:19 284

原创 cron定时任务

文章目录语法语法Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month DayofWeek Year 或Seconds Minutes Hours DayofMonth Month DayofWeek每一个域可出现的字符如下:代码Seconds:可出现,- * / 四个字符,有效范围为0-59的整数Minutes:可出现,- * / 四个字符,有

2022-01-23 15:10:32 658

原创 带过期机制的map

实现带过期机制的map,类似redis的setex命令实现:package mainimport ( "fmt" "sync" "time")var m sync.Mapvar timeMap sync.Mapfunc set(key string,val interface{},exp time.Duration) { expT := time.Now().Add(exp) m.Store(key,val) timeMap.Store(key,&expT) tim

2022-01-17 17:03:16 999

原创 go实现简单的chan

借助sync.Cond可以轻松实现chan,以下代码由本人编写,并非go系统库的实现package mainimport ( "fmt" "strconv" "sync" "time")type Queue struct { queue []string cond1 *sync.Cond cond2 *sync.Cond size int}func NewQueue(size int) *Queue { var mux sync.Mutex return &Q

2022-01-15 17:14:32 446

原创 kubernetes容器编排-helm

helm是什么Helm是Kubernetes包管理器,是查找、分享和使用软件构建 Kubernetes 的最优方式。官网安装安装流程安装包网址这里选择v3.5.4的如下版本下载使用添加Helm chart仓库helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo add stable http://mirror.azure.cn/kubernetes/charts/查看已添加仓库:helm repo list

2022-01-02 17:44:36 396

原创 go的http包

go的原生http包非常强大,虽然有比如gin这样的web框架,但是功能不是非常完美,http包还是非常值得学习两种方式注册回调package mainimport ( "fmt" "net/http")func handle(writer http.ResponseWriter, request *http.Request) { fmt.Fprintln(writer, "函数回调")}type Handle struct {}func (h *Handle) ServeHT

2021-12-27 03:07:34 1093

原创 gormV2笔记

去年八月份,gorm 已经升级成V2版了,做下记录批量插入要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}db.Create(&users)for _, user := range us

2021-12-17 00:00:36 1854

原创 go配置读取之viper库

viper是用来读取的配置的库,viper可以从环境变量,yaml文件,json文件,命令行等读取配置,存到自己的key,value中话不多说,看示例go get github.com/spf13/viper设置默认值func InitConfig() { v := viper.New() v.SetDefault("ContentDir", "content") fmt.Println(v.GetString("ContentDir"))}读取环境变量func main() {

2021-12-11 20:42:33 738

原创 context的作用

文章目录1.context如何设置key,value2.如何控制另一个协程的退出3.如何使用context控制协程的超时发现一些知识,老是忘,但是又要用到,一度很沮丧,没办法,卷起来吧,强迫自己学。突然想到,用提问的方式记忆知识,是不是比陈述更好呢?context的作用,主要在协程之间传递上下文信息,如取消信号超时信号截止时间信号key-value这个很多人很多人觉得难以理解,其实把context就是一个系统定义的结构体类型,可以存储key-value等,目的是能够将本协程的变量传给下一个协

2021-11-25 02:01:21 1027

原创 面向对象的思考

面向对象是哪来的?第一阶段 :方法和属性封装。面向对象是从面向过程发展来的,我们面向过程编写程序的时候,函数和属性是分开写的,这时候,参数的复用性较差,把属性和函数写在一起,属性不就可以复用了第二阶段:方法和属性怎么封装和对象分层。这时候我们又发现了新的问题,一个对象(定义为低层对象)都在被另一个对象(定义为高层对象)使用。假定使用流程是,低层对象传入高层对象,高层对象处理低层对象,并且对低层对象的处理函数由高层对象实现。这样做有一个缺点,因为对低层对象的处理方式随着版本更新在不断变化,这时候就要不断修

2021-11-21 15:52:57 470

原创 kubernetes调度原理

ResourceQuota 资源配额对某个命名空间的资源做限制,如cpu,内存总和的限制,pod个数的限制这种情况下,除非用LimitRange指定CPU和内存范围,否则pod内必须指定limit和requestLimitRange 单个pod资源限制声明对单个pod的CPU和内存限制,如果指定CPU和内存范围,pod内可以不指定limit和request# LimitRange for Pod or ContainerapiVersion: v1kind: LimitRangemetada

2021-11-17 00:51:41 330

原创 kubernetes容器编排-存储(配置管理和卷挂载)

volume挂载分类配置Secret官方文档secret命令创建有三种类型:docker-registry(私有仓库拉镜像的密钥配置),generic(一般配置,base64编码),tls(htts证书配置)细分类型:docker-registry 示例请查看,使用密钥拉取私有仓库部分genericvalue为普通字符串命令: kubectl create secret generic mysecret --from-literal=username=xxxx --from-lit

2021-11-14 02:20:01 1506

原创 kubernetes容器编排-服务

文章目录Servicek8s网络架构:⭐⭐⭐⭐⭐clusterIP示例:NodePort示例:Servicek8s网络架构:⭐⭐⭐⭐⭐共有四种不同IP的port,根据实际情况,通过设置端口的映射,设置不同的访问权限clusterIP示例:apiVersion: v1kind: Servicemetadata: name: canary-test namespace: defaultspec: selector: app: canary-nginx clusterIP

2021-11-09 22:47:44 1112

原创 vscode和vim插件快捷键冲突

解决办法:在文件中设置vim键位禁用

2021-11-06 15:33:33 3045 5

原创 kubernetes容器编排-命令及工作负载

ssdfsdfdsf

2021-11-03 14:58:30 534

原创 golang之线程安全

阅读本文前需要对并发机制有了解只要是多线程,操作全局变量,就会有线程安全的问题,跟语言无关,同样,go也有互斥锁,读写锁这些看一个线程不安全的例子:package mainimport ( "fmt" "sync" "time")var n = 0func main() { for j := 0;j<10;j++ { go func() { for i := 0;i<10000;i++ { n++ } }() } for { time

2021-10-25 17:52:10 4678

原创 golang之消息队列rabbitmq

之前我写过一篇关于rocketmq的文章,因为rabbitmq的使用更广泛,所以写一篇关于rabbitmq,及go如何操作rabbitmq的笔记。消息队列的作用:异步,将同步的消息变为异步解耦,将单体服务拆分多个微服务,实现了分布式部署,单个服务的修改、增加或删除,不影响其他服务,不需要全部服务关闭重启抗压,由于是异步,解耦的,高并发请求到来时,我们不直接发送给服务,而是发给MQ,让服务决定什么时候接收消息,提供服务,这样就缓解了服务的压力图示:用户注册后发邮件和虚拟币:异步解耦图:抗压

2021-10-19 21:07:24 5863

原创 golang之JWT与session

由于目前JWT在验证权限方面是主流,因此重点介绍JWTsession和JWT是干啥的?由于http连接是无状态的,用户登录后,请求结束,立刻断开连接,登录状态并不会保留,用户想要进行操作,服务器就必须对用户进行权限验证,session和JWT的本质,都是服务器在收到用户登录请求的时候,颁发给客户端一个token(令牌)(其实就是一个字符串而已),这个令牌一定和userID有一一对应的关系,客户端下次发请求的时候,携带这个令牌,服务端通过对令牌进行验证,可以知道发请求的到底是哪一个用户。session通

2021-10-09 11:25:41 450

原创 golang之单元测试与压力测试

golang系统包就继承了单元测试这里演示表格驱动的方式,进行单元测试示例:待测试函数package testfunc Add(a, b int) int { return a + b}单元测试相关代码是可以自动生成的,选中测试代码,点击图示同目录生成 add_test.go文件,内有表格驱动测试模板,看代码即可:需要说明的几点:Testmain是可选函数,如果写上就是测试的入口,m.Run()进行测试的运行,并返回状态码,0代表成功,其他都为失败package test

2021-10-07 11:31:48 563

原创 golang远程操作docker

本文讲述golang远程操作docker的方法,用到的库go get github.com/docker/docker/client由于本机内存不够,不得已只能远程连接docker先找到要修改的文件位置:locate docker.service修改部分如下ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H unix:///var/run/docker.sock -H tcp://0.0.0.0:端口上代码:开启一个mongo容器,并在100s后删除的示例

2021-10-06 11:11:15 1266

原创 protobuf与grpc

protobuf是一种编解码协议,支持多种语言,比如go,python,c++,java,javascript等,效率比json更高,但是没有json那么易于理解。安装编译工具:截至到发文时间已更新至v3.18.0,下载位置:github链接然后将压缩包解压,再将bin目录设置到$PATH环境变量下即可插件此时还不支持golang,去grp-gateway按照提示安装:proto文件格式(经常变动,以github为准)syntax = "proto3";package coolcar;o

2021-09-29 01:35:30 688

原创 golang并发模式

文章目录生成器想要同时处理多个服务,可以将连个chan的服务同时发给第三个chan,同时等待多个服务并发模式,并不是设计模式,而是编写多go程和使用chan的通用套路:生成器生成器不停的产生服务/任务,返回一个服务句柄,用于跟服务交互//不停的产生任务/服务,返回一个任务/服务句柄,用于跟服务交互func msgGenerator() chan string { c := make(chan string) go func() { i := 0 for { time.Sleep(

2021-09-12 19:26:51 141

原创 golang随机数

如下生成0000-9999的随机数字 rand.Seed(time.Now().UnixNano()) //播种随机数种子 smsCode := fmt.Sprintf("%04d", rand.Int31n(10000))

2021-09-12 17:48:29 308

原创 golang系统接口

系统接口:type Stringer interface { String() string}例子:import "fmt"type Test struct { m int}func (t *Test) String() string { return "kshf"}func main() { t := &Test{} //会打印t.String() fmt.Println(t)}另外连个很重要的io接口type Reader interface {

2021-09-10 00:43:53 69

原创 golang之常量与枚举

golang的常量是一种非常特殊的类型,与其他语言区别挺大,在定义的时候不需要指定类型,如下:在使用时,num可以赋值给float等类型const ( s = "abc" num = 2)func main() { var a float = num fmt.Println(a) fmt.Printf("%T,%T",s,num)}在常量之后加入iota,成为自增常量,iota是一个与常量位置相等的值,并且是可以参与运算的,例子const ( s = 2 p num = io

2021-09-09 02:11:49 2181

原创 golang之websocket

websocket是啥websocket是socket连接和http协议的结合体,可以实现网页和服务端的长连接通信流程

2021-09-07 22:49:26 1554

原创 golang切片与数组

golang的切片是一个动态数组,也就是相当于C++中的vector,当然,切片类型变量就是一个指针变量具体操作:数组拷贝,注意数组的长度必须相同arr := [10]int{1,3,2,1,1,1,1}arr2 = arr //拷贝将数组转换成切片(其实就是切片指针指向了数组,非拷贝):此时改变切片元素内容,数组内容也会改变,注意:当切片arr2增加新元素后,会开辟新的空间,就和原数组没关系了 arr := [10]int{1,3,2,1,1,1,1} arr2 := arr[m:n]

2021-09-06 23:17:19 682

空空如也

空空如也

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

TA关注的人

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