自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 gRPC服务注册发现及负载均衡的实现方案与源码解析

今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx、Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡。什么意思呢,对于使用服务端负载均衡的...

2020-10-25 09:22:25 2937 1

原创 Kubernetes Pod入门指南

Pod是Kubernetes项目里定义的最小可调度单元,是Kubernetes对应用程序的抽象。在这篇文章里我将会介绍Kubernetes里Pod的基本概念,使用方式,生命周期以及如何使...

2020-08-05 13:39:39 660

原创 五分钟用Docker快速搭建Go开发环境

挺早以前在我写过一篇用 Docker搭建LNMP开发环境的文章:用Docker搭建Laravel开发环境,里面详细介绍了将 nginx、 mysql和 php三个容器用 docker-compose编排成 LNMP开发环境的步骤,今天来说说怎么用 Docker快速搭建 Go语言项目的开发环境。因为靠Go本身自带的标准库就能实现高...

2020-01-30 11:26:00 7580 3

原创 深入学习用 Go 编写 HTTP 服务器

Go是一门通用的编程语言,想要学习 Go 语言的 Web 开发,就必须知道如何用 Go 启动一个 HTTP 服务器用于接收和响应来自客户端的 HTTP 请求。用 Go实现一个http server非常容易,Go 语言标准库net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何...

2020-01-28 12:30:00 10494 3

原创 从零拆解-怎么把Go项目部署到K8s上运行

接下来我们演示一下怎么把我们专栏的项目部署到K8s上,首先说明一点,因为我们项目依赖的MySQL和Redis都是在本地电脑上安装的,把项目部署到容器后就没办法再用本地电脑上的MySQL和Redis了,所以在演示项目的K8s部署和运行时还需要把MySQL在Redis都部署到K8s上,这样他们才能在集群内部通信。后面几个部分均是该部分所讲内容的实践。如果我们想要要登录到其中一个Pod中,那么需要我们执行以下命令(注意下面的Pod名称 go-mall- 后面是随机的,执行时记得换成自己当时查看到的Pod名称)

2025-04-01 08:55:23 852

原创 一套适用于 CI 的 Go项目容器化构建方案

那么这一节我们就来聊一聊在CI任务中怎么把我们项目指定版本的代码构建成能运行服务容器的Docker镜像,这里主要分享的还是思路,具体在CI工具中怎么配置任务还要看所使用的CI工具以及需求再做调整,有可能会跟今天给出的方案不完全一样,但是整体思路还是不会有太大偏差的。二阶段:把上阶段变异好的项目二进制文件放到一个更基础的镜像中,这既能减少要运行项目容器的镜像的尺寸,又因为镜像中没有拉取和构建代码的那些依赖(go 环境、拉代码用的ssh key等),让容器的安全性更高。后面几个部分均是该部分所讲内容的实践。

2025-03-28 08:55:17 911

原创 Go设计模式实战--用模版和策略模式应对多渠道多场景支付和营销

第四部分:商城app C端接口功能的实现,强化分层架构实现的讲解,这里还会讲解用责任链、策略和模版等设计模式去解决订单结算促销、支付方式支付场景等多种多样的实际问题。说了这么多,我估计大家都有点懵了,没办法首先要给大家解释清楚多支付渠道的多支付场景这个业务形态,其次应用上设计模式后代码纬度都会让整个代码设计的理解难度会大幅增加。后面几个部分均是该部分所讲内容的实践。那么有没有什么办法能让这种代码的发展别那么混乱,我希望给其中一个支付渠道的某类支付场景加了逻辑,测试时只回归对应的场景即可,有什么好办法吗?

2025-03-25 08:55:54 897

原创 Go项目接入微信支付的步骤和代码详解

请求微信支付下单时的参数中的 OutTradeNo 参数是我们项目生成订单的订单号,未来微信在调用 NotifyUrl 进行结果通知时我们能从它传递的结果数据中解密出这个订单号,这样我们在收到支付结果通知后才能在我们的系统中找到对应的订单,并根据结果更新成相应的订单状态。我们在介绍项目分层规划时介绍过,三方能力的接入都放在library层,所以我们先新建一个 WxPayLib 负责与微信支付的对接,这里使用的是微信的JSAPI,主要提供H5和网页支付能力,其实App内支付的接入流程跟这个差不多。

