![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
文章平均质量分 83
恋恋风辰
编程是我的使命,秃头是我的勋章。博客地址: https://llfc.club/ 哔哩视频教程: https://space.bilibili.com/271469206
展开
-
面试题汇总(二)
简介总结一些笔试题源码地址secondtonone1/go面试题原文及后续更新在这里恋恋风辰官方博客面试题1 以下定义包内全局变量,正确的是A. var str stringB. str := ""C. str = ""D. var str = ""答案是AD,定义全局变量要有var 声明,可以写类型也可以不写,系统自动推导,:=实际上是两个表达式不能定义包内全局变量,会报错。2 指针访问通过指针变量 p 访问其成员变量 namep.name 或者(*.原创 2021-12-11 15:58:58 · 701 阅读 · 0 评论 -
面试题汇总(一)
简介陆续总结一些面试常常会问到的问题,对知识体系做一个梳理面试题1 简述go协程调度原理go协程调度模型图恋恋风辰官方博客简述原理:go的协程是通过MPG模型调用的,M为内核态线程,G为用户态协程,P为处理器,系统会通过调度器从全局队列找到G分配给空闲的M,P会选择一个M来运行,M和G的数量不等,P会有一个本地队列表示M未处理的G,M本身有一个正在处理的G,M每次处理完一个G就从本地队列里取一个G,并且更新P的schedtick字段,如果本地队列没有G,则从全局队列一次性取走G/P个数的G原创 2021-12-11 14:58:06 · 629 阅读 · 0 评论 -
全栈博客开发(三)完善项目并容器化
原文链接:恋恋风辰官方博客本节目标上一节完成了模板渲染,业余时间我增加了几个页面,大家可以根据分支去查看每天做的工作,这一节增加配置文件的读取,完成redis缓存的添加,一些信息优先访问redis缓存,另外增加日志库打印日志,最后完成项目的容器化redis缓存之前的文章讲述过redis的增删改查,这里也和之前redis操作类似,增加文章的查询效率。初始化redis连接池func InitRedis() { rediscli = redis.NewClient(&redi原创 2021-12-04 18:32:09 · 818 阅读 · 0 评论 -
全栈博客开发(二)添加渲染
原文链接恋恋风辰官方博客本节目标上一节我们添加了主页的路由和主页html模板,本节返回一个带参数渲染的模板,并从数据库中load数据添加到html中渲染返回,以及设置中间件,当有请求访问admin后台时判断其是否含有登录cookie,如果没有登录则返回登录页面源码地址:GitHub - secondtonone1/bstgo-blog: 前后一体化博客系统添加中间件gin支持丰富的中间件功能,我们先实现一个跨域访问的功能和检测登录cookie的功能func Cors() gin.原创 2021-12-04 18:25:35 · 505 阅读 · 0 评论 -
全栈博客开发(一)服务结构
原文链接:恋恋风辰官方博客简介基于gin框架搭建一个博客系统后台,返回html,json等数据与前端交互,包括登录模块,session维持,redis读写缓存,mongo读写等多种技术综合应用,意在打造一个高可用的稳定性博客后台。目前后台已经稳定运行,演示地址恋恋风辰官方博客, 源码地址:https://github.com/secondtonone1/bstgo-blog项目结构config: 文件夹放的是配置文件以及配置管理模块demopic: demo图片,没什么用原创 2021-12-04 18:00:34 · 537 阅读 · 0 评论 -
golang操作mongo
本文采用mongo-driver/mongo驱动操作数据库设计mongo插件结构将代码分为如下结构model : odm模型,主要是映射为数据库存储的表结构constants : 存储一些常量config : mongo的配置信息,比如空闲时长,连接数,超时时间等mongodb : 实现了mongo的连接和关闭等功能。目录结构如下mongo的连接和断开在mongodb.go中实现了连接和断开操作初始化var ( DB *Database)type Database原创 2020-08-20 10:35:07 · 1345 阅读 · 0 评论 -
化繁为简,写个简单好用的server
为什么要造轮子目前很著名的轮子有libevent,boost等高并发的网络库,可以说著名的网络库我都用过,用过才知道当要实现一些定制化的功能时并不方便,不但要了解底层源码,而且还要进行适当的改造,总有种黑盒开发的感觉,所以在15年我就开始自己封装一些epoll,select模型,当时基于多路复用用reactor模式封装了betternet,虽然稳定性不如成熟的网络库,但是可以根据需求灵活修改网络层和应用层,这是难能可贵的。市面上也有一些成型的即时通信server,使用过kbengine,origine等原创 2020-07-02 17:22:54 · 209 阅读 · 0 评论 -
谈谈golang的netpoll原理(二)
接上文我们查看了bind和listen流程,直到了listen操作会在内核初始化一个epoll表,并将listen的描述符加入到epoll表中如何保证epoll表初始化一次前文我们看到pollDesc的init函数中调用了runtime的pollOpen函数完成的epoll创建和描述符加入,这里再贴一次代码func (pd *pollDesc) init(fd *FD) error { serverInit.Do(runtime_pollServerInit) ctx, errno :=原创 2020-05-20 13:32:49 · 1271 阅读 · 0 评论 -
谈谈golang的netpoll原理(一)
今天谈谈golang源码netpoll部分实现的细节和协程阻塞调度原理epoll原理epoll是linux环境下i/o多路复用的模型,结合下图简单说明epoll工作原理上图说明了epoll生成描epoll表的基本流程,生成socket用来绑定和监听新的连接,将该socket放入epoll内核表,然后调用wait等待就绪事件。当epoll wait返回就绪事件时,判断是否是新的连接,如果是新的连接则将描述符加入epoll表,监听读写事件。如果不是新的连接,说明已建立的连接上有读或写就绪事件,这样我原创 2020-05-18 11:57:17 · 2901 阅读 · 0 评论 -
谈谈高并发秒拍系统架构设计
缓冲系统结构今天谈谈电商秒杀抢购或者高并发集中访问情况下,如何设计稳定高效的缓冲系统。常用的做法是采取逻辑分离,将秒杀功能分化为不同的逻辑进行设计,降低耦合度同时增加缓冲队列降低访问压力。可以将秒杀抢购功能分为接入层和逻辑层,接入层主要负责基本的判断如token检测,用户检测,请求是否合法等,逻辑层则做主要的逻辑处理和判断。如下图1 秒杀接入层主协程启动后,启动多个接入层的读协程和写协程,当有请求到来时接入层主协程判断是否合理,将合理的请求写入chan缓冲队列。2 然后多个接入层的读协程从chan原创 2020-05-16 09:29:37 · 389 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(九)
前情回顾前文我们完成了kafka消费逻辑实现,并将消息放入elasticsearch,然后通过kibana可视化工具查看我们的日志。本节目标前文只是完成了kafka消息消费以及放入elastic,这次将项目完善,使其支持热更新,就是当config.yaml中监控的日志改变,或者etcd数据有改变时,动态启动协程监控新增日志,关闭取消的日志监控协程。新增变量控制协程自启动kafk...原创 2020-03-25 10:03:00 · 318 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(八)
前情回顾前文我们完成了日志采集系统基本功能,包括日志监控,日志采集,配置热更新,协程动态启动和关闭,同时扩充支持了etcd管理文件路径。本节目标本节新增日志查询和检索功能。基本思路是将日志信息从kafka中读取,然后放到elasticsearch中,elasticsearch是一个分布式多用户能力的全文搜索引擎,我们可以通过它提供的web接口访问和查询指定数据。另外,为了更方便的检索...原创 2020-01-17 13:39:48 · 301 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(七)
前情回顾前文我们完成了日志采集系统基本功能,包括日志监控,日志采集,配置热更新,协程动态启动和关闭等。本节目标前文我们是通过将要监控的日志路径配置在配置文件中,根据配置文件热更新动态监控日志。本节将etcd服务加入系统中,可以将要监控的日志文件路径和主题序列化为字符串保存到etcd中,这样系统可以监控etcd中该值得变化,从而动态启动协程和关闭协程监控指定日志。这样可以通过etcd...原创 2019-12-27 16:24:29 · 306 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(六)
前情回顾前文我们完成了日志采集系统的日志文件监控,配置文件热更新,协程异常检测和保活机制。本节目标本节加入kafka消息队列,kafka前文也介绍过了,可以对消息进行排队,解耦合和流量控制的作用,为什么一定要用kafka呢?主要原因就是在日志高并发读取后,如果直接将消息发给前端或者写入数据库,会造成崩溃或者卡死。kafka可以对消息进行排队和减轻压力,这样无论以后将这些消息录入数据库也...原创 2019-12-06 17:40:36 · 537 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(五)
前情回顾前文我们完成了如下功能1 根据配置文件启动多个协程监控日志,并启动协程监听配置文件。2 根据配置文件热更新,动态协调日志监控。3 编写测试代码,向文件中不断写入日志并备份日志,验证系统健壮性。本节目标我们旨在编写一个健壮性较强的日志监控系统,不得不考虑这样一个问题,当某个日志监控协程崩溃或者异常退出,该如何处理?我的想法是当监控日志文件的协程异常退出时,在主协程复活这个...原创 2019-12-04 16:27:41 · 279 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(四)
前情回顾前文我们完成了如下目标1 项目架构整体编写2 使框架支持热更新本节目标在前文的框架基础上,我们1 将之前实现的日志监控功能整合到框架中。2 一个日志对应一个监控协程,当配置热更新后根据新配置动态关闭和启动协程。3 编写测试代码,模拟向文件中不断写入日志,并备份日志,观察监控功能是否健壮。增加协程监控日志文件我们将之前实现的日志监控功能整合到现有框架,文件结构如...原创 2019-12-03 15:33:12 · 423 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(三)
前文中已经完成了文件的监控,kafka信息读写,今天主要完成配置文件的读写以及热更新。并且规划一下系统的整体结构,然后将之前的功能串起来形成一套完整的日志采集系统。前情提要上一节我们完成了如下目标1 完成kafka消息读写2 借助tailf实现文件监控,并模拟测试实时写文件以及文件备份时功能无误。本节目标1 编写系统结构,在主函数中加载配置2 管理配置文件,实现热更新实现...原创 2019-12-02 16:14:43 · 345 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(二)
日志统计系统的整体思路就是监控各个文件夹下的日志,实时获取日志写入内容并写入kafka队列,写入kafka队列可以在高并发时排队,而且达到了逻辑解耦合的目的。然后从kafka队列中读出数据,根据实际需求显示网页上或者控制台等。前情提要上一节我们完成了如下目标1 配置kafka,并启动消息队列。2 编写代码向kafka录入消息,并且从kafka读取消息。本节目标1 写代码从kaf...原创 2019-11-27 18:10:53 · 396 阅读 · 0 评论 -
Go项目实战:打造高并发日志采集系统(一)
项目结构本系列文章意在记录如何搭建一个高可用的日志采集系统,实际项目中会有多个日志文件分布在服务器各个文件夹,这些日志记录了不同的功能。随着业务的增多,日志文件也再增多,企业中常常需要实现一个独立的日志采集系统,实时采集各个日志信息,并记录和输出到控制台或网页上,方便监控和查询。本文日志采集系统架构如下日志采集系统监控各个日志文件,当日志文件有日志录入时,日志采集系统实时获取日志内容并下入...原创 2019-11-22 16:00:05 · 931 阅读 · 0 评论 -
golang channel详解和协程优雅退出
非缓冲chan,读写对称非缓冲channel,要求一端读取,一端写入。channel大小为零,所以读写操作一定要匹配。func main() { nochan := make(chan int) go func(ch chan int) { data := <-ch fmt.Println("receive data ", data) }(nochan) nocha...原创 2019-11-12 17:27:24 · 1242 阅读 · 0 评论 -
golang实现生产者消费者模型
生产者消费者模型分析操作系统中的经典模型,由若干个消费者和生产者,消费者消耗系统资源,生产者创造系统资源,资源的数量要保持在一个合理范围(小于数量上限,大约0)。而消费者和生产者是通过并发或并行方式访问系统资源的,需要保持资源的原子操作。其实就是生产者线程增加资源数,如果资源数大于最大值则生产者线程挂起等待,当收到消费者线程的通知后继续生产。消费者线程减少资源数,如果资源数为0,则消费者线...原创 2019-11-12 17:07:00 · 310 阅读 · 0 评论 -
图解Go协程调度原理,小白都能理解
阅读本文仅需五分钟,golang协程调度原理,小白也能看懂,超实用。什么是协程对于进程、线程,都是有内核进行调度,有CPU时间片的概念,进行抢占式调度。协程,又称微线程,纤程。英文名Coroutine。协程的调用有点类似子程序,如程序A调用了子程序B,子程序B调用了子程序C,当子程序C结束了返回子程序B继续执行之后的逻辑,当子程序B运行结束了返回程序A,直到程序A运行结束。但是和子程序相比...原创 2019-11-06 11:10:39 · 829 阅读 · 0 评论 -
Go 反射用法详解
反射是什么反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如python, golang,有些是不支持反射的比如C++前文我们分析过interface的结构,无论空接口还是有方法的接口,其内部都包含type和value两个类型,type指向了变量实际的类型value指向了变量实际的值。而反射就是获取这两个类型的数据。golang总类型分为包括 static typ...原创 2019-11-01 12:06:30 · 3272 阅读 · 1 评论 -
golang实现四种排序(快速,冒泡,插入,选择)
前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种排序算法,快速排序,插入排序,选择排序,冒泡排序。既可以总结前文的基础知识,又可以熟悉下golang如何实现这四种排序。快速排序算法介绍假设用户输入了如下数组下标 | 0 | 1 | 2 | 3 | 4 | 5 |数值 | 6 | 2 | 7 | 3 | 8 | 9 |创建变量i=0(指向第一个数...原创 2019-11-01 11:58:30 · 365 阅读 · 0 评论