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

引题

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

起因

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

题材与技术选型

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

rust 复制代码
服务端->管理后台前端->客户端/数据采集端

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

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

服务端

语言选型,服务端项目无非就是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

go 复制代码
brew install go

配置环境变量

bash 复制代码
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 复制代码
go version

vscode项目环境配置

目录结构

arduino 复制代码
.
├── README.md
├── admin
├── basic
├── business
├── config
├── core
└── oauth

.vscode目录配置 settings.json

swift 复制代码
{
    "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模块启动)

bash 复制代码
{
	"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

bash 复制代码
{
    "version": "2.0.0",
    "configurations": [
        {
            "name": "admin",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "${workspaceFolder}/build/admin",
            "cwd": "${workspaceFolder}",
            "args": [
                "start",
                "-e", 
                "dev",
            ],
            "preLaunchTask": "build admin"
        }
    ]
}

以上环境相关的配置完毕

golang项目

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

采用多模块开发结构

csharp 复制代码
#  项目根目录
go work init

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

go 复制代码
.
├── README.md
├── admin
├── basic
├── business
├── config
├── core
├── go.work
├── go.work.sum
└── oauth

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

bash 复制代码
cd admin
go mod init admin
bash 复制代码
cd basic
go mod init basic
go 复制代码
go business
go mod init business
go 复制代码
go core
go mod init core
go 复制代码
go oauth
go mod init oauth

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

perl 复制代码
# 回到项目根目录
go work use admin
go work use basic
go work use business
go work use core
go work use oauth

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

bash 复制代码
# 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

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项目结构就搭建好了,这套配置组合探索也花了不少时间,还好最终结果是好的。 最新目录结构

go 复制代码
.
├── 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

go 复制代码
package main

import fmt

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

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

go 复制代码
make admin

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

总结

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

bash 复制代码
https://gitee.com/liaz-app/liaz-android/releases/download/1.0.0/app-arm64-v8a-release.apk
相关推荐
卷无止境20 分钟前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
狼爷1 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理1 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源1 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源2 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6662 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
周杰伦fans2 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
小蒜学长3 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
IT_陈寒3 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
打工仔折腾 AI4 小时前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战