自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(381)
  • 收藏
  • 关注

原创 130. MySQL表结构设计18条最佳实践原则

对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。通常情况下,建库的频率比建表要低很多,所以,我们这篇文章主要讨论建表相关的内容。如果我们在建表的时候不注意细节,等后面系统上线之后,表的维护成本变得非常高,而且很容易踩坑。今天就跟大家一起聊聊,数据库建表的18个小技巧。文章中介绍的很多细节,我在工作中踩过坑,并且实践过的,非常有借鉴意义,希望对你会有所帮助。

2024-05-22 00:22:59 887

原创 129.跨服务(跨数据库)多表存在大量数据依赖问题解决方案

相对1中介绍的原始方案,虽然还是需要先查商品表,然后用in查订单表,但是避免了RPC调用,上面的两次查询是在一个DB中进行的。如果需要关联使用商品数据的订单,采购服务的开发人员也无须关注商品数据的同步问题,只需要在查询时加上关联语句即可,实现了双赢。根据表结构不难发现,订单和采购单中保存的是商品ID,所以要实现上诉需求,需要先通过在商品表中获取到商品ID,然后去订单表查找订单,或去采购表查找采购单。每次更新商品时,先发布一条消息,订单与采购服务则各自订阅这条消息,消费消息各自更新商品冗余数据。

2024-05-21 00:33:56 758

原创 128.数据异构提升查询效率

冷热分离126.数据冷热分离方案与数据异构127.数据异构方案。本文介绍他们的实际应用场景实践。查询冷数据慢业务无法修改冷数据冷数据多到一定程度系统依旧扛不住此时如果需要解决以上问题,可以采用另外一种方案:使用查询分离优化业务主表数据大、查询缓慢的问题什么时候触发查询分离?如何实现查询分离?查询数据的存储系统选型?查询数据如何使用?查询分离的适用场景?当你在实际业务中遇到以下情形,则可以考虑使用查询分离解决方案。数据量大;所有写数据的请求效率尚可;查询数据的请求效率很低。

2024-05-20 23:46:34 875

原创 127.数据异构方案

何谓数据异构:把数据按需(数据结构、存取方式、存取形式)异地构建存储。比如我们将DB里面的数据持久化到Redis或者ES里面去,就是一种数据异构的方式。常见应用场景分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候我们是按照订单ID作为分片键去分库分表,后来的业务需求想按照商家维度去查询,比如想查询某一个商家下的所有订单,就非常麻烦。异构维度数据异构总结起来大概有以下几种场景数据库镜像(DB→DB)数据库实时备份。

2024-05-20 23:21:10 858

原创 126.数据冷热分离方案

无论多么复杂的业务场景,一条数据的一生都体现在CRUD操作上,即创建、查询、修改、删除。一条数据随着时间的流逝,其价值也是在逐渐变小。数据存在的价值则是在于它被使用的程度,在不同的系统中,人们对于不同时期的数据有着不同的需求。比如12306、携程上的火车、机票订单,人们往往只关注30天之内的订单,而携程正是默认只保留30天的订单信息,超过30天的订单需要通过手机号查找。携程为什么要这么做?其实仔细想想不难明白,作为全国购票平台,每年数以亿计的订单,如果全部能够开放操作(CRUD),那么系统将会瞬间崩溃。

2024-05-20 22:51:15 724

原创 125. MySQL操作时的相关坑和处理技巧

在该程序刚部署成功,但数据库新字段还没来得及加的这段时间内,最新程序中,所有使用了新加字段的增删改查。才能把数据修复好,这种情况建议把表备份多次,如果出现异常,把数据回滚到最近的一次备份,可以节省很多重复操作的时间。这时所有涉及该字段的增删改查,都会报字段不存在的异常。正常情况下,如果程序新加了字段,一般是先在数据库中加字段,然后再发程序的最新代码。语句,通过上面的修改人和修改时间字段,在需要回滚时,能快速的定位到正确的数据。如果数据库中新加的字段非空,最新的程序还没发,线上跑的还是老代码,这时如果有。

2024-05-10 21:29:51 806

原创 124. explain | 索引优化 详解

对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?监控sql执行情况,发邮件、短信报警,便于快速识别慢查询sql打开数据库慢查询日志功能简化业务逻辑代码重构、优化异步处理sql优化索引优化其他的办法先不说,后面有机会再单独介绍。

2024-05-10 20:40:42 965

原创 123. SQL优化技巧汇总

sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。那么,如何优化sql语句呢?这篇文章从15个方面,分享了sql优化的一些小技巧,希望对你有所帮助。

2024-05-09 20:36:26 1042

原创 122. Kafka问题与解决实践