2025-03-21 08:56:01 868

原创 Go开发实战-订单接口的功能分析和代码开发讲解

在上图的注释里我们做了标注:它们是作为订单的快照信息,因为如果订单直接跟商品ID和用户地址ID关联的话,假如未来商品调整了价格、下架了亦或是用户搬家更新了地址,万一哪天“秋后算账”看看之前的订单,就会出现订单信息跟用户自己当初购买时信息不一致的情况。关于订单查询,其实主要有一点需要注意,就是我们订单前台显示状态和订单在系统中真正的状态流转是有一丢丢不一样的,说大白话就是数据库里订单状态的枚举值跟用户在前台看到的状态值是不一样的。这样整个过程不需要客户端过多参与,能最大限度地保证用户数据的安全。

2025-03-18 08:55:16 658

原创 Go设计模式实战--用职责链实现购物车与商品优惠的解耦

上一节「Go项目实战-购物车功能的核心接口开发」中我们完成了购物车模块的基本功能的开发,所有购物车功能中存在变数的就是购物车的账单结算功能,也是未来经常可能会遇到需求改动的功能?各种促销活动相关的需求都会要求涵盖在这个功能中。我们理解的购物车结算功能,一开始可能是是下面这个清纯版的但实际上公司产品要求的购物车结算功能是下面这张图这样,不光能算出商品总价,还要能综合考虑用户是不是VIP,有没有优惠券...

2025-03-13 08:57:31 887

原创 Go项目实战-购物车功能的核心接口开发

本节我们开始商城项目购物车模块的开发,本节大纲如下:本节内容节选自我的专栏《Go项目搭建和整洁开发实战》请扫码订阅专栏。专栏已更新40余节,重点章节如下,订阅后在小程序和浏览器上都能使用。购物车功能分析购物车作为商品和订单的中间角色,让用户有机会一次性选购多个商品后再进行下单结账。首先我们分析一下购物车都有哪些功能,其实从上面的思维导图列出来的分支我们就能看出来,基本上购物车都会有下面这些功能:添...

2025-03-10 08:51:50 255

原创 Go项目实战-关于列表分页的封装和简化

上节课我们实现了商品模块中商品分类相关的功能,这节我们继续商品模块的开发来实现商品详细相关的功能,这些功能在我们梳理出来的功能用例中,我用标记了出来。从功能用例中我们能看到与商品相关的主要功能有:商品列表商品搜索商品详情我们会实现商品模块的主要功能接口,在其中会实际应用一下我们在搭建项目定制化的响应组件中的Pagination,来简化分页查询相关的操作,在代码实现上也比普通的方式更优雅一些。本节内...

2025-03-07 08:51:33 338

原创 Go项目实战-商品分类管理和分类树的查询构造

前面三节我们完成了用户模块中的功能用例,按照我们在项目技术评审中梳理出来的功能用例图,接下来我们即将进行商品模块的功能实现。本节大纲如下:从用例图中我们能看出来商品模块主要由两大类功能用例组成:商品分类的相关功能商品信息的相关功能本节我们先来实现商品分类在商城应用中的常用功能。本节内容节选自我的专栏《Go项目搭建和整洁开发实战》请扫码订阅专栏,除了能参考专栏学习项目搭建的技能,还能结合大量实战场景...

2025-03-03 08:51:33 734

原创 Go项目实战--用户信息管理和GORM的事务管理实战

本节我们进行用户模块中最后一个功能用例--用户地址信息维护的开发,用户信息维护这个用例展开后其实还有下面这些子个用例--每个子用例对应一个具体的功能接口。本文大纲我们项目中这五个功能都已经实现,但是在文章里全展开说一遍篇幅就太长了,所以我们在教程中主要抓重点。文章里我把新增、查看收货地址列表和更新收货地址这三个功能的实现过程详细讲一下,剩余的两个功能:查看单个地址信息和删除地址信息比较简单,代码中...

