Golang Web应用架构设计与实践

Golang Web应用架构设计与实践 我构建了Web项目开发的架构,使用了以下链接: https://github.com/golang-standards/project-layout

有人使用过这个吗?或者有人有更好的建议。该项目包含Web应用程序和Restful API。此外,我们未来还计划开发一些关于收集数据的图像处理模块。

5 回复

关于这个话题,最近在Reddit上有相关讨论,建议您前往查看。

更多关于Golang Web应用架构设计与实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  • 真是很多目录。你全都用得上吗?
  • 这个"标准"并没有告诉我们关于代码组织的任何信息。

我之前从未见过这种目录结构。

但也许你可以问一个更具体的问题。你目前进展如何?你是如何组织代码的?

我没有使用所有目录,目前正在采用这种架构,但可能会有些混乱。不过我认为代码库中的某些部分还是有用的。将代码分离到cmd目录下,使用internal和pkg目录

你有什么建议吗?也许更清晰的架构,不那么混乱 @lutzhorn

大家好,

我在我的项目中使用了这种架构。我认为它更具可读性,并且未来更具可扩展性。

https://hackernoon.com/golang-clean-archithecture-efd6d7c43047

在Golang Web应用架构设计中,使用golang-standards/project-layout作为项目结构基础是一个合理的选择,尤其适合包含Web应用、RESTful API和未来图像处理模块的项目。这个布局提供了清晰的标准目录结构,便于团队协作和代码维护。

以下是一个基于该布局的示例代码结构,展示如何组织Web应用、API和图像处理模块:

// 项目根目录结构示例:
// ├── cmd/
// │   ├── web/          # Web应用入口
// │   │   └── main.go
// │   ├── api/          # RESTful API入口
// │   │   └── main.go
// │   └── processor/    # 图像处理模块入口
// │       └── main.go
// ├── internal/
// │   ├── app/          # 应用层逻辑
// │   │   ├── web/
// │   │   │   └── handlers.go
// │   │   ├── api/
// │   │   │   └── handlers.go
// │   │   └── processor/
// │   │       └── image.go
// │   ├── domain/       # 领域模型
// │   │   └── models.go
// │   └── pkg/          # 内部共享包
// │       └── utils/
// ├── pkg/              # 外部可用的库代码
// │   └── imageproc/
// ├── web/              # Web静态资源
// │   ├── templates/
// │   └── static/
// └── configs/          # 配置文件
//     └── config.yaml

示例代码实现:

  1. Web应用入口 (cmd/web/main.go):
package main

import (
    "log"
    "net/http"
    "yourproject/internal/app/web"
)

func main() {
    http.HandleFunc("/", web.HomeHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
  1. RESTful API入口 (cmd/api/main.go):
package main

import (
    "log"
    "net/http"
    "yourproject/internal/app/api"
)

func main() {
    http.HandleFunc("/api/v1/data", api.DataHandler)
    log.Fatal(http.ListenAndServe(":8081", nil))
}
  1. 图像处理模块 (internal/app/processor/image.go):
package processor

import (
    "image"
    "image/jpeg"
    "os"
)

// ProcessImage 处理图像数据的示例函数
func ProcessImage(inputPath, outputPath string) error {
    file, err := os.Open(inputPath)
    if err != nil {
        return err
    }
    defer file.Close()

    img, _, err := image.Decode(file)
    if err != nil {
        return err
    }

    out, err := os.Create(outputPath)
    if err != nil {
        return err
    }
    defer out.Close()

    return jpeg.Encode(out, img, nil)
}
  1. API处理器 (internal/app/api/handlers.go):
package api

import (
    "encoding/json"
    "net/http"
    "yourproject/internal/domain"
)

func DataHandler(w http.ResponseWriter, r *http.Request) {
    data := domain.Data{ID: 1, Content: "sample data"}
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(data)
}
  1. 领域模型 (internal/domain/models.go):
package domain

type Data struct {
    ID      int    `json:"id"`
    Content string `json:"content"`
}

type ImageRequest struct {
    InputPath  string `json:"input_path"`
    OutputPath string `json:"output_path"`
}

这种架构支持模块化开发,便于测试和扩展。对于图像处理模块,可以进一步在pkg/imageproc中实现可重用的处理函数,而在internal/app/processor中封装业务逻辑。RESTful API可以通过标准库或框架(如Gin或Echo)实现,根据项目复杂度选择。

回到顶部