2014-05-16 1 views
6

서비스 검색을 위해 consul을 구현하려고하는데 두 가지 문제가 있습니다. 사용자 지정 DNS 서버에 연결하고 내 net.LookupSRV() 요청을 서식 지정하는 것입니다. 여기go 응용 프로그램에서 영사 SRV 레코드를 읽으려면 어떻게해야합니까?

내가 내 이동 응용 프로그램 내에서 찾기 위해 노력하고있어입니다 :

$ dig @127.0.0.1 -p 8600 serviceb.service.consul SRV 

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @127.0.0.1 -p 8600 serviceb.service.consul SRV 
; (1 server found) 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4511 
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2 
;; WARNING: recursion requested but not available 

;; QUESTION SECTION: 
;serviceb.service.consul. IN SRV 

;; ANSWER SECTION: 
serviceb.service.consul. 0 IN SRV 1 1 80 az1-serviceb1.node.dc1.consul. 
serviceb.service.consul. 0 IN SRV 1 1 80 az2-serviceb2.node.dc1.consul. 

;; ADDITIONAL SECTION: 
az1-serviceb1.node.dc1.consul. 0 IN A 10.6.41.22 
az2-serviceb2.node.dc1.consul. 0 IN A 10.6.41.20 

;; Query time: 6 msec 
;; SERVER: 127.0.0.1#8600(127.0.0.1) 
;; WHEN: Fri May 16 15:09:28 2014 
;; MSG SIZE rcvd: 275 

을 여기에 관련 코드입니다. (나는 그것이 잘못 알고 있지만, 너무 내가 할 노력하고있어 볼 수 있습니다)

cname, addrs, err := net.LookupSRV("serviceb", "service", "consul") 
log.Printf("%+v %+v %+v", cname, addrs, err) 

출력 : 어떤 도움을 주시면 감사하겠습니다

2014/05/16 15:24:31 [] lookup _serviceb._service.consul: no such host 

! 덕분에

+0

다음은 제가 작성한 블로그 게시물입니다 : http://txt.fliglio.com/2014/05/encapsulated-services-with-consul-and-confd/ 그리고 시작된 라이브러리 프로토 타입 https://github.com/benschw/consul-clb-go –

답변

2

github.com/miekg/dns 패키지와 같이 더 예리한 도구를 사용해보십시오. 내가 마지막으로 살펴본 시점에서 클라이언트 측 설치의 모든 비트를 제어하여 DNS 확인을 할 수있었습니다.

+0

나는 이것을 가지고 놀고있다. 그러나 나는 수동으로 해석/해석하는 것보다 더 구운 해결책이 있기를 바랐다. dns 응답 구문 분석. 어떤 아이디어? –

+0

@benschwartz, 왜 수동으로? 내가 링크 된 라이브러리는 DNS 쿼리를 인코딩하고 보내고 응답을 수신하고 파싱하는 모든 작업을 수행합니다. 일반적인 경우에는 DNS 클라이언트가 비표준 DNS * 서버 설정에 신경을 쓰지 않기 때문에 한 단계 더 깊숙이 들어가기 만하면됩니다. 시스템 리졸버에게 쿼리를 수행하도록 요청하기 때문에. 이것이 표준 라이브러리의 DNS 클라이언트가 수행하는 것이며, 여기에는 사용 사례의 90 %가 포함됩니다. – kostix

+0

요청에서 Answers 배열을 구문 분석하는 더 좋은 방법은 split과 같은 문자열 도구를 사용하는 것입니까? –

0

정확한 질문에 대한 답변을 드릴 수는 없지만 그린 필드 앱의 서비스 데이터에 액세스하는 더 쉬운 방법입니다.

net/http으로 HTTP API를 호출하는 것은 매우 쉽습니다 :는 HTTP API의

package main 
import (
    "fmt" 
    "net/http" 
    "io/ioutil" 
) 
func main() { 
    resp, _ := http.Get("http://localhost:8500/v1/catalog/service/serviceb") 
    body, _ := ioutil.ReadAll(resp.Body) 
    fmt.Print(string(body)) 
} 

기본 사항은 Services Guide에 설명되어 있습니다.

관련 문제