>  기사  >  Java  >  Spring Cloud의 Feign은 HTTP를 사용하여 원격 서비스를 요청합니다.

Spring Cloud의 Feign은 HTTP를 사용하여 원격 서비스를 요청합니다.

巴扎黑
巴扎黑원래의
2017-06-26 11:09:372183검색

1. Feign 소개

Spring Cloud Netflix 스택에서는 각 마이크로서비스가 자체 서비스를 HTTP 인터페이스 형식으로 노출하므로 원격 서비스 호출 시 HTTP 클라이언트를 사용해야 합니다. JDK의 기본 URLConnection, Apache의 Http 클라이언트, Netty의 비동기 HTTP 클라이언트 및 Spring의 RestTemplate을 사용할 수 있습니다. 하지만 가장 편리하고 우아한 사용 방법은 Feign입니다.

Feign은 선언적 템플릿 기반 HTTP 클라이언트입니다. Spring Cloud에서 Feign을 사용하면 HTTP를 사용하여 원격 서비스를 요청할 때 로컬 메서드를 호출하는 것과 동일한 코딩 경험을 얻을 수 있습니다. 개발자는 이것이 HTTP 요청은 물론이고 원격 메서드라는 사실도 전혀 인식하지 못합니다.

2. 스프링 클라우드에서 feign 사용

1. 종속성 추가

      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>   </dependency>

2. FeignClient 생성

@FeignClient(name="SPRING-PRODUCER-SERVER/spring")public interface FeignUserClient {
  @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)  public SpringUser findUserPost(@RequestBody SpringUser springUser);//复合类型好像默认是POST请求
}
  • @FeignClient(name="SPRING-PRODUCER-SERVER/spring ") : 인터페이스를 프록시하도록 Feign 구성 요소에 알리는 데 사용됩니다(인터페이스 구현을 작성할 필요 없음). name 속성은 호출하려는 서비스를 지정합니다. 사용자는 @Autowired를 통해 직접 주입할 수 있습니다.

  • @RequestMapping은 이 메서드를 호출할 때 GET 요청을 /group/{groupId}로 보내야 함을 의미합니다.

  • @PathVariable은 SpringMVC의 해당 주석과 동일한 의미를 갖습니다.

원리: Spring Cloud 애플리케이션이 시작되면 Feign은 @FeignClient 주석이 표시된 인터페이스를 스캔하고 프록시를 생성한 후 이를 Spring 컨테이너에 등록합니다. Feign은 프록시를 생성할 때 각 인터페이스 메소드에 대해 RequetTemplate 객체를 생성합니다. 이 객체는 HTTP 요청에 필요한 모든 정보를 캡슐화합니다. 요청 매개변수 이름, 요청 메소드 및 기타 정보는 이 프로세스에 반영됩니다.

3. 시작 클래스에 주석을 추가합니다

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClientspublic class SpringConsumerServerFeignApplication {public static void main(String[] args) {
        SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
    }
}

4. 구성 파일 application.yml

spring:
 application:
  name: spring-consumer-server-feign
server: 
 port: 8084
 context-path: /spring
#服务注册中心的配置内容,指定服务注册中心的位置
eureka:
 client:
  serviceUrl:
   defaultZone: http://user:password@localhost:8761/eureka/

3. 구성 사용자 정의

@Configurationpublic class FooConfiguration {
    @Beanpublic Contract feignContract() {//这将SpringMvc Contract 替换为feign.Contract.Defaultreturn new feign.Contract.Default();
    }
}

2.

@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class)public interface FeignUserClient {
    @RequestLine("GET /findAll/{name}")public List<SpringUser> findAll(@Param("name") String name);    
 /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
  public List<SpringUser> findAll(@PathVariable("name") String name);
  
  @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
  public SpringUser findUserPost(@RequestBody SpringUser springUser);*/}
@RequestLine:是feign的注解


为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:

logging:
 level:
  com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG
사용자 정의 구성 클래스에 로그 수준 추가
@Configurationpublic class FooConfiguration {   /* @Bean
    public Contract feignContract() {
        //这将SpringMvc Contract 替换为feign.Contract.Default
        return new feign.Contract.Default();
    }*/@Bean
    Logger.Level feignLoggerLevel() {//设置日志return Logger.Level.FULL;
    }
}

PS: 요청 시간 초과 문제

Hystrix 기본 시간 초과는 1초입니다. 초과할 경우 이때 응답이 없는 경우 , 대체 코드가 입력됩니다. 첫 번째 요청은 종종 느리고(일부 클래스를 인스턴스화해야 하는 Spring의 지연 로딩 메커니즘으로 인해) 응답 시간이 1초보다 클 수 있습니다. 예를 들어 feign을 사용하면 세 가지 해결 방법이 있습니다. 방법 1hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

이 구성은 Hystrix의 시간 초과를 5초로 변경하기 위한 구성입니다

방법 2
hystrix.command.default.execution.timeout.enabled: false
이 구성은 Hystrix
방법 3
feign.hystrix.enabled: false
이 구성은 단순히 feign의 hystrix를 비활성화하는 데 사용됩니다. 이 접근 방식은 일부 특수한 시나리오를 제외하고는 권장되지 않습니다.
아아아아

위 내용은 Spring Cloud의 Feign은 HTTP를 사용하여 원격 서비스를 요청합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.