Spring Cloud Netflix 스택에서 각 마이크로 서비스는 HTTP 인터페이스 형태로 자체 서비스를 노출하므로 원격 서비스를 호출 할 때 HTTP 클라이언트를 사용해야합니다. JDK Native UrlConnection, Apache의 HTTP 클라이언트, Netty의 비동기 HTTP 클라이언트 및 Spring 's RestTemplate를 사용할 수 있습니다. 그러나 사용하기 가장 편리하고 우아한 것은 Feign입니다.
Feign 소개
Feign은 선언적이고 템플릿 HTTP 클라이언트입니다. Spring Cloud에서 Feign을 사용하여 HTTP를 사용하여 원격 서비스를 요청할 때 로컬 메소드를 호출하는 것과 동일한 인코딩 경험을 달성 할 수 있습니다. 개발자는 이것이 원격 방법이라는 것을 완전히 인식 할 수 없으며 이것이 HTTP 요청임을 알 수 없습니다. 예를 들어:
@autowiredPrivate 광고품 예비 서비스 서비스; // 원격 서비스 public public publicgroupvo foo (Integer GroupId) {return service.findbyGroupId (GroupId); // http를 통해 원격 서비스에 전화하십시오} 개발자는 HTTP 요청을 보내고 HTTP 리턴을 해독하고 service.findByGroupId() .
Feign의 정의
FEIGN이 요청을 호출 할 때 요청을 보낼 주소를 알리고 요청을 위해 취할 매개 변수를 알리려면 인터페이스를 정의해야합니다.
@feignclient (name = "ea") // [a] public 인터페이스 광고 광고 vacklegroupremoteservice {@requestmapping (value = "/group/{groupid}", method = requestmethod.get) // [b] findbygroupid (@pathvarible ( "groupid") intgerproupid) // "/group/{groupId}", method = requestMethod.put) void update (@PathVariable ( "groupId") 정수 GroupId, @requestParam ( "GroupName") String GroupName)A : @FeignClient는 FEIGN 구성 요소에 인터페이스를 프록시하도록 통지하는 데 사용되며 (인터페이스 구현을 작성할 필요는 없음) 사용자는 @autowired를 통해 직접 주입 할 수 있습니다.
b : @requestmapping이라는 것은이 메소드를 호출 할 때 /group/{groupId} 에 get 요청을 보내야한다는 것을 의미합니다.
C : @PathVariable은 SpringMVC의 해당 주석과 동일한 의미를 갖습니다.
Spring Cloud 응용 프로그램이 시작되면 Feign은 @feignclient 주석으로 표시된 인터페이스를 스캔하고 프록시를 생성 한 다음 스프링 컨테이너에 등록합니다. 프록시를 생성 할 때 Feign은 각 인터페이스 메소드에 대한 RequetMplate 객체를 만듭니다. 이 개체는 HTTP 요청에 필요한 모든 정보를 캡슐화합니다. 요청 매개 변수 이름, 요청 메소드 및 기타 정보는이 프로세스에서 결정됩니다. Feign의 주형화는 여기에 반영됩니다.
이 예에서는 Feign을 유레카 및 리본과 함께 사용합니다 ,@FeignClient(name = "ea") 서비스 URL을 얻기 위해이 인터페이스 메소드를 호출 할 때 EA라는 서비스에 대해 Query eureka에 feign을 알리는 것을 의미합니다.
Feign 's Encoder, Decoder 및 Errordecoder
메소드 서명의 메소드 매개 변수 개체를 요청 매개 변수로 직렬화하고 HTTP 요청에 넣는 Feign의 프로세스는 인코더 (인코더)에 의해 완료됩니다. 마찬가지로, HTTP 응답 데이터를 Java 물체로 버제 화하는 것은 디코더 (디코더)에 의해 수행된다.
기본적으로 Feign은 @requestparam 주석으로 표시된 매개 변수를 문자열로 변환하고 URL에 추가하고 Jackson을 통해 주석없이 매개 변수를 요청 본문에 넣습니다. @RequetMapping의 메소드가 요청 메소드를 POST로 지정하면 예를 들어 다음과 같은 모든 매개 변수가 무시됩니다.
@requestmapping (value = "/group/{groupid}", method = requestmethod.get) void update (@pathvarible ( "groupid") integer groupid, @requestparam ( "GroupName") String GroupName, dataObject obj);현재 GET 요청에는 요청 본문이 없기 때문에 OBJ 매개 변수는 무시됩니다.
스프링 클라우드 환경에서 Feign의 인코더*는 주석에 추가되지 않은 매개 변수를 인코딩하는 데만 사용됩니다. 인코더를 사용자 정의하면 OBJ 매개 변수를 인코딩 할 때만 인코더가 호출됩니다. 디코더의 경우, 기본 대의원은 디코딩을 위해 SpringMVC의 매핑 Jackson2HTTPMESSAGECONVERTER 클래스에 대한 대의원입니다. ErrordeCoder는 상태 코드가 200에서 300 사이가 아닌 경우에만 호출됩니다. ErrordeCoder의 기능은 HTTP 응답 정보를 기반으로 예외를 반환하는 것입니다. 우리는 현재 errordecoder를 사용하여 Feign 인터페이스가 발신자가 처리 할 비즈니스 예외를 던지도록합니다.
Feign의 HTTP 클라이언트
기본적으로 Feign은 JDK 기본 URLConnection을 사용하여 HTTP 요청을 보냅니다. 연결 풀은 없지만 각 주소에 대해 긴 연결이 유지됩니다. 즉, HTTP의 지속성 연결이 사용됩니다. 우리는 Feign의 원래 HTTP 클라이언트를 Apache의 HTTP 클라이언트로 교체하여 연결 풀, 타임 아웃 등과 같은 성능과 feign-httpclient 관련된 제어 기능을 얻을 수 있습니다. Spring Cloud는 Brixtion.sr5 버전 이후이 교체를 지원합니다.
<!-Feign Native httpclient를 Apache httpclient-> <pectionency> <groupid> org.apache.httpcomponents </groupid> <artifactid> httpclient </fectionency> <groupid> com.netflix.feign> <artifactid> htifcclient> <버전> $ {feign-httpclient} </version> </fectionency>그런 다음 Application.properties를 추가하십시오.
feign.httpclient.enabled = true
요약
Feign을 통해 HTTP 원격 통화를 개발자에게 완전히 투명하게 만들고 로컬 방법을 호출하는 것과 일치하는 코딩 경험을 얻을 수 있습니다. 이것은 Alibaba Dubbo에서 원격 서비스가 노출되는 방식과 유사합니다. 차이점은 Dubbo는 개인 바이너리 프로토콜을 기반으로하는 반면 Feign은 본질적으로 HTTP 클라이언트입니다. Spring Cloud Netflix를 사용하여 마이크로 서비스를 구축하는 경우 Feign이 의심 할 여지없이 최선의 선택입니다.
위는 Spring Cloud Feign을 HTTP 클라이언트로 사용하여 원격 HTTP 서비스 (권장)를 호출하는 방법입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!