Gohub——日志
正经人谁写日记啊?
欸欸欸,不好意思,来错片场了(手动狗头)。今天介绍的是项目中必不可少的一部分——日志。
日志系统虽然正经人不写日记,但是正经项目一定要记录日志。总所周知啊,Gohub 就是一个非常正经的项目,虽然还没有到企业级这么高的层次,但是也差不多了。
在 Gohub 中,我们使用日志来记录整个系统的运行情况,可能但不限于:
HTTP 请求数据
数据库 SQL 请求日志
Panic/Error 错误日志
请求第三方接口日志(发送短信、发送邮件等)
……
好了,是时候掏出祖传的几个问题了,什么是日志?该怎么设置日志?下面将会一一解答。
什么是日志日志系统是一种记录系统活动、事件或消息的工具或机制。在计算机领域,日志系统通常用于记录应用程序、操作系统或者其他软件系统的运行时信息。这些信息可以包括错误、警告、调试信息、用户操作记录等等。
日志系统的主要目的是帮助开发人员或管理员了解系统的状态和运行情况,以便进行故障排除、性能优化、安全审计等工作。通过分析日志,可以追踪问题的根源,监视系统的健康状况,并且可以在系统发生故障或异常时进行及时的响应和处理。
日志系统通常具有以下特点: ...
Gohub——注册
本文主要介绍新项目中第一部分的内容——身份验证接口的设计思路。
身份验证接口主要包括以下模块:
注册
登录
找回密码
基本流程为:
填写手机号或者邮箱
填写图片验证码中的内容
填写数字验证码以完成身份验证
操作完成
双重验证在调用接口时,用户需要完成图片验证码 + 短信验证码,我们在日常使用相关的功能时也是采用这样的双重验证的策略。那我们为什么要用这么繁琐的验证方式呢?在了解为什么之前,我们先来看以下这两种验证码的作用。
图片验证码 —— 区分机器人和正常用户
数字验证码——区分用户是否为手机号或邮箱的主人
采用双重验证,主要还是考虑到开放注册登录接口所带来的安全隐患。在知道了这两种验证码的作用后,我们来看缺少了其中一种会带来什么样的安全隐患。
黑客容易利用的地方,大致可以分为两部分:
滥用
暴力破解
滥用(轰炸机)删除图片验证,保留短信验证。
原理短信验证码轰炸一般基于web方式,主要有两个模块组成:一个前端web网页,提供输入被攻击者手机号码的输入窗口;一个后台攻击页面(如PHP),利用从各个网站上找到的动态短信URL 和前端输入的被攻击者手机号码,发送HTTP 请 ...
Gohub开发
本项目为从零构建一个高性能、功能齐全的 API 程序框架,主体内容和第一个项目相似。但是并没有做前端的内容,只针对相应功能做了 API 开发。
本项目主要设计一下三部分的知识点:
API 开发
命令行开发
构建高效率的程序结构
主要功能为:
用户的注册和登录
安全验证码和图片验证码
JWT 授权
用户修改个人信息
项目统计实现路由
请求方法
API 地址
说明
POST
/api/v1/auth/login/using-phone
短信 + 手机号登录
POST
/api/v1/auth/login/using-password
手机号、用户名、邮箱 + 密码
POST
/api/v1/auth/login/refresh-token
刷下 Token
POST
/api/v1/auth/password-reset/using-email
邮件密码重置
POST
/api/v1/auth/password-reset/using-phone
短信验证码密码重置
POST
/api/v1/auth/signup/using-phone
使用手机 ...
唉……
文章是越写越慢,质量是越来越差,这周的甚至连标题都想不出来了,离谱。从标题也能看出来,这周应该是不太愉悦的,二面被挂就算了,还被另一个面试官给戏耍了。我懂了,找实习就一个字——摆。
学习内容算法清明假期三天,每天都是两三个小时的做题时间,本周倒是没怎么做题。
原因是觉得刷了一个月的题了,还是在看到题目后几分钟就有思路了,但是不知道代码该怎么写,所以决定先沉淀几天。
项目虽然最近几天算法进展不怎么样,项目进展还是不错的。
上周六开的新项目,其实还是这周才开始,项目内容和之前的项目好像没有什么太大的区别,一个是博客,一个是论坛。但是实际开发就是天差地别了,不仅仅将框架全部换了 gin ,还用上了 redis。是的,就是那个只要出现在简历上就会触发面试官被动的 redis ,当然,以防万一,我非常认真地背了 Redis 三兄弟。
项目中更加详细地内容还是等到下周专门来写吧,写在周报里好像不是很好记录。
Go语言设计哲学没想到这一块竟然还有后续,因为上一篇有些一些相关的内容,后续也有去了解 Go 和 C++ 的不同,也查了一些资料,感觉很有意思,后续应该会继续写相关的内容。
找实习的进展有什么 ...
Go语言设计哲学
实在是想不到啊,我的博客里面竟然还会出现如此高大上的文章——设计哲学。为什么会想写关于这方面的文章呢,主要还是在跟面试官闲聊的时候提到了这方面的问题。面试还是能学到不少东西的嘛,毕竟我的眼界还是太窄了。
在学习一门语言时,有没有考虑过这个语言的语法和格式为什么要这么设计?这个问题一听就是一个好的话题啊,为什么这么设计?为什么在已经有了那么多语言后,还要设计出Go语言?
那么好,闲话少说,这周的主要内容就改为Go语言的设计哲学。当然,文章内容并不是我原创的,更多的还是网上查到的资料。
背景Go 编程语言构思于 2007 年底,构思的目的是:为了解决在 Google 开发软件基础设施时遇到的一些问题。
图中的三位大佬就是 Go 语言最初的设计者,从左到右依次为:
Robert Griesemer:参与过 Google V8 JavaScript 引擎和 Java HotSpot 虚拟机的研发。
Rob Pike:Unix 操作系统早期开发者之一,UTF-8 创始人之一,Go 语言吉祥物设计者是 Rob Pike 的媳妇。
Ken Thompson:图灵奖得主,Unix 操作系统早期开发 ...
操作数据库
目前为止,我们能接收到用户提交过来的数据,且对这些数据做验证。也已经开发完成验证错误的逻辑。那么这一节我们就要开始学习如何将数据存入数据库。
操作 MySQL 数据库在本项目中所选用的数据库为MySQL,使用GO操作MySQL等数据库,一般有两种方法:
一是利用 database/sql 接口,直接在代码里硬编码 sql 语句;
二是使用 ORM,具体一点是 GORM,以对象关系映射的方式在抽象地操作数据库。
database/sqldatabase/sql 包通过提供统一的编程接口,实现了对不同数据库驱动的抽象。
大致原理
Driver 接口定义:database/sql/driver 包中定义了一个 Driver 接口,该接口用于表示一个数据库驱动。驱动开发者需要实现该接口来提供与特定数据库的交互能力。
Driver 注册:驱动开发者需要在程序初始化阶段,通过调用 database/sql 包提供的 sql.Register() 方法将自己的驱动注册到 database/sql 中。这样,database/sql 就能够识别和使用该驱动。
数据库连接池管理:database/s ...
路由和中间件
本文主要用于介绍GoBlog项目中两个最为重要的部分——路由和中间件。这两个部分可以说是本项目的重要组成部分,下面我们会逐个进行学习和分析,并大概介绍其在项目中的作用。
路由goblog 需要一款灵活的路由器来搭配 MVC 程序结构,恰巧Go Web 开发有各式各样的路由器可供选择。这个时候可能就有朋友要问了,什么是路由啊,路由有什么用呢?额……其实我在学的时候也有这样的问题,那就慢慢往下看吧。
什么是路由?路由,就是URL地址到业务处理代码的映射。当用户输入一个URL地址时,服务器改知道要返回什么内容,一个 URL 到一个具体的处理函数之间的映射叫做一条路由。
多条路由组成路由表,路由表主要用于路由查找,根据不同的路由表的组织形式,可以有不同的查找方法。
给定一个URL,找到对应的处理函数的过程叫做路由查找。路由器就是用来管理路由表并进行路由查找的。
所以,在Web系统中一个路由系统由路由、路由表和路由匹配三部分功能组成。
路由实现由三种方法,分别是基于映射表、正则表达式以及tries结构的路由实现,下面将会一一介绍。
基于映射表的路由实现Go内建标准包bet/http中路由的 ...
GoBlog,启动!
喜大普奔!!!GoBlog这个项目总算是写完了,严格来说这是笔者完成的第一个项目,也是笔者学习Go语言的主要途径。从开始那天算起到现在,完成这个项目用了差不多四个月,但真正用在学习这个项目的时间估计不到一个月。刚开始说为了学习Go语言开始写一个感兴趣的项目,结果就一直拖,直到需要找实习才发现自己简历上能写的东西寥寥无几。说来奇怪,上了几年大学发现自己好像什么都没学到,这应该就是一种清醒的堕落吧。
我对这个项目的了解就像我对Go语言的了解一样,来自我那个神奇的舍友。他花钱买了教程之后,我就可以蹭一下了,很难想象没有我亲爱的舍友,我的大学生活会变成什么样子。
项目说明废话少说,为什么要用Go来开发一个博客系统呢?答案很简单,Go语言本身就非常适用于开发Web应用程序,而且我们在学习的过程中也不难发现好像很多大佬都有自己的博客,那不如把这两个结合一下,这样在设计具体功能的时候也能找到一些可以借鉴的地方。
开发Web应用要涉及到的知识:
表单验证
注册登录
授权验证
共享数据库连接
密码哈希
路由和中间件
代码组织(MVC/RESTful)
打包静态文件和模板文件
项目部署等
这些内容会在 ...
一个简单的Go Web程序
在Go中,搭建一个http server简单到令人难以置信。只需要引入net/http包,写几行代码,一个http服务器就可以正常运行并接受访问请求。因此,在正式开启项目开发之前,先来看一段简短的代码。
1234567891011121314package mainimport ( "fmt" "net/http")func handlerFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")}func main() { http.HandleFunc("/", handlerFunc) http.ListenAndServe(":3000", nil)}
很显然,这段代码就能够构成一个Web程序,其中最为主要的内容基本上都与一个包有关—— net/http,那就先学习一 ...
腾讯面试——血与泪的教训
前言又到了一周一度的学习总结了,本周可以算得上是非常神奇的一周了。从标题也不难看出,神奇之处就在于本周是笔者第一次参加一场面试,可谓是非常的紧张。经过一场面试也让我深刻地感受到闭门造车是行不通的,在面试之前总觉得自己把什么都准备好了,结果在两个小时的面试过程中,被面试官牵着鼻子走(狗头)。所以本周的总结主要集中在对面试的复盘方面,希望在完成这次周报之后能对我以后的学习有一定的帮助吧。
面试复盘面试流程
首先就是面试官介绍自己的部门和我的自我介绍。
从舍友的评价来看,自我介绍环节就已经十分紧张了,说话也是结结巴巴,十分的不自信。
三道算法题。
题目倒不是很难,也不需要能够完全正确,只需要自己的思路对就OK了。
拷打项目,也是本次面试中笔者表现的最呆瓜的一个环节了。
面试官问我为什么要选择MySQL来作为数据库来存储信息。我竟然脑抽到回答说我只会MySQL。
除了拷打项目,就是一些比较简单的八股了,还是有待加强。
项目拷打总结问题一是否支持上传图片?图片是怎样进行存储的?怎么把图片和对应的文章正确地显示出来?
显然,对于并没有完全准备好的我来说,这三个问题已经足够干掉我了。
已 ...