服务端工程师进化史-从零开始的APP开发(1)

liaz-app / 2024-03-04 / 原文

引题

笔者开发了个漫画小说阅读APP,前前后后花了三个月,从服务端到前端,再到客户端,一路艰辛不言而喻。
附上github的提交记录:
github记录

起因

2023年年末,笔者正为“高级系统架构师”的考试准备中,因资料太过于无聊,期间走神无数、三天打鱼两天晒网,到了临考期,已经是预计考不过的;也不知道为啥,在某天晨跑期间,突发奇想,为何不自己写个APP?就冲着这个想法开始了为期三个月,全干工...(口误,hahaha),全栈开发历程。

题材与技术选型

一、应用类型
1.因人设具备二次元属性,就选择漫画与轻小说等书籍,APP类型定为阅读型APP;
二、开发计划
开发流程

服务端->管理后台前端->客户端/数据采集端

就先从服务端项目入手
原因:

一是笔者本职就是服务端开发,已熟知这方面的开发步骤与技术栈;
二是服务端本身就作为系统的心脏,血液循环全靠它;

服务端

语言选型,服务端项目无非就是java、golang,果断选择了golang,原因很简单,吾乃java工程师,平日受尽java之苦!
开个玩笑,但选golang还是有认真考虑过,多方面的技术考量,如下:

1)高效性:Golang的运行速度非常快,比Java快得多;
2)并发支持:Golang天生支持并发,可以轻松实现高并发应用程序;
3)内存管理:Golang的垃圾回收机制可以自动管理内存,避免了内存泄漏问题;
4)静态类型:Golang是一种静态类型语言,可以在编译时检查类型错误,提高代码的可靠性;
5)语法简洁:Golang的语法非常简洁,易于学习和使用;

相较golang,也不能说java它坏,有多个好用的框架、成熟的技术社区...,在java领域遇到问题,总能在网上找到前人的踩坑经历;java等等优点几乎说不完,但就一句话,编译的耗时实在让笔者平日积累不少怨气。
废话有点多,还是回到项目研发,就golang语言,计划以gin+xorm+nacos+logrus+go-oauth2+(minio/cos/oos)作为技术栈。

环境配置

系统环境配置

安装golang

brew install go

配置环境变量

echo 'export GOROOT=/usr/local/go' >> ~/.bash_profile
echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
echo 'export GO111MODULE=on' >> ~/.bash_profile
echo 'export GOPROXY=https://goproxy.cn,direct' >> ~/.bash_profile
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> ~/.bash_profile
source ~/.bash_profile

检测golang是否安装成功

go version

vscode项目环境配置

目录结构

.
├── README.md
├── admin
├── basic
├── business
├── config
├── core
└── oauth

.vscode目录配置
settings.json

{
    "go.useLanguageServer": true,
    "[go]": {
        "editor.snippetSuggestions": "none",
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": "explicit"
        }
    },
    "gopls": {
        "usePlaceholders": true,
        "completionDocumentation": true
    },
    "files.eol": "\n",
    "debug.toolBarLocation": "docked",
}

tasks.json (因预计开发后台管理接口,所以先配置admin模块启动)

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "build admin",
			"command": "go",
			"args": [
				"build",
				"-o", "${workspaceFolder}/build/admin",
				"-gcflags", "all=-N -l",
				"${workspaceFolder}/admin/main.go"
			],
			"dependsOn": ["clean"],
		},
		{
			"type": "shell",
			"label": "clean",
			"command": "rm",
			"args": [
				"-rf", "${workspaceFolder}/build"
			]
		}
	]
}

launch.json

{
    "version": "2.0.0",
    "configurations": [
        {
            "name": "admin",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "${workspaceFolder}/build/admin",
            "cwd": "${workspaceFolder}",
            "args": [
            ],
            "preLaunchTask": "build admin"
        }
    ]
}

以上环境相关的配置完毕

golang项目

开始golang项目的一些配置,因为这些配置都是笔者自己摸索出来,也不知道正统golang项目开发的目录结构是不是也是一样?有些怪异之处就请多多包涵。

采用多模块开发结构

#  项目根目录
go work init

对应生成go.work和go.work.sum文件

.
├── README.md
├── admin
├── basic
├── business
├── config
├── core
├── go.work
├── go.work.sum
└── oauth

接着对应各个模块初始化,生成go.mod文件

cd admin
go mod init
cd basic
go mod init
go business
go mod init
go core
go mod init
go oauth
go mod init

构建多个模块相互调用关系

# 回到项目根目录
go work use admin
go work use basic
go work use business
go work use core
go work use oauth

到现在基本的项目开发配置大体都搞定,对了,忘了还有.gitignore文件
.gitignore

# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories (remove the comment below to include it)
# vendor/
.vscode/
logs/
build/
cache/

# Go workspace file
go.work
go.work.sum

# Order file
.DS_Store

但这样,仅能在有界面开发工具操作,enenen...,有了引入make作为命令行构建
Makefile

.PHONY: admin compile clean

RM			:= rm -rf

PROJECT_DIR	:= $(shell pwd)
BUILD		:= build

compile:
	@echo "cd $(PROJECT_DIR)/admin && CGO_ENABLED=0 go build -ldflags="-w -s" -a -installsuffix "" -gcflags="all=-N -l" -o $(PROJECT_DIR)/$(BUILD)/admin $(PROJECT_DIR)/admin/main.go" 
	@cd $(PROJECT_DIR)/admin && CGO_ENABLED=0 go build -ldflags="-w -s" -a -installsuffix "" -gcflags="all=-N -l" -o $(PROJECT_DIR)/$(BUILD)/admin $(PROJECT_DIR)/admin/main.go

admin:
	@echo "cd $(PROJECT_DIR)/admin && CGO_ENABLED=0 go build -ldflags="-w -s" -a -installsuffix "" -gcflags="all=-N -l" -o $(PROJECT_DIR)/$(BUILD)/$@ $(PROJECT_DIR)/admin/main.go" 
	@cd $(PROJECT_DIR)/admin && CGO_ENABLED=0 go build -ldflags="-w -s" -a -installsuffix "" -gcflags="all=-N -l" -o $(PROJECT_DIR)/$(BUILD)/$@ $(PROJECT_DIR)/admin/main.go
	@echo Executing $@ complete!
	$(PROJECT_DIR)/$(BUILD)/$@

clean:
	$(RM) $(PROJECT_DIR)/$(BUILD)
	$(RM) $(PROJECT_DIR)/cache
	$(RM) $(PROJECT_DIR)/log
	@echo Cleanup complete!

现在完整的golang项目结构就搭建好了,这套配置组合探索也花了不少时间,还好最终结果是好的。
最新目录结构

.
├── Makefile
├── README.md
├── admin
│   ├── go.mod
│   └── main.go
├── basic
│   └── go.mod
├── business
│   └── go.mod
├── config
├── core
│   └── go.mod
├── go.work
├── go.work.sum
└── oauth
     └── go.mod

在admin模块创建main.go
main.go

package main

import fmt

func main() {
	fmt.Printf("hello, world!")
}

回到项目根目录,命令行启动

make admin

vscode启动则更简单,点一下即可
vscode启动

总结

到此,先告一段落,后续还会持续将每个经历步骤记录成文章下来。
下面附上成品样版图与app的gitee地址:

https://gitee.com/liaz-app/liaz-android/releases/download/1.0.0/app-arm64-v8a-release.apk

liaz