Tôi đang cố gắng lấy hai thùng chứa đang chạy một dịch vụ golang khác nhau. Cả hai dịch vụ đều được xây dựng với gói net/http
. Tôi có một giao diện API làm giao diện người dùng và dịch vụ xác thực.Golang Microservices không thể liên lạc bằng Docker for Mac
Đây là tập tin soạn của tôi:
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
Tôi biết các liên kết đang làm việc vì từ container api tôi có thể ping auth
và curl -X Post http://auth:8080/validate
nhưng trong golang tôi nhận được một dial address tcp i/o timeout
. Đây là mã 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
}
client.Do(request)
là điều đang ném lỗi Quay số. Bây giờ dịch vụ auth của tôi là thậm chí không được chạm vào bởi vì tôi có một logger mà in để sàng lọc tất cả các yêu cầu đó là đến ở.
env.AuthHost
được ánh xạ tới các biếnAUTH_HOST
môi trường.env.AuthPort
được ánh xạ tới biến môi trườngAuth_PORT
.
Trợ giúp được đánh giá cao.
Nếu nó giúp tôi chạy 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
Cả golangs Dockerfile
trông như thế này:
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:
Vì vậy, tôi chạy net.LookupHost(env.AuthHost)
trong golang và nó đang trở lại một địa chỉ IP khác nhau sau đó ping
, curl
, và thậm chí docker inspect
. Đây có phải là một điều golang không?
EDIT:
Xin lỗi vì tất cả các chỉnh sửa loại cố gắng để gỡ lỗi là ngày đi.
Nếu tôi xóa phần cổng của số authString
, yêu cầu sẽ được thông qua nhưng gặp lỗi khi phân tích phản hồi. Câu trả lời là chuyển hướng 301 bởi NGINX mà tôi nghĩ là lạ bởi vì đó không phải là ngay cả trong ngăn xếp của tôi. Tiêu đề vị trí cho chuyển hướng là localhost
, điều tôi cho là lạ.
Tôi đã thử hiển thị cổng trên máy chủ và truy cập cổng đó bằng cổng đó mà không may mắn hơn (cùng tên máy chủ).
EDIT:
Vì vậy, nó là một chỉ Mac điều tôi giả định. Tôi nhân bản các repo và chạy trên Windows 10 và tôi đã có thể kết nối với dịch vụ auth của tôi. Đây có phải là lỗi Docker for Mac không? Tôi có thể sẽ báo cáo cho họ, nhưng tôi sẽ không xem xét việc này vì nó vẫn là một vấn đề cho người dùng Mac.
tôi không nghĩ rằng khách hàng. Làm lại, bạn có thể thử thêm 'time.Sleep (10 * time.Second)' trước khi bạn quay số để có cơ hội tốt hơn của máy chủ grpc đang trực tuyến. bạn cũng có thể thử thay thế 'liên kết: -db' bằng' depends_on: -db' – Plato
Tôi không thấy cách thêm 10 giây trước khi cuộc gọi sẽ trợ giúp? Đó là lỗi không đổi. Mỗi lần tôi thử và nhấn phương pháp này cùng một lỗi, mọi lúc, không khởi động lại vùng chứa. và tôi có cần liên kết để tôi có thể giữ địa chỉ ip không? – Clemsonopoly94