自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ServiceMesh(一)简介&linkerd和istio初探

ServiceMesh(一)简介&linkerd和istio初探文章目录ServiceMesh(一)简介&linkerd和istio初探一. 服务通信方式演变二. 什么是ServiceMesh三. Mesh解决了什么问题四. Mesh架构&实现Linkerd架构实践注入原理1.注入本质2.手动注入3.自动注入4.注入原理Istio架构实践注入原理1.注入的本质2.手动istio注入3.自动Istio注入4.原理一. 服务通信方式演变参考Phil Calcada大佬的文章《Pat

2022-01-09 05:10:09 771

原创 service如何实现服务发现和负载均衡

service如何实现服务发现文章目录service如何实现服务发现Service的类型1.ClusterIP2.NodePort3.LoadBalancerService服务发现每一个kubernetes中的service都是一组pod的逻辑集合和访问方式的抽象,也可以把service集合的一组pod称为一个微服务集群内外各个服务可以通过service进行互相通信,当创建一个service对象时也会对应创建一个endpoint对象,endpoint是用来做容器发现,service只是将多个相同l

2021-12-11 02:34:07 939

原创 k8s架构

k8s架构文章目录k8s架构架构1.master节点2.worker节点3.创建流程创建一个容器实例架构1.master节点APIServer:集群和外界交互的接口ETCD:所有的状态都存储在ectd里,一般来说都是集群化部署的,可以和master在一起也可以自己单独出来ControllerManager:有多个Controller,每个Controller通过API Server提供的接口实时监控整个集群的每个资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将系统状态修复到

2021-12-11 02:33:36 2032

原创 Linux安装K8s

Linux安装K8s文章目录Linux安装K8s下载k8e发行版本 Releases · xiaods/k8e (github.com)上传到devcloudrz -bye解压缩tar -zxvf k8e-1.19.14-k8e2.tar.gz 编译make generateSKIP_VALIDATE=true make执行SKIP_VALIDATE=true make可能会遇到这个问题:Docker Hub限频计划https://www.docker.com/in

2021-12-11 02:32:56 1035

原创 Redis和MySQL的双写一致性

Redis和MySQL的双写一致性文章目录Redis和MySQL的双写一致性一致性双写三种方案保证数据库与缓存的一致性缓存延时双删一致性一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的强一致性:写入数据后,立马能读到最新的数据弱一致性:写入成功后,不承诺能立马读到最新的值,也不承诺多久后才能读到最新的值,但是数据在一定时间后能达到一致的状态双写操作缓存采用删除缓存而不是更新缓存:如果缓存的值需要经过复杂计算得到,那么更新缓存频率高的话,会消耗一定的性能在

2021-11-29 09:51:48 2777

原创 Go container包

