服务端工程师进化史-从零开始的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
相关推荐
小_太_阳30 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师39 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
搬码后生仔2 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
Lx3523 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小池先生3 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
百罹鸟3 小时前
【vue高频面试题—场景篇】:实现一个实时更新的倒计时组件,如何确保倒计时在页面切换时能够正常暂停和恢复?
vue.js·后端·面试
小蜗牛慢慢爬行4 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
wm10435 小时前
java web springboot
java·spring boot·后端
龙少95436 小时前
【深入理解@EnableCaching】
java·后端·spring