스프링 클 라 우 드 알 리 바 바 학습 노트 (4) - Feign

Feign 이란 무엇 인가
Feign 은 성명 식 웹 서비스 클 라 이언 트 입 니 다.Feign 을 사용 하면 웹 서비스 클 라 이언 트 를 더욱 간단하게 만 들 수 있 습 니 다. 사용 방법 은 인 터 페 이 스 를 정의 한 다음 에 주석 을 추가 하 는 동시에 JAX - RS 표준 주석 도 지원 합 니 다.Feign 도 플러그 인 가능 한 인 코더 와 디코더 를 지원 합 니 다.Spring Cloud 는 Feign 을 봉인 하여 Spring MVC 표준 주해 와 HttpMessageConverters 를 지원 하도록 했다.Feign 은 부하 균형 을 지원 하기 위해 유레카 와 리본 과 조합 해서 사용 할 수 있다.
Feign 의 구성
인터페이스
역할.
기본 값
Feign.Builder
Feign 의 입구
Feign.Builder
Client
Feign 밑바닥 은 뭘 로 부탁 해 요?
Ribbon 과 호흡 할 때: LoadBalancer FeignClient (프 록 시 모드, Feign 에 연결 풀 을 도입 할 수 있 습 니 다) 가 Ribbon 과 호흡 하지 않 을 때: Fgien. Client. Default (URLConnection, 연결 풀 이 없고 자원 관리 가 없 으 며 성능 이 떨 어 집 니 다)
Contract
계약
SpringMVCContract
Encoder
디코더, 독점 을 HTTP 요청 메시지 체 로 변환 하 는 데 사용
SpringEncoder
Decoder
인 코더, 해당 메시지 체 를 대상 으로 변환
ResponseEntityDecoder
Logger
로그 관리자
Slf4jLogger
RequestInterceptor
모든 요청 에 유 니 버 설 논 리 를 추가 하 는 데 사용 합 니 다.
없다
통합 Feign
pom. xml 파일 에 의존 도 를 추가 합 니 다.

    org.springframework.cloud
    spring-cloud-starter-openfeign

시작 클래스 에 @ EnableFeignClient 설명 추가
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import tk.mybatis.spring.annotation.MapperScan;

//   Mybatis        
@MapperScan("com.example")
@SpringBootApplication
@EnableFeignClients
public class Study01Application {

