스프링 클 라 우 드 알 리 바 바 학습 노트 (4) - 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 인 터 페 이 스 를 빌려 서비스 간 의 요청 호출 을 실 현 했 습 니 다.그렇다면 페 인 을 이용 하면 어떻게 할 수 있 을 까?
코드 는 다음 과 같 습 니 다:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.