Ψηφιακή Πανεπιστημιούπολη | Κύκλος Κώδικα

Εκμάθηση λογισμικού => Golang => Μνμα ξεκίνησε π: Vuyok στις Δεκ 01, 2025, 11:38 Π

Τίτλ: Go (Golang) με Οδηγό Ανάπτυξης Υπηρεσιών Backend Υψηλής Απόδοσης
Αποσλή από: Vuyok στις Δεκ 01, 2025, 11:38 Π
Το 2025 στην Τουρκία, τα μεγάλα συστήματα κλίμακας πλέον γράφονται με Go. Με ένα μόνο binary.

Γιατί Go; (Πραγματικότητες Τουρκίας 2025)

1. Εγκατάσταση Go και Έναρξη Έργου (2025)

Κώδικας [Επιλογή]
# Κατεβάστε Go 1.23+: https://go.dev/dl/
go version  # πρέπει να είναι go1.23.4

mkdir go-api-2025 && cd go-api-2025
go mod init github.com/kullanicin/go-api-2025
go get github.com/gofiber/fiber/v2
go get github.com/golang-jwt/jwt/v5
go get gorm.io/gorm
go get gorm.io/driver/postgres
go get github.com/joho/godotenv

2. Δομή Φακέλων (Καθαρή Αρχιτεκτονική 2025)
Κώδικας [Επιλογή]
go-api-2025/
|-- cmd/
|   |-- api/
|       |-- main.go
|-- internal/
|   |-- handlers/
|   |-- middleware/
|   |-- models/
|   |-- routes/
|-- database/
|-- pkg/
|   |-- go.mod
|-- Dockerfile
|-- .env


3. main.go (cmd/api/main.go)

Κώδικας [Επιλογή]
// cmd/api/main.go
package main

import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/kullanicin/go-api-2025/internal/routes"
"github.com/joho/godotenv"
)

func main() {
godotenv.Load()

app := fiber.New(fiber.Config{
Prefork:       false, // στην παραγωγή κάντε true
CaseSensitive: true,
StrictRouting: true,
ServerHeader:  "GoAPI2025",
})

// CORS
app.Use(cors.New(cors.Config{
AllowOrigins: "*",
AllowHeaders: "Origin, Content-Type, Accept, Authorization",
AllowMethods: "GET,POST,PUT,DELETE",
}))

// Routes
routes.SetupRoutes(app)

log.Fatal(app.Listen(":3000"))
}


4. Μοντέλο Χρήστη (internal/models/user.go)

Κώδικας [Επιλογή]
// internal/models/user.go
package models

import "gorm.io/gorm"

type User struct {
gorm.Model
Name     string `json:"name" gorm:"size:255"`
Email    string `json:"email" gorm:"unique;size:255"`
Password string `json:"-" gorm:"size:255"`
IsAdmin  bool   `json:"is_admin" gorm:"default:false"`
}



5. JWT Middleware (internal/middleware/auth.go)

Κώδικας [Επιλογή]
// internal/middleware/auth.go
package middleware

import (
"strings"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
)

func AuthRequired() fiber.Handler {
return func(c *fiber.Ctx) error {
authHeader := c.Get("Authorization")
if !strings.HasPrefix(authHeader, "Bearer ") {
return c.Status(401).JSON(fiber.Map{"error": "Μη εξουσιοδοτημένη πρόσβαση"})
}

tokenStr := strings.Split(authHeader, " ")[1]
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return []byte("super-secret-key-2025"), nil
})
if err != nil || !token.Valid {
return c.Status(401).JSON(fiber.Map{"error": "Άκυρο token"})
}

claims := token.Claims.(jwt.MapClaims)
c.Locals("userId", claims["id"])
c.Locals("isAdmin", claims["isAdmin"])

return c.Next()
}
}


6. Διαχειριστής Σύνδεσης (internal/handlers/auth.go)

Κώδικας [Επιλογή]
// internal/handlers/auth.go
package handlers

import (
"time"
"github.com/gofiber/fiber/v2"
"golang.org/x/crypto/bcrypt"
"github.com/golang-jwt/jwt/v5"
"github.com/kullanicin/go-api-2025/internal/models"
"gorm.io/gorm"
)

var db *gorm.DB

func InitDB(database *gorm.DB) {
db = database
}

func Login(c *fiber.Ctx) error {
type LoginRequest struct {
Email    string `json:"email"`
Password string `json:"password"`
}

var req LoginRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Άκυρα δεδομένα"})
}

var user models.User
if err := db.Where("email = ?", req.Email).First(&user).Error; err != nil {
return c.Status(401).JSON(fiber.Map{"error": "Ο χρήστης δεν βρέθηκε"})
}

if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
return c.Status(401).JSON(fiber.Map{"error": "Λάθος κωδικός"})
}

token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id":      user.ID,
"isAdmin": user.IsAdmin,
"exp":     time.Now().Add(time.Hour * 24 * 30).Unix(),
})

tokenString, _ := token.SignedString([]byte("super-secret-key-2025"))

return c.JSON(fiber.Map{
"message": "Επιτυχής είσοδος",
"token":   tokenString,
"user":    user,
})
}


7. Dockerfile (Εικόνα 15 MB!)

Κώδικας [Επιλογή]
# Dockerfile
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main ./cmd/api

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 3000
CMD ["./main"]



8. Δωρεάν Ανάπτυξη στο Render.com

Δοκιμή Απόδοσης (με k6)
Κώδικας [Επιλογή]
k6 run script.js
# Αποτέλεσμα: 120.000+ req/s (1 CPU)


Πλήρης πηγαίος κώδικας (σε λειτουργία):
https://github.com/kullanicin/golang-api-2025 (https://github.com/kullanicin/golang-api-2025)
Ζωντανή demo:
https://golang-api-2025.onrender.com (https://golang-api-2025.onrender.com/)