mse-heterogeneous-demo/GinC/handler.go (70 lines of code) (raw):
package main
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"io"
"net"
"net/http"
"os"
"time"
)
var client *http.Client
var tag string
var ip string
func init() {
tag = os.Getenv("MSE_ALICLOUD_SERVICE_TAG")
if tag == "" {
tag = "base"
}
ip = getLocalIp()
client = &http.Client{Timeout: 5 * time.Second}
}
func getLocalIp() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
return ""
}
func greet(c *gin.Context) {
fmt.Printf("[GetGreet] called, header: %+v, context: %v\n", c.Request.Header, c.Request.Context())
resp, err := doGreet(c)
if err != nil {
fmt.Printf("[GetGreet] doGreet failed, err: %v\n", err)
c.String(http.StatusInternalServerError, err.Error())
return
}
c.String(http.StatusOK, resp)
}
func doGreet(ctx context.Context) (string, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("http://spring-cloud-d:20004/D/d"), nil)
if err != nil {
return "", err
}
resp, err := client.Do(req)
fmt.Printf("[getGreet] resp: %v\n", resp)
if err != nil {
return "", err
}
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("get greet failed, status code: %d", resp.StatusCode)
}
defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf("[getGreet] read resp body failed, err: %v\n", err)
return "", err
}
respData := string(b)
respData = fmt.Sprintf("C:%s:%s", ip, tag) + " - " + respData
fmt.Printf("[getGreet] respData: %v\n", respData)
return respData, nil
}