    public static void main(String[] args) {
        SpringApplication.run(Study01Application.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

Feign 을 사용 하여 원 격 http 호출
feignClient 패 키 지 를 만 들 고 Feign 인 터 페 이 스 를 저장 합 니 다. 통합 과정 에서 comment 인 터 페 이 스 를 호출 했 기 때문에 CommentFeignClient 인터페이스 류 를 만 듭 니 다.주석 @ FeignClient 를 추가 합 니 다. 이 인 터 페 이 스 는 FeignClient 입 니 다. name, name 은 요청 할 마이크로 서비스의 이름 을 지정 합 니 다.이 때 인터페이스 에 방법 을 추가 할 수 있 습 니 다. 방법 주 해 는 spring mvc 의 주 해 를 참조 하고 코드 는 다음 과 같 습 니 다.
@FeignClient(name = "study02")
public interface CommentFeignClient {
    @GetMapping("/find")
    DemoComment find();
}

앞에서 마이크로 서비스 A 가 마이크로 서비스 B 의 요청 을 호출 하려 면 다음 과 같은 코드 를 참고 하 십시오.
private final DiscoveryClient discoveryClient;
private final RestTemplate restTemplate;

public DemoComment findById() {
    //       
    List instances = discoveryClient.getInstances("study02");
    List collect = instances.stream()
            .map(instance -> instance.getUri().toString() + "/find")
            .collect(Collectors.toList());
    //     
    int i = ThreadLocalRandom.current().nextInt(collect.size());
    String targetURL =  collect.get(i);
    DemoComment forObject = restTemplate.getForObject("http://study02/find", DemoComment.class, 1);
    return forObject;
}

그 중에서 DemoComment forObject = restTemplate. getForObject ("http://study02/find", DemoComment.class, 1);구체 적 인 요청 코드 입 니 다. 저 희 는 RestTemplate 인 터 페 이 스 를 빌려 서비스 간 의 요청 호출 을 실 현 했 습 니 다.그렇다면 페 인 을 이용 하면 어떻게 할 수 있 을 까?
  • 우선, restTemplate 주입 을 방금 추 가 된 CommentFeignClient 주입
  • 으로 바 꿉 니 다.
  • 그리고 comment FeignClient. * * () 호출 요청 을 직접 사용 하면 됩 니 다.

  • 코드 는 다음 과 같 습 니 다:
    private final DiscoveryClient discoveryClient;
    private final CommentFeignClient commentFeignClient;
    
    public DemoComment findById() {
        DemoComment forObject = commentFeignClient.find();
        return forObject;
    }

    Feign 설정
    Ribbon 과 마찬가지 로 Feign 도 두 가지 설정 방식 을 지원 합 니 다: 자바 코드 방식 및 설정 속성 모드
    Feign 이 지원 하 는 설정 항목
    코드 지원 설정 항목
    설정 항목
    역할.
    Logger.Level
    로그 단계 지정
    Retryer
    재 시도 정책 지정
    ErrorDecoder
    오류 디코더 지정
    Request.Options
    시간 초과
    Collection
    차단기
    SetterFactory
    Hystrix 의 설정 속성 을 설정 할 때 Fgien 이 Hystrix 를 통합 해 야 사용 할 수 있 습 니 다.
    속성 지원 설정 항목
    feign:
      client:
        config:
          feignName:
            connectTimeout: 5000  #    Request.Optionsn       
            readTimeout: 5000     #    Request.Options       
            loggerLevel: full     #   Feign     ,           Logger
            errorDecoder: com.example.SimpleErrorDecoder  # Feign      ,           ErrorDecoder
            retryer: com.example.SimpleRetryer  #     ,           Retryer
            requestInterceptors: #      ,           RequestInterceptor
              - com.example.FooRequestInterceptor
              - com.example.BarRequestInterceptor
            #    404    
            decode404: false
            encode: com.example.SimpleEncoder
            decoder: com.example.SimpleDecoder
            contract: com.example.SimpleContract

    다음은 feign 의 로그 단계 사용자 정의 로 feign 설정 을 보 여 줍 니 다.
    입자 배치
    자바 코드
    우선 Feign 설정 클래스 를 추가 하면 주 클래스 에 추가 할 수 있 지만 @ Configuration 을 추가 하지 않 아 도 됩 니 다.@ Configuration 을 추가 하고 주 클래스 아래 에 두 면 모든 Feign 클 라 이언 트 인 스 턴 스 를 공유 합 니 다. Ribbon 설정 류 와 마찬가지 로 부자 컨 텍스트 로 딩 충돌 합 니 다.@ Configuration 을 추가 하려 면 주 클래스 로 딩 이외 의 가방 에 넣 으 십시오.@ Configuration 을 추가 하지 않 는 것 을 권장 합 니 다.
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    
    public class DemoFeignConfiguration {
        @Bean
        public Logger.Level level() {
            //  Feign         
            return Logger.Level.FULL;
        }
    }

    그리고 @ FeignClient 에 설정 클래스 를 추가 합 니 다.
    @FeignClient(name = "study02", configuration = DemoFeignConfiguration.class)
    public interface CommentFeignClient {
        @GetMapping("/find")
        DemoComment find();
    }

    예 를 들 어 로그 단계 사용자 정의 이 고 feign 의 로그 단 계 는 feign 인터페이스 에 설 치 된 로그 단 계 는 debug 를 기반 으로 하기 때문에 설정 속성 을 추가 해 야 합 니 다.
    logging:
      level:
        #   FeignClient       
        com.example.study01.feignClient.CommentFeignClient: debug

    속성 설정
    feign:
      client:
        config:
          #          ,    
          study02:
            loggerLevel: FULL

    전역 설정
    자바 코드
    시작 클래스 에 @ EnableFeignClient 설명 에 defaultConfiguration 설정 추가
    @EnableFeignClients(defaultConfiguration = DemoFeignConfiguration.class)

    속성 설정
    feign:
      client:
        config:
          #           default        
          default:
            loggerLevel: FULL

    우선 순위: 입자 도 속성 설정 > 입자 도 코드 설정 > 전역 속성 설정 > 전역 코드 설정
    인쇄 된 정 보 는 다음 과 같 습 니 다.
    2019-10-22 14:55:41.286 DEBUG 31468 --- [nio-8881-exec-1] c.e.s.feignClient.CommentFeignClient     : [CommentFeignClient#find] 

    Feign 다 중 매개 변수 요청 구조
    GET 요청
    @ SpringQueryMap 사용 하기
    @FeignClient(name = "study02")
    public interface CommentFeignClient {
        @GetMapping("/find")
        public DemoComment query(@SpringQueryMap DemoComment comment);
    }

    @ RequestParam 사용 하기
    @FeignClient(name = "study02")
    public interface CommentFeignClient {
        @RequestMapping(value = "/find",method = RequestMethod.GET)
        public DemoComment query(@RequestParam("id") Long id, @RequestParam("name") String name);
    }

    맵 으로 구축 (추천 하지 않 음)
    @FeignClient(name = "study02")
    public interface CommentFeignClient {
        @RequestMapping(value = "/find",method = RequestMethod.GET)
        public DemoComment query(@RequestParam Map map);
    }

    POST 요청
    서비스 공급 자 방법
     @PostMapping("/save")
        public DemoComment save(@RequestBody DemoComment comment){
            return null;
        }

    서비스 호출 자
    @FeignClient(name = "study02")
    public interface CommentFeignClient {
        @RequestMapping(value = "/save",method = RequestMethod.POST)
        public DemoComment query(@RequestBody DemoComment comment);
    }

    Feign 성능 최적화
    연결 풀 설정
    apache httpClient
    의존 도 를 높이다
    
          io.github.openfeign
           feign-httpclient
    

    설정 추가
    feign:
      httpclient:
        #  feign  apache httpclient   
        enabled: true
        # feign      
        max-connections: 200
        # feign          
        max-connections-per-route: 50

    okHttp
    더욱 의존 하 다
    
        io.github.openfeign
         feign-okhttp
        1.10
    

    설정 추가
     httpclient:
        # feign      
        max-connections: 200
        # feign             
        max-connections-per-route: 50
      okhttp:
        enabled: true

    Feign 로그 합 리 적 사용
    생산 환경 사용 Logger. Level. BASIC

    좋은 웹페이지 즐겨찾기