![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
文章平均质量分 57
未来谁可知
这个作者很懒,什么都没留下…
展开
-
Golang之HTTP服务中间件设计(四)
中间件:将这些非业务逻辑代码抽象出来,封装好,提供接口给控制器使用装饰器模式:将最核心的代码一层层装饰,返回的时候一层层出来首先我们从之前的Controller开始,之前写了一个可以超时的controller但是那是写在了代码里,我们能不能变成中间件为我们自动去判断超时呢!首先在写下我们的中间件方法:但是这样的调用的话就变成了如果有新的中间件要包裹,那岂不是显示写出来会很长,一层一层的!而且这个实现,也只能为一个controller需要的时候去包裹一下,只是省了写多个超时的代码,但还是要自己显示的调用!原创 2022-07-09 12:04:34 · 665 阅读 · 0 评论 -
Golang之HTTP路由设计(三)
为什么要设计路由规则,路由规则是HTTP的请求按照一定的规则 ,匹配查找到对应的控制器并传递执行的逻辑!自己编写路由的话需要注意一下一共有几种路由!也就是像这样我们在去注册动手编写自己的路由在上一节中我们编写了自己的请求处理器,对应在里面加入我们的路由规则就好了!framework/group.go给我们的注册路由,加上分组,用group包装,这样对应我们在使用group时就会对应到不同的请求类型的方法了!并且在这一层给所有的注册地址统一加上group前缀地址!如何实现动态路由首先先定义好我们的原创 2022-07-08 17:06:08 · 783 阅读 · 0 评论 -
Golang-动手实现一个分布式注册中心
以一个日志微服务为例,将日志服务注册到注册中心展开!其实这一个日志类的功能就是有基本的写文件功能,然后就是注册一个http的接口去写日志进去log/Client.go提供给外部服务的接口,定义好日志的命名格式,来显示调用接口去使用已经注册好的日志接口并且返回状态主启动程序LogService启动服务,主要执行start方法,里面有细节实现服务注册与服务发现服务启动与注册service/service.go服务注册与发现registry/client.go注册服务的时候会连着心跳以及原创 2022-07-07 12:11:32 · 809 阅读 · 1 评论 -
Golang之HTTP服务超时控制(二)
因为上一篇提过,每次来一个请求,然后就会起一个那么导致的可能就是一个树形结构的请求图,底下节点在执行中如果发生了超时,那么就有协程会堆积,所以超时控制是有必要的,一般的实现都由一个顶层设计一个Context进行自顶向下传递,这样可以从一个地方去避免多处执行异常,对于Context的过多细节我不在这里一一阐述,有需要的我将单独出一篇关于Context的介绍,下面我们就来看一下源码是如何设计的:设计初衷最关注的两个点就是一个是如何主动结束下游,另一个是如何通知上游结束下游时前者利用 后者利用,后者需要不断监听原创 2022-07-06 16:54:11 · 1265 阅读 · 1 评论 -
Golang之HTTP分析与设计(一)
这个函数主要是判断本次http请求是否升级为https,接着创建文本的reader,和写文本的buffer,再进一步读取本次的请求数据!最后是调用关键的方法来处理本次请求!流程梳理上述大致调用的流程梳理完毕总结一下main.go后续再往自己的serverHttp方法里自定义补充处理请求逻辑!本文到此结束,欢迎收看下一篇~...原创 2022-07-06 16:50:06 · 479 阅读 · 0 评论 -
golang-defer核心原理
Golang-defer关键字底层原理和执行流程原创 2022-06-01 17:37:14 · 85 阅读 · 0 评论 -
快速看懂GO实现协程池思路
如何用GO实现协程池1. 为什么需要协程池使用协程池的好处是减少在创建和销毁协程上所花的时间以及资源的开销,解决资源不足的问题。如果不使用协程池,有可能造成系统创建大量同类协程池而导致消耗完内存或者内存泄漏的问题。2. 使用协程池的优点 不用手动频繁的创建协程了 方便统一管理,只用管理池子就行了 提高响应速度,一有任务如果有刚执行完的协程就能马上去执行新任务3. 设计思路Task 任务对象->EntryChannel->JobsChannel <-Pool(worker原创 2021-11-07 19:31:51 · 435 阅读 · 0 评论 -
GO 快速学会使用反射
GO 快速学会使用反射1. 介绍在反射的世界里,我们拥有了获取一个对象的类型,属性及方法的能力。在 Go 反射的世界里,有两种类型非常重要,是整个反射的核心,在学习 reflect 包的使用时,先得学习下这两种类型:reflect.Typereflect.Value2. 方法示例2.1 通过反射获取对象的键(类型)和值package mainimport ( "fmt" "reflect")//func reflectNum(arg interface{}) {原创 2021-10-11 00:00:37 · 356 阅读 · 0 评论 -
go设计模式之美-创建型模式总结
go设计模式之美-创建型模式总结1. 概述 学习这些设计模式更多的是去考量和及时的总结,不是一味的套模板,思考创建对象时是否需要用到设计模式?又该需要哪一种设计模式更合适?我认为这些思想会是学习设计模式最重要的一个得到的东西,所以在此进行总结之前的几个创建型设计模式!2. 总结3. 复习的地址 单例模式饿汉式懒汉式 工厂模式简单工厂工厂方法抽象工厂 建造者模式 原型模式...原创 2021-10-10 22:44:32 · 108 阅读 · 0 评论 -
go设计模式之美-原型模式
go设计模式之美-原型模式1. 定义由于反复创建大量重复对象会造成效率损失,原型模式利用已有原型对象进行复制拷贝的方式来创建新对象,已达到节省创建时间的目的2. 需求项目启动时需要先将游戏的道具配置先加载到内存中每次更新游戏对象数据属性时,需要重新再次加载一遍游戏道具对象的属性数据必须来自同一版本,不能一部分数据来自版本一,更新的一部分来自版本二,所以需要将每次更新的数据全部深拷贝到内存中代码实现package prototypeimport ( "encoding/json"原创 2021-10-10 22:40:36 · 683 阅读 · 0 评论 -
go设计模式之美-建造者模式
go设计模式之美-建造者模式建造模式和工厂模式不同点建造模式用于创造参数复杂的对象,而工厂模式用于创建类型相关的不同对象1. 使用场景这个就非常重要了,因为如果你学了个东西,都不知道用来解决什么问题,你说有什么用?理解使用场景的的重要性要远高于你是不是会实现这个模式,因为只要你知道什么问题可以使用builder模式来解决,那你即使不会写,也可以在调查相关资料后完成。 我不想说一些大而正确的术语来把你搞蒙,我们只针对具体的问题,至于延展性的思考,随着你知识的增长,逐渐会明白的。延展阅读当一个类的原创 2021-10-09 09:45:14 · 155 阅读 · 0 评论 -
go设计模式之美 - 工厂模式
go设计模式之美 - 工厂模式1. 定义工厂模式是一种创建型设计模式,有了工厂只需要知道要制造的东西名字,就能让对应工厂进行生产,不用关心生产过程。2. 优点1、一个调用者想创建一个对象,只要知道其名称就可以了。2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3、屏蔽产品的具体实现,调用者只关心产品的接口。3. 代码实现3.1 普通工厂package factorytype HeroFactory interface { Name(str string)}type W原创 2021-10-08 22:21:20 · 138 阅读 · 0 评论 -
解锁快速上手NSQ的新姿势
解锁快速上手NSQ的新姿势1. 介绍 NSQ是Go语言编写的,开源的分布式消息队列中间件,具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,同时支持横向扩展,操作友好,是一个成熟的、已在大规模生成环境下应用的产品。2. 消息中间件应用场景2.1 异步处理参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyt2j2X原创 2021-10-07 03:17:45 · 299 阅读 · 0 评论 -
Go 自己动手实现日志收集
Go 自己动手实现日志收集看日志是开发者平时排查BUG所必须的掌握的技能,但是日志是如何来的呢?通过平时开发者自己打日志,经过日志包进行处理,打印日志到控制台还是记录日志到文件中!下面咱就来学一下日志是如何记录下来的1. 日志器的接口 以下日志器定义了各类日志器的行为,通过RegisterWriter注册实现了日志器的子类日志器,然后通过Log方法来进行循环调用注册进来的日志收集器的write写日志方法。// 声明日志写入器接口type LogWriter interface原创 2021-10-04 18:54:04 · 499 阅读 · 0 评论 -
八分钟掌握GO实现LRU的核心思想
GO实现Redis的LRU例子常见的三种缓存淘汰算法有三种:FIFO,LRU和LFU实现LRU缓存淘汰算法1.FIFO/LFU/LRU 算法简介缓存全部存在内存中,内存是有限的,因此不可能无限制的添加数据,假定我们能够最大使用的内存为Max,那么在一个时间点之后,添加了某一条缓存记录之后,占用内存超过了N,这个时候就需要从缓存中移除一些数据,那么该移除或者淘汰谁呢?我们肯定希望去移除没用的数据,将热点数据留在缓存中,下面几种就是对应的几种策略!FIFO (First in First Out原创 2021-08-18 11:00:05 · 720 阅读 · 0 评论 -
sync.pool的好处在哪里
sync.pool的好处在哪里1.sync.pool的使用场景保存和复用临时对象,减少内存分配,降低 GC 压力。举个简单的例子:type Student struct { Name string Age int32 Remark [1024]byte}var buf, _ = json.Marshal(Student{Name: "Geektutu", Age: 25})func unmarsh() { stu := &Student{} json.Unm原创 2021-08-16 15:21:55 · 223 阅读 · 0 评论 -
GO语言中计算字符串长度
GO语言中计算字符串长度在GO语言中计算计算字符串长度不能简单直接使用len函数,len函数获取的是字节,一旦字符串中拥有中文,而中文按照UTF-8的编码格式算一个中文算3个字节,那么计算的字符串长度就会和想法有出入,所以使用len计算字符串长度需要慎重考虑!那么我们该用什么来计算比较正确呢?utf8.RuneCountInString("str") //使用该函数计算中文和英文下面来实战演示一下func main(){ //打印len函数和utf8.RuneCountInString的计原创 2021-05-13 11:24:40 · 830 阅读 · 0 评论 -
GO的Socket连接Demo
GO的Socket连接DemoGo实现客户端和服务器利用Socket交流Demo服务器端func main(){ fmt.Println("服务器开始监听..") listen,err :=net.Listen("tcp","0.0.0.0:8889") if err !=nil { fmt.Println("listen err=",err) return } defer listen.Close() for{ fmt.Println("等待客户端连接..") con原创 2020-12-01 18:33:01 · 496 阅读 · 0 评论