2025-02-26 08:52:01 765

原创 使用 Go Convey 做BDD测试的入门指南

前面在「Go 代码测试时怎么打桩?给大家写了几个常用案例」中我们介绍了在单元测试中使用gomonkey为代码进行打桩的各种方法。今天我们介绍在Go单元测试中另外一个很好用的工具库goconvey,上面说的gomonkey属于在 Test Double 方面提供能力,也就是我们通常说的mock,用它们可以自定义一套实现来替换项目中的代码实现。而goconvey则是一个帮助我们组织和管理测试用例的框架...

2025-02-24 08:52:07 591

原创 Go 代码测试时怎么打桩?给大家写了几个常用案例

gomonkey 是 Go 生态中的一个测试打桩框架,它能在单元测试中给函数,导出方法,私有方法,接口,函数参数,全局变量等进行打桩,覆盖的场景很全。这个库由国人张晓龙开发,注意哦,不是做微信那个,那个叫张小龙。嘿嘿,看来名字叫小龙、晓龙….等等同音字的容易出牛人。今天我们就来一起看几个典型的例子熟悉它的用法常用打桩案例使用前我们还是用 go get 在项目中添加一下依赖:gogetgithu...

2025-02-13 08:51:18 937

原创 Go项目实战--用户密码的安全修改和重置

这节我们继续Go项目的实战开发,首先再看一下项目要实现的功能的用例图图中用户认证相关的功能我们已经开发完了,在前面的四节课中详细地记述了他们的设计和开发过程,这一节我们行进到功能用例的第二大部分--用户个人信息管理。前面两节我们还埋下了一个扣,说用户在修改密码后需要把用户在所有登录平台上的Token和Session全部清除掉,强制用户在每个平台上用新密码重新登录,这也是一项安全措施。那么这一节我们...

2025-02-10 08:51:26 798

原创 Go项目里的API对接,这样做Mock测试才舒服

我们在开发项目的过程中总会遇到要调用依赖方接口的情况,如果依赖方的API接口还没有开发好,通常我们会先约定好API接口的请求参数、响应结构和各类错误对应的响应码,再按照约定好请求和响应进行开发。除了上面说的情况外,还有一种就是当你开发的功能需要与微信支付类的API进行对接时,因为各种订单、签名、证书等的限制你在开发阶段也不能直接去调用支付的API来验证自己开发的程序是否能成功完成对接,这种时候我们...

2025-02-06 08:51:15 600

原创 Go项目实战-让自定义Error支持Go的errors.Is判定以及原型模式的应用

经过前面三节高代码强度的学习,相信大家都已经有点累了,本节我们不着急继续“赶路”,休息片刻!我们换个轻松点的话题,聊一聊咱们项目定制化Error--AppError 怎么支持Go语言的 errors.Is 判定,以及项目预定义的那些Error在实际使用过程中某些情况下会出现循环引用的问题,我们会利用一个原型设计模式来解决这个问题。项目定制化Error 回顾在定义项目 Error 实现错误链和发生位...

2025-01-20 08:51:22 1070

原创 Go项目实战-注册、登录、登出与用户Token体系的功能整合

前面我们用三篇教程详述了一个企业级用户认证体系的设计与实现,其中主要功能:用户Token的生成、验证和刷新都已经实现了,现在是时候把Token认证和我们的用户结合到一起啦。用户和Token有以下结合点:用户登录成功后,生成Token给用户客户端下发Token串。用户退出登录,把用户登出平台(Platform) 对应的Token和UserSession主动清除掉。用户修改密码,用户在服务端的所有To...

2025-01-15 08:51:32 997

原创 Go 项目开发实战-用户Token的刷新、踢人下线和防盗检测

