76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/gorilla/mux"
|
|
"io"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
// resolve port to use
|
|
port := os.Getenv("HTTP_PORT")
|
|
if port == "" {
|
|
log.Println("No HTTP_PORT environment variable specified. Using default port 3000")
|
|
port = "3000" // default port
|
|
}
|
|
demoDataAccess() // demo accessing the json data from the external file
|
|
|
|
// setup routing
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/health", HealthHandler)
|
|
r.HandleFunc("/color/random", RandomColorHandler)
|
|
http.Handle("/", r)
|
|
|
|
// start api server (blocking)
|
|
if err := http.ListenAndServe(":"+port, nil); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// RandomColorHandler will "proxy" the request and call the color-service for a random color
|
|
func RandomColorHandler(writer http.ResponseWriter, request *http.Request) {
|
|
resp, err := http.Get("http://color-service:4000/color")
|
|
if err != nil {
|
|
writer.WriteHeader(http.StatusInternalServerError)
|
|
log.Println("Failed to fetch random color")
|
|
return
|
|
}
|
|
writer.Header().Add("Content-Type", resp.Header.Get("Content-Type"))
|
|
_, _ = io.Copy(writer, resp.Body)
|
|
}
|
|
|
|
// ColorData is simply a typing for the sample json data in data.json
|
|
type ColorData struct {
|
|
Colors []struct {
|
|
Color string `json:"color"`
|
|
Value string `json:"value"`
|
|
} `json:"colors"`
|
|
}
|
|
|
|
// demoDataAccess shows that you can mount a data file into the container and access it
|
|
func demoDataAccess() {
|
|
bytes, err := ioutil.ReadFile("/app/data.json")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var colorData ColorData
|
|
if err = json.Unmarshal(bytes, &colorData); err != nil {
|
|
panic(err)
|
|
}
|
|
log.Println("The first color: ", colorData.Colors[0])
|
|
}
|
|
|
|
// HealthHandler responds to all requests with "ok" to signal that this application is ready to receive traffic
|
|
func HealthHandler(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Add("Access-Control-Allow-Origin", "*") // CORS example ... allow requests from all domains
|
|
_, err := writer.Write([]byte("ok"))
|
|
if err != nil {
|
|
writer.WriteHeader(http.StatusInternalServerError)
|
|
log.Println("Failed to produce health check")
|
|
}
|
|
}
|