mse-simple-demo/GoApp/service.go (115 lines of code) (raw):
package main
import (
"context"
"errors"
"fmt"
"io"
"net"
"net/http"
"os"
"sync"
"time"
)
const localhost = "127.0.0.1"
var httpClient *http.Client
var tag string
var ip string
func init() {
httpClient = &http.Client{
Timeout: time.Second * 3,
Transport: http.DefaultTransport,
}
tag = os.Getenv("MSE_ALICLOUD_SERVICE_TAG")
ip = getIp()
}
func getResponseBody(resp *http.Response) ([]byte, error) {
if resp == nil || resp.StatusCode != http.StatusOK {
return nil, errors.New(fmt.Sprintf("http request status code not 200: %d", resp.StatusCode))
}
defer func() {
if resp.Body != nil {
resp.Body.Close()
}
}()
b, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return b, nil
}
func getIp() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return localhost
}
for _, addr := range addrs {
// 检查网络地址是否是IP地址(而非IP网络)
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
// 仅保留IPv4地址
if ipNet.IP.To4() != nil {
return ipNet.IP.String()
}
}
}
return localhost
}
func toApp(ctx context.Context, host string, path string) (string, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("http://%s%s", host, path), nil)
if err != nil {
fmt.Printf("[toA] new http request with context error: %v\n", err)
return "", err
}
resp, err := httpClient.Do(req)
if err != nil {
fmt.Printf("[toA] http request error: %v\n", err)
return "", err
}
b, err := getResponseBody(resp)
if err != nil {
fmt.Printf("[toA] get response body error: %v\n", err)
return "", err
}
return fmt.Sprintf("GoApp[tag=%s][%s][config=%s]", tag, ip, "") + " -> " + string(b), nil
}
func toA(ctx context.Context) (string, error) {
return toApp(ctx, "spring-cloud-a:20001", "/a")
}
func toABC(ctx context.Context) (string, error) {
w := sync.WaitGroup{}
w.Add(3)
var aResp, bResp, cResp string
var aErr, bErr, cErr error
go func() {
aResp, aErr = toApp(ctx, "spring-cloud-a:20001", "/a")
if aErr != nil {
fmt.Printf("[toABC] to a error: %v\n", aErr)
aResp = aErr.Error()
}
w.Done()
}()
go func() {
bResp, bErr = toApp(ctx, "spring-cloud-b:20002", "/b")
if bErr != nil {
fmt.Printf("[toABC] to b error: %v\n", bErr)
bResp = bErr.Error()
}
w.Done()
}()
go func() {
cResp, cErr = toApp(ctx, "spring-cloud-c:20003", "/c")
if cErr != nil {
fmt.Printf("[toABC] to c error: %v\n", cErr)
cResp = cErr.Error()
}
w.Done()
}()
w.Wait()
return aResp + "\n" + bResp + "\n" + cResp, nil
}
func flow(ctx context.Context) (string, error) {
return "", nil
}
func paramHot(ctx context.Context) (string, error) {
return "", nil
}
func isolate(ctx context.Context) (string, error) {
return "", nil
}