Go είναι μια γλώσσα προγραμματισμού γενικής χρήσης ανοιχτού κώδικα. Εμπνεύστηκε από την παραγωγικότητα της Python ενώ παράλληλα προσφέρει τις δυνατότητες της C. Αναπτύχθηκε αρχικά από την Google για την αντιμετώπιση προβλημάτων που αντιμετώπιζαν με τη βάση κώδικά τους (πολυπλοκότητα κώδικα και μεγάλος χρόνος μεταγλώττισης). Όπως κάθε άλλη σύγχρονη γλώσσα προγραμματισμού, η Go είναι κατάλληλη για κάθε είδους σκοπούς. Για παράδειγμα, θα μπορούσε να χρησιμοποιηθεί για ανάπτυξη ιστού, scripting γραμμής εντολών, εφαρμογές διακομιστή δικτύου, front-end ανάπτυξη κ.λπ.
Σε αυτόν τον οδηγό, θα σας καθοδηγήσουμε στα βήματα για την ανάπτυξη μιας απλής διαδικτυακής εφαρμογής Go στο Ubuntu 22.04 LTS. Θα υλοποιήσουμε επίσης έναν reverse proxy Nginx για τη διαχείριση του φόρτου κίνησης.
Προαπαιτούμενα
Για να εκτελέσετε τα βήματα που παρουσιάζονται σε αυτόν τον οδηγό, θα χρειαστείτε τα ακόλουθα στοιχεία προ-ρυθμισμένα:
- Ένα σωστά ρυθμισμένο Ubuntu Μάθετε περισσότερα σχετικά με τη ρύθμιση του δικού σας διακομιστή Ubuntu στο CloudSigma.
- Περιβάλλον προγραμματισμού Go με τις απαραίτητες μεταβλητές περιβάλλοντος ( $GOROOT και $GOPATH). Δείτε τον οδηγό για τη ρύθμιση του περιβάλλοντος προγραμματισμού Go στο Ubuntu.
- Nginx για reverse proxy. Αυτός ο οδηγός αναλύει την εγκατάσταση και ρύθμιση του Nginx στο Ubuntu.
- Έναν κατάλληλο επεξεργαστή κειμένου για εργασία με τον κώδικα Go, για παράδειγμα, Atom, Sublime Text, Brackets, VS Code, Vim, κ.λπ. Για αυτόν τον οδηγό, το VS Code θα είναι ο επεξεργαστής κειμένου της επιλογής μας.
Εάν η υπηρεσία πρόκειται να είναι προσβάσιμη μέσω ενός ονόματος τομέα, τότε πρέπει να έχετε ένα FQDN που να δείχνει στον διακομιστή. Σε αυτήν την περίπτωση, συνιστάται η ασφάλιση του Nginx με SSL. Μπορείτε να μάθετε περισσότερα σχετικά με την ασφάλιση του Nginx με το Let’s Encrypt στο Ubuntu από το σεμινάριό μας.
Βήμα 1 – Δημιουργία μιας διαδικτυακής εφαρμογής Go
Θα κατασκευάσουμε μια απλή διαδικτυακή εφαρμογή Go που θα εκτυπώνει “Hello World” στην οθόνη κατά την πρόσβαση στον τομέα. Επιπλέον, η εφαρμογή θα χαιρετά τον χρήστη κατά την πρόσβαση στο <domain>/greet/<username>.
Ξεκινήστε δημιουργώντας ένα νέο έργο κάτω από το $GOPATH. Δημιουργήστε τον κατάλογο του έργου:
|
1 |
mkdir -pv $GOPATH/go-web |

Αλλάξτε τον τρέχοντα κατάλογο:
|
1 |
cd $GOPATH/go-web |

Στη συνέχεια, ξεκινήστε ένα έργο:
|
1 |
go mod init <package_name> |