Go container包文章目录Go container包简介list数据结构ring数据结构heap数据结构简介Container — 容器数据类型:该包实现了三个复杂的数据结构:堆、链表、环List:Go中对链表的实现,其中List:双向链表,Element:链表中的元素Ring:实现的是一个循环链表,也就是我们俗称的环Heap:Go中对堆的实现list简单实用:func main() { // 初始化双向链表 l := list.New() // 链表头插入 l.

2021-11-28 15:28:19 415

原创 Go参数校验Validator

Go参数校验Validator文章目录Go参数校验Validator实践校验标签字符串约束自定义校验器开发接口的时候需要多前端提交的参数进行参数校验,如果提交的参数只有一个两个,这样我们可以简单写个if判断,但是如果提交的参数比较多,通过if判断就比较繁琐了,在Go中有一个validator包可以通过反射结构体struct的tag进行参数校验实践go get github.com/go-playground/validator/v10定义结体:type UserInfo struct {

2021-11-19 23:15:43 3678

原创 service mesh(一)架构发展历史

service mesh(一)架构发展历史文章目录service mesh(一)架构发展历史数据面和控制面service mesh架构演变istiosidecar模式流量治理熔断限流数据面和控制面图中proxy节点是service mesh的数据面,是一个单独的进程,和运行着业务逻辑的service进程部署在同一台机器或者节点上,proxy节点代理流经service进程的所有流量,如执行服务发现,限流,流量治理策略都是通过这个数据面完成的图中control plane是service mesh的控

2021-10-10 00:47:04 369

原创 Go map

Go map文章目录Go map基础原理底层数据结构扩容规则初始化基础import ( "fmt" "testing")// 声明mapvar m = map[string]interface{}{}// 初始化func TestInitUseMap(t *testing.T) { // 使用make来进行初始化 m = make(map[string]interface{}) // 增加 m["key1"] = "v1" // 查询 v,ok := m["key1"]

2021-10-07 14:15:38 165

原创 接口签名校验设计

接口签名校验设计文章目录接口签名校验设计Why-为什么需要签名校验How-如何做签名校验签名校验JWT token生成整体设计Why-为什么需要签名校验API签名即对API接口的调用进行签名保护,在进行API调用的时候,加多了一个签名校验的过程,通过签名校验,才能进行接口的调用,这个签名可以理解为一个合法的调用凭证一个签名需要做什么:明确调用者是谁,即签名中需要带上需要带上用户标识(可以是用户UID,可以是openID等等)明确调用者想干什么,可以日志记录签名校验失败的调用者信息和其调用接口

2021-09-22 23:29:00 1152

原创 K8s-Service

K8s-Service文章目录K8s-Service什么是serviceservice类型ClusterIPNodePortLoadBalancer什么是service每个Pod都会分配一个单独的IP,然而却存在两个缺陷:Pod IP会随着Pod的重建而变化Pod IP仅仅是集群内可见的虚拟IP,集群外无法访问这样两个缺点对于访问这个服务带来了难度,因此,k8s设计了service来解决这个问题k8s中的service类似Nginx的反向代理,将外部请求代理到内部的pod,屏蔽了外部请求直

2021-09-18 02:20:07 162

原创 K8s-configMap

K8s-configMap文章目录K8s-configMap实践configmap是k8s中的统一配置重心实践编写yaml:apiVersion: v1kind: ConfigMapmetadata: name: myapp-configdata: # 在此下定义config,k-v配置 Test-key1: test-value Test-key2: kevinkrcai 发布configMapkubectl apply -f nginx-config.yaml

2021-09-18 02:19:16 183

原创 K8s-Pod

K8s-Pod文章目录K8s-Pod基础结构网络存储实践DeploymentPod是一组容器(一个或者多个),是k8s中的最小调度单位,可以把Pod理解为传统的虚拟机,Pod中的容器就是虚拟机中运行的进程,k8s无法直接操作和调度容器,只能通过编排Pod来调度容器,Pod为其中运行的容器提供共享的网络,存储和命名空间基础结构网络Pod中的容器共享Pod的网络资源:一个Pod只有一个IP地址,Pod中的容器共享该Pod的IP地址和端口Pod中容器间的通信:通过共享卷通信使用主机中

2021-09-09 00:14:17 180

原创 Go设计模式-策略模式

策略模式文章目录策略模式引用《大话设计模式》书中对于策略模式的解析,策略模式就是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是互相的实现不一样,他可以以相同的方式调用所有的算法。策略模式的结构:封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略进行直接调用抽象策略:通常是一个抽象接口具体策略:接口实现类目录结构:.├── go.mod├── login_test.go├── main.go├── mycontext│ &n

2021-08-08 23:37:58 233

原创 Go设计模式-模版方法模式

模版方法模式文章目录模版方法模式模版方法模式意在定义一个操作中的算法框架,将公共的操作抽象出来放在抽象接口中定义出一套抽象框架,而不同的操作实现则延迟到子类去实现例如做饭这一个操作中可能有多个子操作:开煤气开火做饭关火关煤气其中除了做饭不同其他都是相同的,那么相同的就可以放在抽象类中实现,不同的则延迟到子类实现代码目录结构:.├── Impl│   └── KevinCookie.go├── abstractImpl│   └── a

2021-08-08 23:36:50 207

原创 Go module

Go module文章目录Go module简介使用简介Go的包管理方式是逐渐演进的,一开始所有的包都是放在GoPath下的GoPath不区分项目,任何import的路径都是葱花Gopath为根目录开始的如果存在多个项目并且不同项目对于同一个依赖库的版本需求不一样时,无法在同一个GOPATH下放置不同版本的依赖项Go Module是语义化版本管理的依赖项的包管理工具,解决了GoPath存在的缺陷,是Go官方的版本管理工具使用首先,创建一个新的工程package awesomeProj

2021-08-08 23:36:03 151

原创 初识Lumen框架

Lumen框架文章目录Lumen框架安装配置路由基本路由中间件控制器依赖注入日志Lumen 是一个由 Laravel 组件搭建而成的微框架,由 Laravel 官方维护。Lumen 为速度而生,是当前最快的 PHP 框架之一安装先安装依赖管理工具Composer下载链接:https://getcomposer.org/Composer-Setup.exe通过 Lumen 安装器composer global require "laravel/lumen-installer=~1.0"

2021-06-22 00:35:52 1312

原创 Typora配置图床

Typora配置图床typora是一个很好的markdown编辑器,但是平时使用图片的时候,图片是保存在本地上的,如果图片路径变更了,图片就会显示不出来,可以使用picgo +node.js配合gitee简单搭建一个图床picgo下载完成后安装gitee插件,注意:必须要先安装node.js才能安装插件插件下完后,码云新建仓库作为图床:第三步:获取tokentoken的获取账号-->设置-->私人令牌-->填写描述-->提交选择自己的账号进入设置第四步:配

2021-06-19 16:45:27 664

原创 go http包基本使用

go http包基本使用文章目录go http包基本使用1.基本请求方法1.1 get和post请求1.2 put和delete方法1.3 带参数和请求头的请求1.4 获取响应信息1.5 文件下载1.6 cookie1.基本请求方法1.1 get和post请求http包中已经封装好了get和post请求,直接传入要请求的url即可func TestHttpRequest(t *testing.T) { Get() Post()}func Get() { // http包中提供了Htt

2021-06-13 02:58:59 754

原创 golang类型转换问题

golang类型转换问题文章目录golang类型转换问题强制类型转换类型断言强制类型转换golang是强类型语言,但是和c++,Java不太一样的是,go中没有隐式类型转换,go中的类型转换只有:强制类型转换和断言在java中: public static void main(String[] args){ int a = 1; double b = 1.0; System.out.println(a * b); }在java中这样

2021-06-12 02:03:59 1325 1

原创 Go modules

文章目录Go modules使用流程Go modules言简意赅,go-modules就是一个包管理工具,是用来解决我们通过 go get 下载第三方类库到go path后的第三方类库版本管理的问题使用流程首先,新建项目目录并且初始化模块mkdir demo1 && cd demo1go mod init demo第一个指令:go mod init 模块名执行后,会生成一个go.mod文件:module demo1go 1.16一开始的时候内容比较少,只有模块

2021-05-09 15:17:07 140 1

原创 Go-web(三)Gin参数校验&cookie&session

文章目录Go-web(三)Gin参数校验标签校验自定义校验cookiesessionGo-web(三)Gin参数校验标签校验gin中对于参数校验提供了非常方便的标签校验,即在定义接收结构体时即可通过添加标签进行校验// 参数校验通过绑定tag实现type ValiadStruct struct { // required:非空校验 Name string `form:"name" json:"name" binding:"required"` // min,max最大最小值校验 Age i

2021-05-08 16:02:27 953

原创 Go-web(二)异步请求

文章目录Go-web(二)异步请求异步请求重定向中间件Logger()Recovery()Go-web(二)异步请求异步请求goroutine机制可以方便地实现异步处理,另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本。 // 异步处理请求 r.GET("/async", func(context *gin.Context) { // copy请求 copyContext := context.Copy() go func() { time.Sle

2021-05-08 00:31:57 1596 1

原创 Go-web(一)Gin路由和请求

文章目录Go-web(一)Gin框架简介hello worldGin基础1.路由a.路由b.路由组c.路由拆分和注册2. 请求参数Geta.url参数b.restful参数Posta.表单参数b.body参数Go-web(一)Gin框架简介Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点安装:go get -u github.com/gin-gonic/gin我在安装过程中,有以下的包没有成功安装,采用了手动下载然后放到gopath下

2021-05-05 01:00:53 842

原创 Go匿名函数和闭包

文章目录Go匿名函数和闭包闭包的定义和实现延迟调用和闭包闭包的实现Go匿名函数和闭包闭包的定义和实现如何定义闭包?闭包是引用了自由变量的函数,这个自由变量将和这个函数一同存在,即使离开了创造他的环境,闭包是由函数及其相关引用环境组成的实体,可以理解为一个函数“捕获”了和它处于同一作用域的其他变量。“捕获”的本质就是引用传递而非值传递。简单的闭包就是在函数中返回匿名函数type MyFunc func() int// 简单的闭包:在函数中返回匿名函数func Test() MyFunc{

2021-05-02 01:07:26 209 1

原创 Go defer关键字

文章目录Go defer关键字Go defer关键字Go语言的defer会在当前函数返回前执行传入的函数,经常用于关闭文件描述符,关闭数据库连接等资源回收工作。Go中defer主要有两个问题:defer调用时机和调用顺序defer调用函数使用传值方式传递参数会进行预运算,计算结果会发生改变,最终进行计算的参数是运行时的结果关于调用时机和调用顺序func main() { fmt.Println("开始执行main函数") for i := 0;i < 5;i++{ defe

2021-05-02 01:07:01 151 1

原创 Go接口

文章目录Go接口Go接口接口的本质是引入一个中间层,上层的调用方不再需要依赖下层的具体模块,只需要依赖一个定义好的接口Go中的接口是一种内置类型,定义了一组方法的集合在Java中我们在接口中可以定义变量,也可以定义方法签名public interface MyInterface { public String hello = "Hello"; public void sayHello();}通过implements 关键字显示的实现接口public class MyInte

2021-05-01 23:42:27 176 1

原创 TCP连接管理

文章目录一,建立连接1.TCP 连接建立过程中要解决的三个问题2.建立连接握手过程3.释放连接为什么需要等待2MSL?4.连接-释放TCP是面向连接的协议,运输连接时用来传输TCP报文的运输连接:建立连接数据传输连接释放一,建立连接1.TCP 连接建立过程中要解决的三个问题(1) 要使每一方能够确知对方的存在。(2) 要允许双方协商一些参数(如最大窗口值、是...

2021-05-01 23:40:59 147

原创 TCP流量控制和拥塞控制

文章目录一,流量控制1.什么是流量控制?2.实现滑动窗口机制死锁现象解决方法TCP报文段发送时机Nagle算法接收方糊涂窗口综合征二,拥塞控制1.什么是拥塞?2.什么是拥塞控制?3.检测网络拥塞的指标4.TCP拥塞控制算法控制拥塞窗口原则拥塞判断拥塞窗口控制算法1.慢开始2.拥塞避免算法3.快重传4.快恢复TCP拥塞控制流程图主动队列管理(AQM)1.什么是主动队列管理2.随机早期检测 RED一...

2021-05-01 23:40:45 218

原创 Go并发编程(八)go定时器

文章目录Go并发编程(八)go定时器标准定时器timer循环定时器TickGo并发编程(八)go定时器Go的标准包time里提供了两种定时器,一种是标准定时器,另一种是循环定时器。标准定时器timertimer在到达指定时间时仅仅触发一次,当timer到期时会将当前时间发送到自己的C管道,timer实例必须通过NewTimer或AfterFunc timer := time.NewTimer(time.Second * 3)延迟执行:第一种实现time.sleep(3 * time.Sec

2021-05-01 23:39:12 403

原创 Go并发编程(七)go爬虫小案例

文章目录Go并发编程(七)go爬虫小案例系统流程图文件下载ioutil 简单使用爬虫获取图片链接完整代码Go并发编程(七)go爬虫小案例系统流程图文件下载// 图片下载func DownloadImg() { index := 0 for url := range chanImageString{ ok := DownFile(url,"file_" + strconv.Itoa(index)) if ok{ fmt.Println("下载成功:",url) }else{

2021-05-01 23:38:33 270

原创 Go并发编程(六)atomic包

文章目录Go并发编程(六)atomic包使用CASswap原理Go并发编程(六)atomic包代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。使用func TestMyAtomic() { // 写入 var a int64 atomic.StoreInt64(&a,10)

2021-05-01 23:38:02 264

原创 Go并发编程(五)同步锁Mutex&读写锁RWMutex

文章目录Go并发编程(五)同步锁Mutex&读写锁RWMutexMutex使用原理RWMutex使用原理Go并发编程(五)同步锁Mutex&读写锁RWMutexMutex使用Mutex是go中实现的同步锁,保证了同一时间只有一个goroutine执行func TestLock(mutex *sync.Mutex) { fmt.Println("主协程 start") time.Sleep(2 * time.Second) for i := 0;i < 10;i++{

2021-05-01 23:37:31 244

原创 Go并发编程(三)context&waitgroup

文章目录Go并发编程(三)context&waitgroup使用ContextWaitGroupContext使用场景请求链路传值主动和超时取消请求Go并发编程(三)context&waitgroup控制并发的方式有两种:使用WaitGroup通过WaitGroup等待所有goroutine执行完在执行别的事使用ContextWaitGroupwaitGroup会等待所有的goroutine执行完后在执行其他的事import ( "fmt" "sync"

2021-05-01 23:37:00 286

原创 Go并发编程(三)协程池

文章目录Go并发编程(三)协程池为什么需要协程池实现数据结构定义新增任务&执行任务goroutine异常处理关闭协程池使用Go并发编程(三)协程池本文参考如下博客实现了一个简易的协程池100 行写一个 go 的协程池 (任务池)为什么需要协程池goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine实现实现的基本思路是采用生产者-消费者模型,用来执行任务的goroutine

2021-05-01 23:36:29 556

原创 Go并发编程(二)Channel

文章目录Go并发编程(二)Channelchannel通信机制使用实现原理Go并发编程(二)Channelchannel通信机制在go中推荐使用基于消息的并发通信,而不是通过共享内存,通过channel机制,实现goroutine相互通信channel是进程内的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。使用通过channel机制,实现goroutine相互通信,管道是类型相关的,即一个管道只能传递一种类型的值。管道中的数据是先进先出的。func

2021-05-01 23:35:58 161

原创 Go并发编程(一)Goroutine

文章目录Go并发编程(一)Goroutine进程&线程&协程Go调度模型goroutine GMP调度模型整体调度流程基本使用Go并发编程(一)Goroutine进程&线程&协程进程进程是程序和数据的一次动态执行的过程,是CPU资源的分配的基本的单位,进程的局限是进程的创建,撤销和切换的开销较大线程线程是进程之后发展出来的概念,也叫轻量级进程,是CPU调度的最小单位,线程需要共享同进程内的进程资源,创建,撤销和切换的代价小于进程协程协程是一种用户态的轻量级线程

2021-04-30 02:23:17 242 1

原创 Go-Redis(二)gopkg-redis基本操作

文章目录Go-Redis(二)gopkg-redis基本操作基本使用连接redis数据结构操作stringlistset和hashGo-Redis(二)gopkg-redis基本操作gopkg-redis也是一个操作redis的go客户端安装go get gopkg.in/redis.v5基本使用不得不说,go比Java简洁多了连接redis// 连接redisfunc ConnectToRedis() *redis.Client{ client := redis.NewClient(

2021-04-30 02:22:39 572

原创 Go-Redis(一)redigo基本操作

文章目录Go-Redis(一)redigo基本操作基本使用连接redis数据结构操作stringlist完整代码总结Go-Redis(一)redigo基本操作redis是目前流行的高性能key/value缓存,基本上在各种项目都经常出现,在go中使用的是go-redis/redis包操作redis。基本使用安装go get github.com/garyburd/redigo/redis连接redis指定下redis的连接地址和密码即可// 连接redisfunc ConnectRedi

2021-04-30 02:22:06 5521

原创 Go-MySQL(四)XORM

文章目录Go-MySQL(四)XORMXORM介绍使用创建orm引擎定义数据模型数据更新数据查询事务操作完整代码Go-MySQL(四)XORMXORM介绍xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求,XORM同时支持原始SQL和ORM操作安装:go get xorm.io/xorm使用创建orm引擎所有操作均需要事先创建并且配置ORM

2021-04-30 02:21:36 1730

go语言源码包

方便那些不能下的朋友们,这是go的包,本人官网下载

2019-05-03

空空如也

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

TA关注的人

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