上一节我们说了Token的自解释性生成算法、Token信息的在服务端的存储以及客户端携带Token请求API时服务端的Token认证逻辑。这节我们继续讲Token的刷新和主动踢人下线‍‍首先Token为啥刷新呢?很简单为了安全性用户AccessToken的时效性会相对较短,保证Token被其他恶意用户拿到后也不能长时间用它来浏览用户的数据。即然有效期短那就得有合理的方式让用户的Token能够被刷新...

2025-01-08 08:51:39 351 1

原创 Go项目开发实战 - 用户 Token 的派发、存储和认证管理

上一篇文章「企业级项目,用户认证体系怎么设计?」我们详述了实现一个企业级产品的用户认证服务的整体思路从这一节开始我们来演示如何按照思路实现一个用户认证体系,本节我们主要关注用户Token的生成、存储以及认证,下一节我们会专注Token的刷新、主动踢人下线和防盗检测。本节内容大纲如下:Token串的自解释性和生成规则我们的用户认证体系里有两种Token:AccessToken以及刷新它用的Refre...

2025-01-02 08:51:18 567

原创 Go项目实战|企业级项目用户认证体系这么设计的

这节课开始带大家设计实现一个套支持多平台登录,Token泄露检测、同平台多设备登录互踢功能的用户认证体系,这套用户认证体系既可以在你未来开发产品时直接应用,也可以在其基础上根据需要扩展出其他功能.它会作为我们后面商城App后端服务的的用户认证体系,同时又足够独立,能拿到自己的项目中去快速把用户认证给搭建起来。说到Token,很多人一开始想到的可能是JWT -- JSON Web Token。JWT...

2024-12-30 08:51:28 896

原创 Go项目实战 - 给大家做一次项目的技术评审

从这节开始我们就进入项目需求的开发阶段了,我们在专栏的第一部分主要是搭建框架,第二部分除了为框架补充需要的组件外还普及了怎么为项目做模块划分,业务逻辑如何做分层解耦。接下来的实战需求开发部分的内容大家在阅读时除了关注功能是怎么实现的,还要在看项目代码时留意一下是怎么按照我们在《Go项目模块划分、逻辑分层解耦》中讲解的方法论做分层解耦合的。这些方法论并不是铁板一块,不是说写代码只能这么写,还得靠自己...

2024-12-25 08:51:14 754

原创 Go项目搭建时要考虑哪些因素?

到这里专栏的前两部分就完结啦,在过去这十几篇文章里我带大家走过了从第一行代码到搭建出一个“功能健全”、学习成本不高、易维护、易观测的项目框架。“功能健全”我打了一个引号,因为每个人、每个团队对项目框架都有自己的需求,这里不可能说考虑的面面俱到,但是通过这十几篇搭建项目文章中阐述的思路,我相信大家完全可以在其基础上进行扩充、修改等定制化来得到一个适合自己团队和业务特性项目框架。我们在项目框架搭建初始...

2024-12-23 08:51:28 742

原创 用Option模式和对接层简化和管理Go项目的外部API

在项目开发实现功能需求的过程中不可避免的要与外部第三方系统进行交互,这些交互大部分是通过请求API接口来完成的。前几节提到但一直没带大家用代码过一遍的Lib层就是负责写第三方对接逻辑的,通过把跟第三方对接的逻辑限制在Lib层里,让项目的其他部分不需要关注第三方的逻辑,从而达到每部分都职责分明,这样项目的代码多起来后才不会变得臃肿和杂乱。不过在演示Lib层的使用前我们需要先一起给项目封装一个好用的H...

2024-12-17 08:51:14 444

原创 Redis 在Go项目中的集成和统一管理

本节我们在项目中安装和集成 go-redis,让项目能访问Redis,后面实战项目中的用户认证体系会依赖Redis来实现,像Token、Session这些都是在Redis中存储的。本节大纲如下:‍‍Redis的使用场景有不少,不过有一点需要提醒的是别把Redis当数据库用哦。这里分享一篇Redis应用场景汇总,里面罗列了十几个场景,大家有兴趣的可以看一下。go-redis 的安装和配置在我们的G...