Στη συνέχεια, δημιουργήστε το main.go που θα χρησιμεύσει ως η ρίζα της εφαρμογής μας Go. Θα φιλοξενήσει τον πηγαίο κώδικα για τη διαδικτυακή μας εφαρμογή:
|
1 |
touch main.go |
Ανοίξτε το έργο στο VS Code:
|
1 |
code . |
Επικολλήστε τον ακόλουθο κώδικα στο αρχείο main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Ας κάνουμε μια γρήγορη ανάλυση του προγράμματος Go που μόλις δημιουργήσαμε:
- Ο όρος package main χρησιμεύει ως το σημείο εισόδου στην εφαρμογή μας. Δίνει επίσης εντολή στον μεταγλωττιστή της Go να μεταγλωττίσει το αρχείο ως εκτελέσιμο αντί για κοινόχρηστη βιβλιοθήκη.
- Η δήλωση import εισάγει όλα τα πρόσθετα modules που απαιτούνται για τη λειτουργία του προγράμματος. Εδώ, έχουμε εισαγάγει τα πακέτα fmt (για την εκτύπωση κειμένων) και net/http (για εφαρμογές διακομιστή ιστού).
- Χρησιμοποιώντας τη συνάρτηση
http.HandleFunc, δημιουργήσαμε δύο διαδρομές:
- Η πρώτη διαδρομή / χρησιμεύει ως η γονική διαδρομή εντός της func main.
- Η δεύτερη διαδρομή
/greet/ δέχεται μια παράμετρο URL (μια συμβολοσειρά, σε αυτήν την περίπτωση). Στη συνέχεια, η συμβολοσειρά εμφανίζεται συνοδευόμενη από το μήνυμα χαιρετισμού.
- URL Διαδρομή χρησιμοποιείται για την αποθήκευση της τιμής μετά από /greet/. Η τιμή στη συνέχεια μεταβιβάζεται ως το name της παραμέτρου URL.
- Η http.ListenAndServe συνάρτηση εκκινεί τον διακομιστή ιστού. Εδώ, ακούει στη θύρα 9990.
Τώρα που το πρόγραμμά μας είναι έτοιμο, μεταγλωττίστε το αρχείο σε εκτελέσιμο:
|
1 |
go build main.go |
Ο μεταγλωττιστής της Go θα δημιουργήσει ένα εκτελέσιμο με το ίδιο όνομα με το αρχείο. Δείτε το αποτέλεσμα:
|
1 |
ls -lh |
Βήμα 2 – Ρύθμιση παραμέτρων ενός αρχείου μονάδας systemd για εκτέλεση στο παρασκήνιο
Μέχρι τώρα, εάν ο τρέχων χρήστης αποσυνδεθεί από το σύστημα, η εφαρμογή ιστού Go θα σταματήσει να εκτελείται. Αυτό είναι κακός σχεδιασμός για έναν διακομιστή ιστού. Για να λύσουμε αυτό το πρόβλημα, θα δημιουργήσουμε ένα αρχείο μονάδας systemd για να τη διατηρήσουμε να εκτελείται στο παρασκήνιο, ακόμη και όταν ο χρήστης αποσυνδέεται από τον διακομιστή. Αυτό φέρνει τη ρύθμιση ένα βήμα πιο κοντά σε μια ανάπτυξη επιπέδου παραγωγής.
Δημιουργήστε ένα αποκλειστικό systemd αρχείο goweb.service κάτω από το /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Προσθέστε το ακόλουθο απόσπασμα στο αρχείο μονάδας:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Εδώ,
- Η μεταβλητή ExecStart υποδεικνύει το σημείο εισόδου για την υπηρεσία μέσω του κύριου εκτελέσιμου αρχείου που βρίσκεται στον κατάλογο του έργου μας ( $GOPATH/go-web). Σημειώστε ότι αντί να αναφέρουμε το $GOPATH, πληκτρολογήσαμε την πλήρη διαδρομή προς το εκτελέσιμο αρχείο. Αυτό συμβαίνει επειδή η μεταβλητή $GOPATH είναι ορατή μόνο στον χρήστη.
- Η μεταβλητή Restart λέει στο systemd τι να κάνει σε περίπτωση που το πρόγραμμά σταματήσει να εκτελείται. Η τιμή always λέει στο systemd να επανεκκινεί το πρόγραμμα κάθε φορά που σταματά να εκτελείται.
- Η μεταβλητή RestartSec λέει στο systemd να περιμένει ένα συγκεκριμένο χρονικό διάστημα πριν προσπαθήσει να επανεκκινήσει το πρόγραμμα. Εδώ, η τιμή έχει οριστεί σε 5s (5 δευτερόλεπτα).
- Η δήλωση WantedBy=multi-user.target καθορίζει σε ποια κατάσταση το systemd θα ενεργοποιήσει την υπηρεσία.
Αποθηκεύστε το αρχείο και κλείστε το πρόγραμμα επεξεργασίας. Εκκινήστε την υπηρεσία:
|
1 |
sudo service goweb start |

