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

引题

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

起因

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": [
                "start",
                "-e", 
                "dev",
            ],
            "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 admin
cd basic
go mod init basic
go business
go mod init business
go core
go mod init core
go oauth
go mod init oauth

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

# 回到项目根目录
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: liaz-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

liaz-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启动则更简单,点一下即可
000.jpg

总结

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

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

Screenshot_2024-03-03-15-27-17-928_xyz.liaz.liaz.jpg

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值