2024-12-11 08:52:03 1019

原创 Go项目模块划分、逻辑分层解耦--代码实战

上一节我们说了项目模块划分和逻辑分层的理论基础,这节我以一个简单的创建订单功能为例,把逻辑分层解藕的方法论用实际代码再讲解一遍。演示按照可能是多数人的一个开发习惯:先定义好Model 、请求、响应等数据对象,再按照自底向上的顺序即--DAL->领域服务->应用服务->控制器的顺序进行代码编写。请扫码订阅专栏,专栏会结合大量实战场景的代码演练真正掌握代码分层和整洁开发的精髓。数据对...

2024-12-05 08:51:39 938

原创 Go项目模块划分、逻辑分层解耦--理论基础

接下来这两篇文章里我尝试给大家讲清楚业务模块划分、逻辑分层解藕的底层逻辑和方法论,结合实际例子给大家解释明白这些。这里我要再强调一点,这些方法论并不是用Go做项目、业务开发所独有的,只不过恰好我用了Go项目代码来实现和讲解它们。其他编程语言的项目也可以依据这些规则来划分模块和逻辑分层,另外这些方法论也不是我独创的,都是一些软件设计领域中沉淀已久的东西,很多书和网上的资料里都有,不过免费的资料和书籍...

2024-12-02 08:51:51 1075

原创 GORM慢查询、SQL日志与Go项目日志的整合与串联

上节内容我们详细讲解了Go项目中GORM的下载安装、初始化、读写分离和多数据源方面的内容。仅就功能来说做完这些工作后项目对Gorm的集成已经完成了,实际上有些项目确实也是这样做的。上篇文章在末尾我们提了句如果仅集成到这个程度,功能开发完全没有问题,但如果你还要长期维护项目的话,那么问题可大了去了。原因是,GORM产生的SQL记录、慢查询、以及数据库错误都是通过GORM自身的GormLogger写到...

2024-11-28 08:51:47 1042

原创 GORM 在项目中的初始化、重要连接参数和多数据源配置

这节我们开始给项目框架集成GROM,让项目能访问数据库。本篇内容我们专注Go项目集成GORM的第一阶段,即:Go项目下载和安装GORM的步骤、在项目中的初始化、讲解生产环境使用GORM时要设置哪些必要的参数、如何配置GORM的读写分离以及多数据源。下篇内容我会教大家怎么让GORM在你的Go项目中变得更好用,通过自己实现GORM Logger 把数据库操作相关的错误、慢查询、操作日志和项目的应用日志...

2024-11-20 08:55:41 928

原创 Go项目实战-API路由的分模块管理

随着项目开发的迭代,我们写的接口往往会越来越多,如果都把API的路由写到一个文件里,那么整个路由文件就会变得又乱又长,所以我们最好在项目开始阶段就给路由的分模块管理做好规划。今天这个文章给大家介绍一下Web项目API路由的分模块管理,我们的项目使用的是Gin框架,但基本上所有的Web框架都能按照这个方式来分模块管理API接口的路由。一些路由管理混乱的例子首先,我先给大家看一个曾经维护过的项目的路由...

2024-11-13 08:51:17 908

原创 Go 项目怎么做好分层架构和目录规划

开发项目的时候我们都爱说XX模块,模块一般是跟着项目所服务的业务走的。而项目的分层则没有那么依赖具体的业务类型,靠一些软件设计的方法论和经验在项目搭建初期就能大体确定其结构。我给大家介绍一下Go项目的分层架构设计,把整个项目的结构按职能进行划分,规划出整个项目的目录结构。‍‍理论讲的再好,跟自己能上手实战还是有点距离,需要大量的结合场景的代码演示才能真正掌握,请扫码订阅专栏,除了能参考专栏学习项目...

2024-11-06 08:51:43 1073

原创 Go API 多种响应的规范化处理和简化策略