假如有家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑。为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,保证出现线上问题时能够及时处理。有个后厨显示系统团队【面向的是厨师和服务员】,该系统属于订单【面向用户】的下游业务。用户点完菜下单后,订单系统会通过发kafka消息给我们系统,系统读取消息后,做业务逻辑处理,持久化订单和菜品数据,然后展示到划菜客户端。这样厨师就知道哪个订单要做哪些菜,有些菜做好了,就可以通过该系统出菜。

2024-05-07 20:32:24 999

原创 121. 使用MQ可能存在的问题以及解决办法

MQ的重要性不言而喻。我们为什么要用mq?引入mq可能会出现哪些问题?如何解决这些问题?你心中是否有答案了呢?本文将会一一为你解答,这些看似平常却很有意义的问题。

2024-05-07 16:44:54 554

原创 120.幂等设计实践

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。比如:公交车刷卡,用户上车后刷码支付扣款成功,如果用户再次刷卡并扣款成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。因此,当你重复刷卡时,会提示:刷码重复【每次打开支付码都会生成一个新的支付二维码,一个码只会完成一次支付,多次扫同一个二维码,只有第一次能支付成功】。注意:数据库可能产生幂等性问题,但是幂等性问题不只发生在数据库。

2024-05-07 15:58:43 979

原创 119. 再谈接口幂等性

在93. 通用防重幂等设计一文中,已经介绍过幂等的使用。该文将补充一些其他方案,不一定实用,但是是思路的延伸。有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回错误的结果(这种情况不可能直接返回失败吧?),于是会对该请求重试几次,这样也会产生重复的数据。mq消费者在读取消息时,有时候会读取到重复消息。

2024-05-07 15:03:46 837

原创 118. 性能优化技巧合集

本文梳理和总结了优化接口的18种方案,应该说比较系统了,大家在平时的学习或工作中也可以针对性地用起来。原文地址:https://mp.weixin.qq.com/s/fcUYP_6wFTp4y_tYSxf0xQ。

2024-05-06 21:04:41 702

原创 19.创建帖子

这里要稍微注意的是:需要登录后才可以发表帖子,所以需要用到我们之前写的鉴权中间件。为了文档看起来更清晰,我这里将中间件的代码和从。中能取出用户信息,说明鉴权成功,否则失败。解析成功后,便会将用户信息存入。可以看到是创建成功的。

2024-03-13 22:46:09 414

原创 18. 查看帖子详情

【代码】18. 查看帖子详情。

2024-03-13 22:21:48 400

原创 17.获取帖子列表

一样了,需要返回作者名字和社区详情,所以我们还需要额外定义一个。开发GetPostListHandler。由于返回给前端的字段不完全和。

2024-03-13 21:44:12 422

原创 107. 如何使用Docker以及Docker Compose部署Go Web应用

使用Docker容器能够极大简化我们在配置依赖环境方面的操作,但同时也对我们的技术储备提了更高的要求。对于Docker不管你是熟悉抑或是不熟悉,技术发展的车轮都滚滚向前。原文地址:https://www.liwenzhou.com/posts/Go/deploy-in-docker/

2024-03-12 16:40:08 1011

原创 106. Dockerfile通过多阶段构建减小Golang镜像的大小

多阶段构建允许多个不同的构建过程,这些构建可以完全从不同的基础镜像构建,选择性地将文件从一个阶段传递到下一个阶段,从而剥离最终镜像中所有不必要的文件。我会说是的,但是为了实验的缘故,我们还是尽量挑战一下极限。我们继续沿着多阶段构建的道路前进,但这次在我们的第二阶段,我们将不再使用。差异可能会产生巨大的影响,在其余的情况下,你最终会在生产中得到一个完全没有任何工具的容器,我完全不推荐这样做。CGO_ENABLED=0 是至关重要的,如果我们不构建自包含的可执行文件,多阶段构建过程将无法工作。

2024-03-12 15:50:05 529

原创 105. Dockerfile详解

Dockerfile是用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。每个指令都会在镜像的构建过程中创建一个新的镜像层,这些层构成了最终镜像的结构。这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。以下是一个简单的。

2024-03-12 11:54:27 858

原创 104. Go单测系列4---编写可测试的代码

本文是Go单测系列的最后一篇,在这一篇中我们不再介绍编写单元测试的工具而是专注于如何编写可测试的代码。编写可测试的代码可能比编写单元测试本身更加重要,可测试的代码简单来说就是指我们可以很容易的为其编写单元测试代码。接下来,我们将通过几个简单示例来介绍如何编写可测试的代码。

2024-03-11 21:03:25 1038 2

原创 103. Go单测系列3---mockey与convey综合实战

