golang
文章平均质量分 57
wanmei002
跟随自己的兴趣走吧
展开
-
http2、grpc 的反向代理的实现
grpc 使用的是 http2, 如果要代理 grpc 请求,就需要开启 tls, tls 的生成请参考我以前的博客。看看使用的是不是 http2.Transport, 还有是不是启用的是 https 服务。采用golang 的自带的代理。transport 采用。原创 2024-10-10 17:48:55 · 411 阅读 · 0 评论 -
grpc代理服务的实现(三)
golang grpc 代理服务的实现原创 2024-06-14 11:17:33 · 411 阅读 · 0 评论 -
grpc代理服务的实现(二)
golang grpc 代理服务的实现原创 2024-06-14 11:14:18 · 219 阅读 · 0 评论 -
grpc代理服务的实现(一)
golang grpc 代理服务器的实现原创 2024-06-14 11:08:45 · 591 阅读 · 0 评论 -
golang 参数校验方法设计
设计规则,对参数自动化校验,不用再 对参数每一个都拿出来比较了原创 2021-10-14 16:35:57 · 545 阅读 · 1 评论 -
go-zero 3—客户端负载均衡算法及实现
本篇文章已经被 go-zero 团队的 微服务实践 公众号收录;go-zero 客户端负载均衡主要用了 P2C 和 EWMA算法P2Cp2c(pick of 2 choices)随机从众多数据中选择两个EWMAEWMA(exponentially weighted averages)指数移动加权平均,体现的是一段时间内的平均值(可以调节参数,使算法更灵活)原创 2021-08-04 20:17:29 · 1456 阅读 · 0 评论 -
go-zero 2—并发处理数据包 mr(mapReduce) 的原理讲解
自己实现的代码地址https://github.com/wanmei002/goutil/blob/master/mr/mapreduce.go如果觉的自己golang 功底不强的话,可以先看我的实现代码:汉字注释,省略了一些go-zero的相互依赖,没有像go-zero兼容那么多的需求,相对简单原理这里用到了一个概念mapReduce, 那什么是 mapReduce 呢?这里简单的说下我的理解:mapReduce 是一种分布式处理数据并合并数据的概念,如果你想并发处理大量数据,你需要把很多数原创 2021-07-30 19:07:02 · 2652 阅读 · 0 评论 -
gRPC-11 etcd实现服务注册和服务发现
原理1. 首先为服务起一个名字,启动的时候,把信息存储到`etcd`中 1.1 比如: key是服务名 值是ip。 多个相同的服务让key的前缀一样,这样 读取etcd的时候就可以通过前缀来读取 1.2 生成租约,并设置比较短的过期时间,把 etcd 中存储的值跟租约绑定,这样租约如果没有在有效的时间内续期(很可能已经不能提供服务了),则 etcd 保存的值就会过期 1.3 定期更新租约的过期时间2. 客户端注册相关服务的解析器,在解析器中拼接 etcd的key的前缀,获取提供服务的i原创 2021-06-07 15:42:26 · 990 阅读 · 0 评论 -
gRPC-10 客户端负载均衡
代码地址https://github.com/wanmei002/grpc-learn/tree/master/ch09介绍我工作中,请求一个接口,会先从去负载均衡器中获取一个ip,然后直接拿着ip去访问接口,在这里呢我们相当于把负载均衡器集成到客户端服务中,客户端发起请求的时候,会获得一个ip列表,根据特定的算法,选取一个IP, 向服务端发起请求逻辑...原创 2021-06-07 14:55:34 · 460 阅读 · 0 评论 -
gRPC-09 传递header信息/元数据 [golang版]
gRPC 一元模式和流模式 header头信息的写入和读取原创 2021-06-01 18:25:23 · 3646 阅读 · 0 评论 -
kafka消费组代码的实现[golang版]
传统的消费模型消息队列的消息被消费了,数据则从队列里删除,并且下游的多个 consumer 都要抢这条消息。发布/订阅模型允许消息被多个 consumer 消费,但是订阅者必须订阅所有分区kafka为规避上面的缺点,引入了 消费组 模型。kafka消费组 模型以下是自己的理解:比如订阅了两个主题,每个主题的分区是2,则消费组启动 4 个消费实例,每个消费实例对应一个分区,这样避免了 消费实例的竞争。同时也避免了发布/订阅模型 消费实例必须订阅所有分区的问题。上代码import (原创 2021-05-31 18:45:46 · 5725 阅读 · 6 评论 -
gRPC-08传递取消操作 [golang版]
代码地址超时取消https://github.com/wanmei002/grpc-learn/tree/master/ch06单方面取消https://github.com/wanmei002/grpc-learn/tree/master/ch07简单介绍取消请求又分超时取消请求 和 单方面的主动取消。取消主要是用 context.Context[golang版] 来远程传递取消操作。可以用grpc 的 status.Code() 来获取错误码,不同的错误码对应不同的错误。完整的错误码列表可原创 2021-05-31 14:19:25 · 768 阅读 · 2 评论 -
gRPC-07 客户端拦截器的实现
代码地址https://github.com/wanmei002/grpc-learn/tree/master/ch05介绍客户端拦截器主要是 内置客户端发送数据前和接收数据后的一些通用逻辑的实现。下图单词拼错了;拦截器: interceptor直接上代码吧一元拦截器拦截 grpc 的一元模式需要实现 grpc/interceptor.go/type UnaryClientInterceptor func(ctx context.Context, method string, req, r原创 2021-05-30 19:41:21 · 277 阅读 · 0 评论 -
gRPC-06 服务端拦截器的实现
代码地址https://github.com/wanmei002/grpc-learn/tree/master/ch05拦截器简述在远程方法执行之前或执行之后都需要做一些通用逻辑。gRPC有拦截器相关逻辑(相当于 gin 框架的 Use)。或做一些日志、身份验证、性能等需求,可以在拦截器里实现。服务端拦截器一元拦截器一元拦截器需要实现 grpc.interceptor.type UnaryServerInterceptor func(ctx context.Context, req interf原创 2021-05-25 15:00:49 · 249 阅读 · 0 评论 -
gRPC-05 双端流的实现
代码地址https://github.com/wanmei002/grpc-learn/tree/master/ch04双端流的描述客户端可以在建立的连接上间歇性发送数据;服务端接收数据,可选择性的发送响应数据给客户端,就像聊天室功能一样。proto service 声明service Product { rpc AddProduct(stream Order) returns (stream Ret);}message Order { string name = 1;原创 2021-05-20 17:40:18 · 258 阅读 · 0 评论 -
gRPC-04 客户端流的实现
代码地址https://github.com/wanmei002/grpc-learn/tree/master/ch03客户端流的描述原创 2021-05-19 16:26:49 · 201 阅读 · 2 评论 -
gRPC-03 gRPC服务端流的实现
gRPC 服务端流的实现和客户端接收流的实现原创 2021-05-18 15:11:11 · 532 阅读 · 0 评论 -
gRPC-02 gRPC底层原理简单解析
gRPC底层原理简单解析原创 2021-05-17 19:30:31 · 1762 阅读 · 0 评论 -
go-zero框架threading包—安全运行goroutine
go-zero threading包里面主要两个方法:GoSafe(用协程运行方法)RunSafe(带panic捕捉)先上两个方法开启go协程运行这个函数// GoSafe runs the given fn using another goroutine, recovers if fn panics.func GoSafe(fn func()) { go RunSafe(fn)}增加捕捉panic方法// RunSafe runs the given fn, recov原创 2021-04-22 11:52:55 · 1336 阅读 · 0 评论 -
golang 第四课 结构体(struct)、interface{}、方法(func)详解
精讲了 golang 的方法 结构体(struct),接口(interface{}), 希望能帮助到你原创 2021-04-20 11:58:22 · 2181 阅读 · 0 评论 -
golang strings包的总结
strings 包的学习strings.Index(s, substr string) index返回 substr 在 s 中的位置,是以 ascii 码为单位的,如果有汉字,一个汉字当三个字节如果想把汉字也当成一个长度,可以用以下自己封装的函数func Utf8Index(str1, str2 string) int { i := strings.Index(str1, str2) if i < 0 { return i } buf原创 2021-04-11 20:47:29 · 399 阅读 · 2 评论 -
vscode远程编写golang代码
先远程连接 linux没有远程连接 linux的同学可以参考我的这篇博文vscode远程连接linux服务器先用vscode 连接远程linux服务器开始安装go插件安装 go 插件 ,点击 install in SSH: 服务器上重启vscode, 随便写一个go 程序,vscode 右下角会有下面的弹出框, 点击 Install All安装 所有的 gotools 插件 (可能需要翻墙),如果安装失败 可以试试把我安装编译好的程序放到GOPATH/bin 目录下(或者 PATH 目原创 2020-06-30 10:16:44 · 1965 阅读 · 0 评论 -
优化快速排序-golang版
我们先用图把思想描述下用代码实现package mainimport "fmt"func main(){ arr := [...]int{5,2,7,2,4,8,1,3} quickSort(arr[:], 0, len(arr)-1) fmt.Println(arr)}//思想:// 1. 随机取一个数 找到这个数在列表中的位置(左边的都比它小,右边的都比它大)// 2. 然后把左边、右边的重复 1 步骤func quickSort(sc []int, begin, end原创 2020-06-10 09:09:50 · 238 阅读 · 0 评论 -
总结下golang的time包
time 包时间格式 2016-01-02 15:04:05获取 time 包里 Time 对象获取当前时间 time.Now()获取指定时间 func ParseInLocation(layout, value string, loc *Location)(Time, error)time.ParseInLocation("2006-01-02 15:04:05", "2020-06-06 10:59:59", time.Local)获取时间戳fmt.Println(tim原创 2020-06-07 12:11:13 · 275 阅读 · 0 评论 -
gRPC-01 初入 golang gRPC
gRPC相关工具的下载 和 简单的gRPC server的代码编写和client 代码编写原创 2020-05-21 01:03:21 · 419 阅读 · 0 评论 -
golang gin/httpRouter框架路由中间件use的实现原理
业务层跟非业务层代码混合在一起,会随着项目的逐渐庞大而难以维护。需要在初始设计时要把这些分开。拜读过httpRouter源码后,整理了下路由中间件的理解原创 2020-05-17 14:31:37 · 2158 阅读 · 0 评论 -
自定义 golang protobuf plugin
** 看 Go高级编程 书籍, 照着里面的例子编写自定义 golang 的 protobuf plugin 失败报错 : WARNING: Package "github.com/golang/protobuf/protoc-gen-go/generator" is deprecated. A future release of golang/protobuf will delete this package, which has long been excluded from the compatibil原创 2020-05-13 15:21:32 · 1801 阅读 · 0 评论 -
golang 并发相关的操作
golang 的并发golang 的线程 和 普通的线程普通的线程系统级的线程都会有一个固定大小的栈(一般默认可能是2M),这个栈主要用来保存函数递归调用时参数和局部变量。固定了栈的大小导致了两个问题: 一是对于很多只需要很小的栈空间的线程来说是一个巨大的浪费, 二是对于少数需要巨大栈空间的线程来说又面临栈溢出的风险goroutine 线程一个 goroutine 会以一个很小的栈启动(可能 2KB 或 4KB), 当遇到深度递归导致当前栈空间不足时, goroutine 会根据需原创 2020-05-12 11:49:15 · 121 阅读 · 0 评论 -
重温 golang 的 ListenAndServe
golang 启动 web 服务的方法最原始的方法ListenAndServe(addr string, handler Handler) error { server := &Server{Addr:addr, Handler: handler} return server.ListenAndServe()}上面的方法是最原始的方法,直接写一个地址,就可以启动...原创 2020-04-26 18:17:44 · 3994 阅读 · 0 评论 -
golang的context
Context接口context 基本结构context 是一个基本接口, 所有的 context 对象都要实现该接口, context 的使用者在调用接口中都使用 context 作为参数类型type Context interface { // 如果 context 实现了超时控制, 则该方法返回 超时时间(deadline), ok (true | false) Dea...原创 2020-05-08 10:46:10 · 139 阅读 · 0 评论 -
golang 中的 nil
golang 中的 nil官方文档: 下列 6 大类型家族的零值为 nil, 其它类型值都不可能为 nilpointer 指针类型slice 切片类型map 字典类型channel 数据通道类型function 函数类型interface 接口类型nil 为未确定类型值, 它有很多可能类型, 但是它没有默认类型v := nil // 编译错误p := (*str...原创 2020-05-06 15:39:11 · 202 阅读 · 0 评论 -
切片的高效操作
扩展切片append 在切片开头添加元素, append 的本质是用于追加元素而不是扩展容量, 扩展切片的容量只是 append 的一个副作用 var a = []int{1,2,3} a = append([]int{0}, a...)在开头一般都会导致内存的重新分配,而且会导致已有的元素全部复制 1 次因此,从切片的开头添加元素的性能一般要比从尾部追加元素的性能差很多...原创 2020-04-21 18:49:54 · 198 阅读 · 0 评论 -
看 gin 框架文档自己整理成中文
安装go get -u github.com/gin-gonic/gin有依赖包依次是:github.com/golang/protobufgithub.com/modern-go/concurrentgithub.com/modern-go/reflect2golang.org/x/sysgolang.org/x/text #windows需要hello world ...原创 2020-04-17 11:40:08 · 402 阅读 · 0 评论 -
golang并发版爬虫
代码下载地址原创 2020-04-09 16:38:56 · 153 阅读 · 0 评论 -
锁与原子操作
锁与原子操作先说 golang 的 包(package)golang 提供的服务跟PHP是不同的,golang 的每个服务是一个不停止的进程,一直在内存中运行接收外部的请求进行处理,而 PHP 是外部请求过来 nginx 或 apache 开启一个线程,这个线程通过CGI 加载PHP文件运行PHP程序,等这个请求处理完成,这个线程也就关闭了。那么golang运行就有了下面这个问题。因为...原创 2020-03-24 19:46:50 · 306 阅读 · 0 评论 -
广度迷宫算法-golang
maze.in 文件保存迷宫格,内容如下6 50 1 0 0 00 0 0 1 00 1 0 1 01 1 1 0 00 1 0 0 10 1 0 0 0maze.go 代码实现package mainimport ( "fmt" "os")type point struct { i, j int}func (p point) add(step point...原创 2020-03-10 18:37:57 · 215 阅读 · 0 评论 -
go curl发起步骤
go 发起 curl 请求curl 属于客户端的请求cli := &http.Client{ Timeout:6, // 整个请求周期的时间 Transport: &http.Transport{ ResponseHeaderTimeout: 3, // 等待响应的时间(responseHeader) (响应返回响应头信息) DialCon...原创 2020-01-09 17:10:48 · 1766 阅读 · 0 评论 -
golang TCP/UDP简单入门
net 包里的一些方法ParseIP(string) // 验证IP地址字符串 返回 IP 对象type IPMask []byte // 子网掩码类型 func IPv4Mask(a, b, c, d byte) IPMask // 用一个四字节的IPv4地址来创建一个掩码 func (ip IP) DefaultMask() IPMask // 这是一个IP方...原创 2020-01-02 17:16:47 · 538 阅读 · 1 评论 -
OSI七层模型的理解 & TCP/IP四层模型
网络编程web 常识OSI 七层模型OSI 的体系结构物理层网线、集线器、中继器、调制解调器中继器-模拟信号在传输的过程中会衰减 电压降低,中继器的作用就是再次放大信号以使模拟信号传的更远调制解调器-(相当于猫) 发出去的数字信号调制成模拟信号,接收的模拟信号解调成数字信号数据链路层网桥、二层交换机网桥的作用 - 子网内的一台设备发送信息到其它设备上,...原创 2020-01-02 17:00:42 · 261 阅读 · 0 评论 -
go 实现百度富文本(ueditor)
go 实现 百度富文本框(ueditor)没有什么难点 主要参考 ueditor PHP 版抓取 ueditor php版 请求的后台链接 用 golang 替换ueditor.config.js 请求的后台地址替换掉把 serverUrl: URL + "php/controller.php" 替换成 serverUrl: /controller ,ueditor 一般都是跟...原创 2019-12-26 19:13:15 · 1592 阅读 · 0 评论