一个对外提供API接口的服务,在真正动工开发接口前一般需要先确定一下接口响应的通用格式,无论接口响应里返不返回业务数据,返回的数据是字符串、列表、对象还是其他类型都会遵照这个通用的响应格式。既然一个项目接口的响应格式是确定的,那么在搭建项目的时候就需要我们提前封装一个通用的接口响应组件,让实现业务逻辑的代码能尽量傻瓜式地调用响应组件,由响应组件负责生成响应返回给客户端。这篇内容我跟大家一起分析项目...

2024-11-04 08:51:50 1061 1

原创 Go项目Error的统一规划管理和处理策略

上一篇文章我们详细讲解了怎么在搭建项目时实现 Go 的error interface 创建项目自己的Error,我们还给这个Error增加了记录错误原因和发生位置的能力。学会定制化 Go 项目的 error,回溯错误的原因和发生位置这一篇文章我们来探讨一下怎么在项目初期提前规划,把项目的各种Error统一管理起来,以及写代码遇到Error时在不同的代码层我们应该怎么处理它们。如果你想结合项目实战代...

2024-10-30 08:51:58 629

原创 学会定制化 Go 项目的 error,回溯错误的原因和发生位置

‍Go语言的Error处理一直被人吐槽,吐槽的点除了一个接一个的 if err != nil 的判断外,还有人说Go的错误太原始不能像其他语言那样在抛出异常的时候的时候传一个Casue Exception 把导致异常的整个原因链串起来。第一点确实是事实,但是写习惯了也能接受,而且对新手友好。第二点属实就有点尬黑了。用Go开发项目时想让程序抛出的 error 信息不要那么单薄,需要自己搭建项目时先做...

2024-10-28 08:51:48 957

原创 学会开发这几个中间件,Go项目就有保障啦

为了让Go项目的日志组件更好用以及产出的日志能够帮助我们快速定位问题,我在《Go日志门面的设计与实现-自动注入追踪ID标记代码位置、简化日志操作》中给项目单独定制了一个日志门面来简化项目中对日志的操作。组件开发好了,我们还得把它用起来才行,这节课介绍三个Gin框架的全局中间件,应用上它们后能让我们的项目更稳健,一些关键时间点的关键信息不需要我们手动记录,框架会帮助我们自动把这些信息记录下来。本节我...

2024-10-23 08:51:25 1024

原创 三个实用细节,让Zap在Go项目中变得更好用

这是Go实战开发的第三篇:前情提要:Go 项目配置的定制化和一体化打包方案一个项目日志功能够不够健全、记录的日志内容够不够有辨识度直接决定了一个项目维护的难度,你查日志是大海捞针一点点看,还是能够靠一些有辨识度的索引筛选出用户访问程序期间留下的包含了完整上下文的日志直接决定了你搞明白“为什么会这样”所耗费时间的多少。从本节开始我们先用两节为我们的Go项目定制日志组件,让它足够好用。未来我们会用这个...

2024-10-17 08:51:38 1039

原创 Go 项目配置的定制化和一体化打包方案

config在项目中的实现形式多种多样,小成本项目把项目存放在项目自身单独的文件中,文件格式既可以是程序文件,也可以是JSON、YAML这样的静态文件。具有相当大访问量又需要配置能热更新的项目则会使用远程配置中心。本节我们来实现项目的配置的功能。这里我们需要用到一个Go语言写的开源库使用Viper,选用Viper主要原因是支持它支持从项目文件、远端ETCD和Consul中读取配置,兼容性更高一些。...

2024-10-15 08:52:03 1124

原创 Gin项目的初始化步骤和常见错误记录

相信很多人对Go的环境安装和Gin项目的初始化都已经手拿把攥很是熟练了,本节介绍一个自己新建Go项目时非常好用的设置以及记录一下Gin项目的初始化过程和常能遇到的错误。一个容易忽略的Go ENV在安装了Go的电脑中,我们可以在命令行执行 go env 命令,查看当前的 go 环境变量:GO111MODULE=""GOARCH="amd64"GOPATH="/usrs/local/go"GO...

2024-10-09 08:51:38 1307

空空如也

空空如也

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

TA关注的人

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