Próbuję uzyskać dwa kontenery, z których każdy ma inną usługę golang. Obie usługi zostały zbudowane za pomocą pakietu net/http
. Mam frontend API jako jeden i serwer zaplecza uwierzytelniania.Golang Microservices nie może komunikować się za pomocą Docker na Maca
Oto moja komponować pliku:
version: "2"
services:
staticfiles:
build: ./files
volumes:
- /public
- /views
api:
build: ./api
environment:
- PORT=8080
- BASE_URL=https://example.org
- AUTH_HOST=auth
- AUTH_PORT=8080
- VIEW_DIR=/views
- PUBLIC_DIR=/public
ports:
- "80:8080"
volumes_from:
- staticfiles:ro
links:
- auth
depends_on:
- staticfiles
db:
build: ./postgres
environment:
- POSTGRES_USER=inheritor
- POSTGRES_DB=inheritor
auth:
build: ./auth
expose:
- "8080"
environment:
- PORT=8080
- DB_USER=inheritor
- DB_NAME=inheritor
- DB_HOST=db
- DB_Port=5432
links:
- db
wiem linki działają, ponieważ z pojemnika api mogę ping auth
i curl -X Post http://auth:8080/validate
ale w golang mogę dostać dial address tcp i/o timeout
. Oto kod golang.
var (
authString = "http://" + env.AuthHost + ":" + env.AuthPort
)
//ValidateToken validates a token using the session in DB
func ValidateToken(req *model.ValidateRequest) (*model.JWTClaims, error) {
client := new(http.Client)
api := authString + "/validate"
cont, err := model.Jsonify(req)
if err != nil {
return nil, exception.NewInternalError("Could not turn the request into a json object.")
}
request, err := http.NewRequest("POST", api, bytes.NewBuffer(cont))
if err != nil {
return nil, exception.NewInternalError("Could not create request: " + err.Error())
}
request.Header.Set("Content-type", "application/json")
response, err := client.Do(request)
if err != nil {
return nil, exception.NewInternalError("Could not make the request: " + err.Error())
}
defer response.Body.Close()
res := new(model.AuthResponse)
res.Claims = new(model.JWTClaims)
decoder := json.NewDecoder(response.Body)
err = decoder.Decode(&res)
spew.Dump(response.Body)
if err != nil {
return nil, exception.NewInternalError("Could not parse response back from auth service. " + err.Error())
}
if response.StatusCode != http.StatusOK {
return nil, exception.NewInvalidJWTError(res.Error)
}
return res.Claims, nil
}
To, co rzuca błąd Dial. Teraz mój serwis auth nie jest nawet dotknięciu bo mam rejestrator, który drukuje na ekran każdy wniosek, który przychodzi w.
env.AuthHost
jest odwzorowana na zmiennejAUTH_HOST
środowiska.env.AuthPort
jest zmapowany do zmiennej środowiskowejAuth_PORT
.
Znaczna pomoc jest doceniana.
Jeśli to pomaga, uruchamiam system MacOSX.
Client:
Version: 1.12.0-rc4
API version: 1.24
Go version: go1.6.2
Git commit: e4a0dbc
Built: Wed Jul 13 03:28:51 2016
OS/Arch: darwin/amd64
Experimental: true
Server:
Version: 1.12.0-rc4
API version: 1.24
Go version: go1.6.2
Git commit: e4a0dbc
Built: Wed Jul 13 03:28:51 2016
OS/Arch: linux/amd64
Experimental: true
Oba golangs Dockerfile
wygląda następująco:
FROM golang:1.6
RUN mkdir -p /go/src/github.com/dixonwille/Inheritor/api
WORKDIR /go/src/github.com/dixonwille/Inheritor/api
COPY . /go/src/github.com/dixonwille/Inheritor/api
RUN go build -v -o Inheritor cmd/Inheritor/main.go
USER nobody
ENTRYPOINT ["./Inheritor"]
EDIT:
Więc wpadłem net.LookupHost(env.AuthHost)
ciągu golang i wraca inny adres IP, a następnie ping
, curl
, a nawet docker inspect
. Czy to jest golang?
EDIT:
Niestety dla wszystkich edycji rodzaj próbujących debugowania jak dzień przechodzi.
Po usunięciu części portu authString
, żądanie przechodzi, ale pojawia się błąd podczas analizowania odpowiedzi. Odpowiedzią jest przekierowanie 301 wykonane przez NGINX, co moim zdaniem jest dziwne, ponieważ nie jest to nawet w moim stosie. Nagłówek lokalizacji przekierowania to localhost
, co również uważam za dziwne.
Próbowałem eksponować port na hoście i uzyskując do niego dostęp za pomocą tego portu bez większych problemów (ta sama nazwa hosta).
EDIT:
Więc jest to tylko sprawa Mac zakładam. Sklonowałem repozytorium i uruchomiłem Windows 10 i mogłem połączyć się z moją autoryzowaną usługą. Czy to był błąd Docker na Maca? Prawdopodobnie zgłoszę je do nich, ale nie uważam tego za zamknięty, ponieważ nadal jest to problem dla użytkowników komputerów Mac.
Nie sądzę, aby klient próbował ponownie, możesz spróbować dodać 'time.Sleep (10 * time.Second)' przed wybraniem numeru, aby zwiększyć szanse na to, że serwer Grpc będzie online. możesz także spróbować zastąpić 'links: -db' z' depend_on: -db' – Plato
Nie widzę, jak pomocne może być dodanie 10 sekund przed wywołaniem? Jest to stały błąd. Za każdym razem, gdy próbuję trafić tę samą metodę za każdym razem, żaden kontener się nie restartuje. i czy nie potrzebowałbym linków, aby uzyskać adres IP? – Clemsonopoly94