工作中,随着业务的快速发展,代码量级和复杂度也会随之快速增长,面临的稳定性挑战越来越大。单测作为稳定性保障的重要一环越来越受到重视,编写单元测试应该成为程序员的基本素养。之前写单元测试都是基于go自己的test方式,基本就是在线下跑通流程,遇到下游的接口无法访问时,只会束手无策。后来了解到一些单测工具,市面上已有很多成熟的单测工具,本文不会比较各种工具的优劣,而是结合自身经验介绍本人在工作时常用的工具。

2024-03-11 20:35:23 1722 1

原创 102. Go单测系列2---goconvey的使用

GoConvey是一个非常非常好用的Go测试框架,它直接与go test集成,提供了很多丰富的断言函数,能够在终端输出可读的彩色测试结果,并且还支持全自动的Web UI。安装如果需要使用goconvey的Web UI程序,请执行下面的命令安装可执行程序。如果只是想在项目中引入依赖,只需要在项目目录中执行以下命令。使用示例我们使用goconvey来为最开始的基础示例中的Split函数编写单元测试。

2024-03-11 20:33:44 456 1

原创 101. Go单测系列1---使用monkey打桩

单元测试中十分常用的打桩工具,它在运行时通过汇编语言重写可执行文件,将目标函数或方法的实现跳转到桩实现,其原理类似于热补丁。Debug 模式下跑单个测试时会自动带上该参数,Run 模式下跑单个测试或者跑一个包的测试则需要手动带上该参数。但是当你编写代码的时候这个库还没实现,或者这个库要经过内网请求但你现在没这能力,这个时候要为。熟练使用各种打桩工具能够让我们更快速地编写合格的单元测试,为我们的软件保驾护航。不是线程安全的,所以不要把它用到并发的单元测试中。不支持内联函数,在测试的时候需要通过命令行参数。

2024-03-11 20:12:16 569

原创 100. Go单测系列0---单元测试基础

本文介绍了Go语言单元测试的基本用法,通过为Split函数编写单元测试的真实案例,模拟了日常开发过程中的场景,一步一步详细介绍了表格驱动测试、回归测试和常用的断言工具的使用。在下一篇中,我们将更进一步,详细介绍如何使用httptest和gock工具进行网络测试。

2024-03-11 19:44:17 1199 1

原创 16. 获取社区详情

登录之后,我们可以发表帖子,但是发表帖子之前,需要先选择一个频道,可以理解是社区分类或者标签分类。这个数据来源是从服务端获取的,本节我们就实现这个功能。这是一个最基本的CRUD功能,直接上代码吧,其中dev.yaml和main.go文件有改动是因为我想换为开发环境运行,这样可以直接调试以及观察控制台日志。

2024-03-10 22:53:50 390

原创 15. jwt认证中间件

此时我们很容易就想到了中间件,定义好鉴权中间件,对于需要鉴权的路由,加上这个中间件即可。对于一些需要权限校验的请求,我们就需要验证这个。,是因为后续其他接口需要从这个上下文中获取。用了一个全局变量,而不是一个写死的字符串。时也要用到这个变量,所以作为全局的较好。层入口要做的事情,可能有很多接口需要从。在上一篇登录功能的实现中,我们使用了。前端在访问后续请求时,可以带上这个。其中需要说明的一点是,将当前请求的。作为鉴权组件,其中登录后会颁发。直接上代码吧,注释非常清晰。,所以可以封装一个函数。

2024-03-10 17:48:38 734

原创 14. 登录功能实现

有了基本脚手架之后,我们在上节很容易的就完成了注册功能。登录功能与之类似,按部就班实现即可。登录后,期望在一段时间内不需要继续登录也能访问其他一些需要登录的接口,这时候就涉及到鉴权啦,我们可以使用jwt实现。

2024-03-10 17:10:07 852

原创 13. 用户注册功能实现

由于我们的项目是非常简单的上入门项目,所以并不会用到DDD等复杂的目录设计和管理,而是用了最基本的MVC三层结构。负责校验用户名是否已经存在,若不存在,则生成唯一的用户ID,注册用户。这里首先写注册逻辑,后续的登录逻辑也会在这个文件中实现。校验用户名是否已经存在、对密码加密、保存新注册的用户。定义与DB交互时可能出现的相关错误码。添加路由,使用分组管理。

2024-03-09 22:26:55 472

原创 12. 建立用户表并使用雪花算法生成用户ID

雪花算法是。

2024-03-09 21:16:16 973

原创 11. 搭建较通用的GoWeb开发脚手架

