이전 기사에서는 resttemplate를 통해 다른 서비스의 API를 호출 할 때 필요한 매개 변수를 요청 된 URL에 접합해야 함을 알 수 있습니다. 매개 변수가 적은 경우이를 견고 할 수 있습니다. 여러 매개 변수가 있으면 요청 문자열이 비효율적이며 어리석은 것처럼 보입니다.
더 나은 솔루션이 있습니까? 답은 확실하며 Netflix는 우리에게 Feign이라는 프레임 워크를 제공했습니다.
Feign은 선언적 웹 서비스 클라이언트이며 목적은 웹 서비스 호출을 더 간단하게 만드는 것입니다. Feign은 HTTP 요청에 대한 템플릿을 제공합니다. 간단한 인터페이스 및 삽입 주석을 작성하면 HTTP 요청의 매개 변수, 형식, 주소 및 기타 정보를 정의 할 수 있습니다.
Feign은 HTTP 요청을 완전히 프록시로 프록시하며 서비스 요청 및 관련 처리를 완료하기위한 메소드를 호출하는 것만 큼 호출하면됩니다. Feign은 리본과 히스트릭스를 통합합니다 (나중에 Hystrix에 대해 이야기 할 것입니다). 따라서 더 이상이 두 구성 요소를 명시 적으로 사용할 수 없습니다.
요컨대, Feign은 다음과 같은 특성을 가지고 있습니다.
이것은 SpringMVC 패턴의 컨트롤러 계층의 요청 매핑 매핑과 비슷합니다. 이 패턴은 우리가 정말 좋아하는 것입니다. Feign은 @feignclient를 사용하여 서비스를 매핑합니다.
첫째, 첫 번째 단계는 원래 기준으로 새로운 Feign 모듈을 작성한 다음 관련 종속성 및 Feign 종속성을 도입하는 것입니다.
<pectionency> <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Eureka </artifactid> <3.5. release </version> </dependency> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud </artifeign> <버전> 1.4.0. Release </version> </fectionency>
application.yml 구성은 다음과 같습니다.
서버 : 8083Spring : 응용 프로그램 : 이름 : Feign-Consumereureka : Client : Service-URL : http : // localhost : 8888/eureka/, http : // localhost : 8889/eureka/
그런 다음 이전 기사에서는 다음 코드와 같이 몇 가지 새로운 방법이 두 Provider1 및 Provider2 모듈 서비스에 추가됩니다.
/*** 2018/5/8에 Cong에 의해 만들어졌습니다. */ @restControllerPublic Class HelloController {@requestmapping ( "/hello") public String hello () {System.out.println ( "Access Comes 1 ..."); "hello1"을 반환합니다. } @requestmapping ( "/hjcs") public list <string> laowangs (String ids) {list <string> list = new arraylist <> (); list.add ( "laowang1"); list.add ( "laowang2"); list.add ( "laowang3"); 반환 목록; } // 추가 메소드 @RequestMapping (value = "/hellol", method = requestMethod.get) public String Hello (@requestParam 문자열 이름) {return "hello" + name; } @requestmapping (value = "/hello2", method = requestmethod.get) public user hello (@requestheader 문자열 이름, @requestheader integer age) {return 새 사용자 (이름, 나이); } @requestmapping (value = "/hello3", method = requestmethod.post) public string hello (@requestbody user user) {return "hello"+ user. getName () + "," + 사용자. getage (); }}다음은 위 코드에 필요한 사용자 클래스이며 코드는 다음과 같습니다.
/*** Cong 2017/12/2에 의해 생성되었습니다. */public class user {개인 문자열 이름; 개인 정수 시대; // 전송을 직렬화 할 때 빈 생성자가 있어야합니다. 그렇지 않으면 오류가 발생합니다. public user () {} public user (문자열 이름, 정수 시대) {this.name = name; this.age = age; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public integer getage () {return age; } public void setage (정수 시대) {this.age = age; }}다음으로 Feign의 @feignclient ( "서비스 이름")를 사용하여 서비스 호출을 매핑하십시오. 코드는 다음과 같습니다.
패키지 hjc; import org.springframework.cloud.netflix.feign.feignclient; import org.springframework.web.bind.annotation.*;/*** Cong에 의해 생성 된 2018/5/17. */// configuration = xxx.class이 클래스는 hystrix // value = "value ="hello-service ", follback = feignfall.class) 공개 인터페이스 @requestmapping ("/hello ") 문자열 ("/hello ")의 맵핑 경로 {); @requestmapping (value = "/hellol", method = requestmethod.get) string hello (@requestparam ( "name") 문자열 이름); @requestmapping (value = "/hello2", method = requestmethod.get) user hello (@requestheader ( "name") 문자열 이름, @requestheader ( "age") 정수기); @requestmapping (value = "/hello3", method = requestmethod.post) 문자열 Hello (@requestbody 사용자);}그런 다음 Feiservice 인터페이스를 컨트롤러 계층에 주입하여 원격 서비스 호출을 수행하십시오. 코드는 다음과 같습니다.
/*** Cong에 의해 2018/5/17에 의해 만들어졌습니다. */ @restControllerPublic 클래스 CONCERERCONTROLLER {@autowired feignservice feignservice; @requestmapping ( "/consumer") public string helloconsumer () {return feignservice.hello (); } @requestmapping ( "/consumer2") public string helloconsumer2 () {String r1 = feignservice.hello ( "hjc"); 문자열 r2 = feignservice.hello ( "hjc", 23) .toString (); 문자열 r3 = feignservice.hello (새 사용자 ( "hjc", 23)); r1 + "-----" + r2 + "----" + r3; }}그런 다음 Feign 모듈의 시작 클래스 @enablediscoveryclient feign 클라이언트 주석에 유레카 클라이언트에 주석을 달 수있는 곳
@enablefeignClients, 코드는 다음과 같습니다.@springbootApplication@enablediscoveryclient@enablefeignclientsspublic class feignApplication {public static void main (String [] args) {springApplication.run (feignApplication.class, args); }}그런 다음 시작 클래스를 시작하고 브라우저에 LocalHost : 8083/소비자를 입력하면 실행 결과는 다음과 같습니다.
부하 밸런싱 폴링이 Hello1 및 Hello2가 나타나는 것을 알 수 있습니다.
그런 다음 브라우저에 LocalHost : 8083/Consumer2를 계속 입력하면 실행 결과는 다음과 같습니다.
다음으로, 우리는 Feign Declarative Call Service에 따라 서비스 다운 그레이드를 사용합니다. 그런 다음 feiservice를 상속하기 위해 새로운 feignfallback 클래스를 만들어야합니다. 코드는 다음과 같습니다.
패키지 hjc; import org.springframework.stereotyp.component;/*** Cong에 의해 생성 된 2018/5/17. */ @ComponentPublic Class Feignfallback은 Feignservice {// 구현 방법은 다운 그레이드 서비스 통화 @override public String hello () {return "error"; } @override public String hello (문자열 이름) {return "error"; } @override public user hello (문자열 이름, 정수 시대) {return new user (); } @override public String Hello (사용자 사용자) {return "error"; }}그런 다음 두 서비스 제공 업체 모듈 제공자 및 Provider2 모듈을 중지하고 실행 결과는 다음과 같습니다.
우리의 통화에는 모두 다운 그레이드 된 서비스가 있음을 알 수 있습니다.
그런 다음 hystrix의 매개 변수를 정확하게 제어하려면 Hystrix와 결합 된 매개 변수를 Configuration = xxx class.class 속성을 구성하여 어떤 클래스의 속성을 정확하게 지정하도록 구성 할 수 있습니다.
또는 다음과 같이 Application.yml에서 구성하십시오.
Hystrix : 명령 : 기본값 : 실행 : 고리 : 스레드 : TimeOutinMilliseconds : 5000Ribbon : ConnectTimeout : 500 #hello-service : Ribbon : 500과 같이 별도의 서비스를 자세히 구성하려는 경우.
이는 대부분의 시나리오의 호출을 충족하지만 훌륭한 시나리오를 작성하는 경우에도 기본 Hystrix를 사용하고 이전의 Hystrix 사용을 따라야합니다. 다음과 같이 Feign 클라이언트 호출을 사용하지 마십시오.
/*** Cong에 의해 2018/5/17에 의해 만들어졌습니다. */public class hjccommand 확장 hystrixcommand {protected hjccommand (hystrixcommandgroupkey group) {super (group); } @override protected object run ()은 예외를 던지고 {return null; }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.