Επαληθεύστε εάν η υπηρεσία είναι σε λειτουργία:
|
1 |
sudo service goweb status |

Όπως υποδηλώνει το αποτέλεσμα, η εφαρμογή είναι σε λειτουργία. Είμαστε τώρα έτοιμοι να χρησιμοποιήσουμε το Nginx ως αντίστροφο διαμεσολαβητή (reverse proxy).
Βήμα 3 – Ρύθμιση παραμέτρων του Nginx ως αντίστροφου διαμεσολαβητή (Reverse Proxy)
Τώρα, θα δημιουργήσουμε ένα server block για το Nginx ώστε να λειτουργεί ως αντίστροφος διαμεσολαβητής. Η εφαρμογή ιστού θα εκτεθεί στο διαδίκτυο μέσω του αντίστροφου διαμεσολαβητή (για πρόσθετη απόδοση και ασφάλεια).
Αλλάξτε τον τρέχοντα ενεργό κατάλογο σε sites-available:
|
1 |
cd /etc/nginx/sites-available |

Τώρα, δημιουργήστε ένα αρχείο με το όνομα τομέα (domain name) στο οποίο θέλετε να εκθέσετε την εφαρμογή σας. Για επίδειξη, θα χρησιμοποιήσουμε το example.com:
|
1 |
sudo nano example.com |
Εισαγάγετε τον ακόλουθο κώδικα στο αρχείο block:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Εδώ, χρησιμοποιούμε το proxy_pass για να εξυπηρετήσουμε την εφαρμογή ιστού Go στη διεύθυνση IP του διακομιστή (localhost) στη θύρα 9990.
Για να ενεργοποιήσετε το block του Nginx, δημιουργήστε έναν συμβολικό σύνδεσμο (symlink, γνωστό και ως soft link) του αρχείου στον φάκελο sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Επαναφορτώστε τη ρύθμιση παραμέτρων του Nginx για να τεθούν σε ισχύ οι αλλαγές:
|
1 |
sudo nginx -s reload |
Βήμα 4 – Επαλήθευση
Αν όλα πήγαν όπως αναμενόταν, τότε η διαδικτυακή εφαρμογή θα πρέπει τώρα να είναι προσβάσιμη στο localhost:9990 και το domain που ρυθμίσαμε. Ανοίξτε τη διεύθυνση URL σε ένα πρόγραμμα περιήγησης ιστού:
|
1 |
localhost:9990 |

Όπως αναμενόταν, η εφαρμογή εμφανίζει το “Hello World” στην οθόνη. Αυτή είναι η δουλειά της κύριας διαδρομής. Στη συνέχεια, δοκιμάστε τη δεύτερη διαδρομή επισκεπτόμενοι την ακόλουθη διεύθυνση URL:
|
1 |
localhost:9990/greet/<name> |

Η εφαρμογή επιστρέφει με επιτυχία το απλό μήνυμα χαιρετισμού με το όνομα από την παράμετρο που ελήφθη από τη διεύθυνση URL.
Voila! Αναπτύξαμε με επιτυχία μια διαδικτυακή εφαρμογή Go στον τοπικό μας διακομιστή!
Τελικές Σκέψεις
Σε αυτόν τον οδηγό, δείξαμε την ανάπτυξη μιας απλής διαδικτυακής εφαρμογής Go με τη βοήθεια των τυπικών βιβλιοθηκών της Go. Επίσης, αναπτύξαμε έναν αντίστροφο διακομιστή μεσολάβησης χρησιμοποιώντας το Nginx. Αν και η επίδειξη πραγματοποιήθηκε σε τοπικό διακομιστή, για έναν δημόσιο διακομιστή, συνιστάται ανεπιφύλακτα να εγκαταστήσετε ένα πιστοποιητικό SSL για ασφαλή έκθεση στο διαδίκτυο. Για περισσότερο προγραμματισμό σε Go, μπορείτε να δείτε τον οδηγό μας σχετικά με το Δημιουργία και Εγκατάσταση Προγραμμάτων Go.
Καλή συνέχεια!


Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.