由于我们后续是要将配置加载到一个全局结构体对象中,然后各个地方使用这个全局变量读取配置的,所以很自然的想到,我们应该定义对应的配置结构体,并提供一个全局变量以及相应的初始化函数。文件,我们如何放到了其他目录下去执行,代码中写死配置文件读取目录的话可能就读不到了,因为路径不对了。随后我们传入配置文件路径执行,可以看到启动后,没有报错且光标一直在闪烁,便是项目启动成功且在。原因是项目运行时的基准目录,是以执行运行程序所在目录为准的,也就是说,编译后产生了。文件,毕竟它是整个程序的入口,我们的。

2024-03-09 20:21:44 1516 2

原创 10. Go使用validator库进行参数校验

上面的错误提示看起来是可以了,但是还是差点意思,首先是错误提示中的字段并不是请求中使用的字段,例如:RePassword是我们后端定义的结构体中的字段名,而请求中使用的是re_password字段。如何使错误提示中的字段使用自定义的名称,例如json tag指定的值呢?只需要在初始化翻译器的时候像下面一样添加一个获取json tag的自定义方法即可。// InitTrans 初始化翻译器// 修改gin框架中的Validator引擎属性,实现自定制ok {

2024-03-09 17:42:53 1005

原创 99. 数据库连接数设置多少合适?

很多工程师习惯于使用一个组件时,参数设置依赖于默认值。或者有时候希望依赖数据分析获取到更合适的值,最终发现考虑的数据过于片面或者数据难以收集最终还是拍脑袋决定了参数的大小。今天咱们就以数据库连接数参数为例说明怎么去设计参数。

2024-03-08 17:13:41 1106

原创 98. 一台服务器能支持多少QPS

这是因为,当我们在设计和部署一个应用程序的时候,我们需要确保它能够处理足够的流量,以满足用户的需求。首先,我们需要了解一下一台服务器的处理能力是如何衡量的。通常,我们会将服务器的处理能力表现为其每秒钟能够处理的事务数量。,这与我们监控显示的是差不多的。因此知道了,工作中这个例子是业务逻辑复杂很多,每次请求的平均耗时为。之后,我们可以通过简单的计算来计算一台服务器能够支持的。其中,每秒钟可以执行的操作,应该通过压测评估。,这个估计是非常简单的业务逻辑了,毕竟。,而我们要估计的是一台实例能承接的。

2024-03-08 16:31:34 1235

原创 97. 常用的HTTP服务压测工具

同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求(服务器实例个数,如需要部署。在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏。地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处理时间等统计数据。自带的性能测试工具。使用这个工具,只须指定同时连接数、请求数以及。同学可以使用它来测试,使用如下命令来安装。,即可测试网站或网站程序的性能。脚本来支持更加复杂的测试场景。性能测试工具,它和上面提到的。的机器),节约资源成本。

2024-03-08 16:02:05 1358

原创 9. Go语言配置管理神器Viper的基本使用

Viper将读取从Key/Value存储(例如etcd或Consul)中的路径检索到的配置字符串(如JSON、TOML、YAML、HCL、envfile和Java properties格式)。需要重新启动服务器以使配置生效的日子已经一去不复返了,viper驱动的应用程序可以在运行时读取配置文件的更新,而不会错过任何消息。默认情况下,空环境变量被认为是未设置的,并将返回到下一个配置源。Viper使用crypt从K/V存储中检索配置,这意味着如果你有正确的gpg密匙,你可以将配置值加密存储并自动解密。

2024-03-07 20:00:10 1185

原创 8. Go实现Gin服务优雅关机与重启

优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。注:如果是执行Ctrl+C关闭服务端时,仍会强制结束进程导致正在访问的请求出现问题。,当接收到中断信号时,服务器会进入优雅关闭流程,即先关闭。秒钟内没有关闭完所有连接,函数会返回错误。并等待所有连接关闭。秒钟,最后退出程序。函数,它会优雅地关闭。

2024-03-06 21:15:23 626

原创 7.使用os.Args或flag解析命令行参数

有以下两种常用的定义命令行。

2024-03-06 21:04:29 943

原创 6. Gin集成redis

作为后端研发,Redis是无处不在的,那么go操作Redis也是每位后端研发应该掌握的基本技能。go-redis官方文档。

2024-03-06 20:38:40 1106

原创 5. gin集成Gorm

本节主要介绍如何使用gin集成gorm,并完成用户的创建、修改、删除、查询等功能。

2024-03-06 20:14:47 622

原创 4. 使用zap替换gin框架默认的日志并配置日志切割

本文将介绍在基于gin框架开发的项目中如何配置并使用zap来接收gin框架默认的日志以及如何配置日志切割。我们在基于gin框架开发项目时通常都会选择使用专业的日志库来记录项目中的日志,go语言常用的日志库有zap、logrus等。我们该项目中使用zap。我们该如何在日志中记录gin框架本身输出的那些日志呢?

2024-03-06 18:46:52 511

空空如也

空空如也

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

TA关注的人

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