Spring Cloud Zuul 상세 설명
1. zuul 의 기능 개관
2. 상용 경로 전략
3. 높 은 사용 가능
4. ZuulFilter
1. Filter Types (Filter 의 종류)
1)、Pre Filter
2)、Routing Filter
3)、Error Filter
4)、Post Filter
2. ZuulFilter 를 실현 하 는 추상 적 인 방법
1), filter Type 방법
2), shouldFilter 방법
3), run 방법
4), filter Order 방법
3. 필터 구현
1) 이전 demo 에 pre 형식의 Filter 를 추가 합 니 다.
2), route 형식의 Filter 추가
3), error 형식의 filter 추가
4), post 형식의 filter 추가
5), 시작 클래스 에서 모든 filter 를 Bean 으로 등록
6) 서비스 호출 인터페이스 시작 (위 그림 의 호출 절 차 를 증명 함)
1. zuul 의 기능 개관
지난 편 에서 zuul 은 JVM 기반 메모리 공유 기 이 고 서버 기반 부하 균형 이 라 고 말 했 습 니 다. 사실은 우 리 는 주로 Api 의 게 이 트 웨 이 로 사용 합 니 다.예 를 들 어 우리 의 이전 전자상거래 프로젝트 는 상품, 가격, 권한, 업 체, 재고 등 크기 가 70 여 개의 시스템 서 비 스 를 포함 하고 있 으 면 Zuul 과 같은 Api 홈 페이지 가 매우 필요 하 다 고 생각 합 니 다.우 리 는 그것 이 무엇 을 할 수 있 는 지 다시 한 번 대충 보 았 다.
안전 과 모니터링: 인증 이 필요 한 모든 자원 을 식별 하고 부합 되 지 않 는 요청 을 거부 합 니 다 (예 를 들 어 이전 프로젝트 app 과 백 엔 드 서비스 가 약속 한 암호 화 규칙 은 이 층 에서 처리 할 수 있 습 니 다).
성능 모니터링: 서비스 경계 에서 데 이 터 를 추적 하고 통계 하 며 정확 한 생산 보 기 를 제공 합 니 다 (이것 은 비교적 유연 하고 사용자 정의 보고 등 실현).
동적 경로: 필요 에 따라 동적 경 로 를 백 엔 드 의 다른 클 러 스 터 로 이동 합 니 다.
부하 마 운 트 해제: 모든 유형의 요청 용량 을 미리 할당 하고 요청 이 용량 을 초과 할 때 해당 하 는 처 리 를 합 니 다.
정적 자원 처리: 경계 에서 직접 응답 데이터
2. 상용 경로 전략
1. 기본 경로 규칙 은:http://ZUULHOST:ZUULPORT/serviceId/* *, 전편 에서 이미 시연 하 였 습 니 다
2, 상용 boottstrap. properties 설정 가능 한 정책
zuul.routes.ribbon-user-consumer-eureka = /kevin-user/** : 등 록 된 eureka 서비스 이름 을 kevin - user 로 변경 합 니 다.
zuul.ignored-services=user-provider : 서비스 무시
zuul.ignoredPatterns: /**/user/* : 규칙 에 따라 서비스 무시
zuul. prefix: / api: 경로 접두사
3. 정규 일치 PatternServiceRouteMapper 사용
@Bean
public PatternServiceRouteMapper serviceRouteMapper(){
/**
* A RegExp Pattern that extract needed information from a service ID. Ex :
* "(?.*)-(?v.*$)"
*/
//private Pattern servicePattern;
/**
* A RegExp that refer to named groups define in servicePattern. Ex :
* "${version}/${name}"
*/
//private String routePattern;
return new PatternServiceRouteMapper("(?^.+)-(?v.+$)",
"${version}/${name}");
}
3. 높 은 사용 가능
단일 노드 의 Zuul 켄 이 끊 을 수 있 으 면 다음 과 같은 방안 이 있 습 니 다. Zuul 앞 에 Nginx 와 같은 에이 전 트 를 추가 할 수 있 습 니 다.실현
4. ZuulFilter
이전 편 에 서 는 filter 를 이용 하여 로그 인쇄 를 실 현 했 습 니 다. 사용자 정의 Filter 가 필요 하 다 는 것 을 알 게 되 었 습 니 다.
1) 사용자 정의 Filter 가 ZuulFilter 에서 이 루어 지고 abstract 를 실현 하 는 방법
2) 、 자신의 Filter 를 Bean 으로 등록
1. Filter Types (Filter 의 종류)
Filter 는 서로 다른 역할 에 따라 아래 4 가지 유형 으로 나 뉘 며, 네 가지 유형 은 하나의 요청 에 따라 들 어 가 는 순서 로 배열 되 어 있다.
1)、Pre Filter
요청 경로 가 목표 에 도달 하기 전에 실 행 됩 니 다. 일반적으로 요청 한 인증 과 부하 균형, 로그 기록 에 사 용 됩 니 다.
2)、Routing Filter
대상 요청 을 처리 합 니 다. Apache HttpClient 나 Netflix Robbin 구조 로 그 를 사용 하여 대상 의 Http 요청 을 처리 합 니 다.홈 페이지 에 서 는 요청 과 응답 데 이 터 를 클 라 이언 트 기기 에 필요 한 모델 로 바 꾸 고 모델 에서 모델 로 바 꾸 는 경우 가 많다 고 설명 했다. 예 를 들 어 Servlet 요청 을 Okhttp 요청 으로 바 꾸 는 것 이다.
3)、Error Filter
전체 프로 세 스 가 잘못 되 었 을 때 실 행 됩 니 다. 앞의 경로 가 검증 되 었 을 때 사용자 정의 이상 을 던 져 서 이 층 에서 캡 처 한 다음 유형 에 따라 서로 다른 정 보 를 던 지 거나 다른 보기 로 전환 할 수 있 습 니 다.
4)、Post Filter
목표 가 실 행 된 후에 실 행 됩 니 다. 보통 이 단계 에 응답 헤드 를 추가 하고 통계 와 성능 데이터 등 을 수집 합 니 다.
2. ZuulFilter 를 실현 하 는 추상 적 인 방법
1), filter Type 방법
filter Type 방법 은 정 의 된 Filter Types 를 되 돌려 줍 니 다. 위의 유형 에 따라 각각 "pre", "route", "error", "post" 를 되 돌려 줍 니 다.
2), shouldFilter 방법
shouldFilter 가 이 필 터 를 열 었 는 지 여 부 를 되 돌려 줍 니 다.
3), run 방법
run 방법 은 자신의 업무 논리 입 니 다.
4), filter Order 방법
filter Order 방법 은 정렬 된 데 이 터 를 되 돌려 줍 니 다. 숫자 가 작 을 수록 이 형식 에서 우선 들 어 갑 니 다.ZuulFilter 가 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 통 해 우리 가 돌아 온 filter Order 값 을 비교 합 니 다.그래서 Zuul 에서 의 집행 순 서 는 (구체 적 인 실현 은 제 가 Zuul Filter 책임 체인 모델 을 분석 하 는 블 로그: 책임 체인 모델 - 실현 과 우수 소스 코드 사용 분석 을 참조 할 수 있 습 니 다).
3. 필터 구현
1) 이전 demo 에 pre 형식의 Filter 를 추가 합 니 다.
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import io.micrometer.core.instrument.util.MathUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Random;
public class PreRequestLog2Filter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 2;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
Random random = new Random();
if (random.nextBoolean()) {
System.out.println(String.format("pre filterOrder = 2 %s request to %s",
request.getMethod(), request.getRequestURL()));
} else {
System.out.println(" !");
throw new RuntimeException(" !");
}
return null;
}
}
2), route 형식의 Filter 추가
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
public class RouteRequestFilter extends ZuulFilter {
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
System.out.println("route filter !");
return null;
}
}
3), error 형식의 filter 추가
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
public class ErrorFilter extends ZuulFilter {
@Override
public String filterType() {
return "error";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
System.out.println(" ErrorFilter, , !");
return null;
}
}
4), post 형식의 filter 추가
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
public class PostInfoFilter extends ZuulFilter {
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletResponse servletResponse = context.getResponse();
String uuid = UUID.randomUUID().toString();
servletResponse.addHeader("X-Sample", uuid);
System.out.println(" header :" + uuid);
return null;
}
}
5), 시작 클래스 에서 모든 filter 를 Bean 으로 등록
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
/**
* Api gateway
* : http://ZUUL-HOST:ZUUL-PORT/serviceId/**
*
* @author kevin
* @date 2019/5/30 9:15
* @since 1.0
*/
@SpringBootApplication
@EnableZuulProxy
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
@Bean
public PreRequestLogFilter preRequestLogFilter(){
return new PreRequestLogFilter();
}
@Bean
public PreRequestLog2Filter preRequestLog2Filter(){
return new PreRequestLog2Filter();
}
@Bean
public RouteRequestFilter routeRequestFilter(){
return new RouteRequestFilter();
}
@Bean
public PostInfoFilter postInfoFilter(){
return new PostInfoFilter();
}
@Bean
public ErrorFilter errorFilter(){
return new ErrorFilter();
}
}
6) 서비스 호출 인터페이스 시작 (위 그림 의 호출 절 차 를 증명 함)
1. 요청 이 정상 일 때 호출 순 서 는:
PreRequestLogFilter > PreRequestLog2Filter > RouteRequestFilter > PostInfoFilter
로 그 는 다음 과 같 습 니 다:
send GET request to http://localhost:8800/ribbon-user-consumer-eureka/getRemoteUser/1 pre filterOrder = 2 GET request to http://localhost:8800/ribbon- user - consumer - eureka / getRemote User / 1 route filter 요청 정보 가 바 뀌 었 습 니 다!
되 돌아 오 는 header 값 설정: d78ed7c1 - 451a - 40c9 - 901 a - af0dca23b1f 8
2. 요청 이 잘못 되 었 을 때 호출 순 서 는:
PreRequestLogFilter > PreRequestLog2Filter > ErrorFilter > PostInfoFilter
로 그 는 다음 과 같 습 니 다:
send GET request to http://localhost:8800/ribbon- user - consumer - eureka / getRemoteUser / 1 인증 매개 변수 오류!2019-05-30 15:34:53.522 WARN 1044 --- [nio-8800-exec-1] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering
com.netflix.zuul.exception.ZuulException: Filter threw Exception at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:227) ~[zuul-core-1.3.1.jar:1.3.1] at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.1.jar:1.3.1] 。。。。。。。。。。。。。。。。。。。。。。。 at java. lang. Thread. run (Thread. java: 744) [na: 1.8.0] Caused by: java. lang. RuntimeException: 검증 매개 변수 오류! at com.kevin.zuuldemo.PreRequestLog2Filter.run(PreRequestLog2Filter.java:36) ~[classes/:na] at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar:1.3.1] at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.1.jar:1.3.1] ... 61 common frames omitted
ErrorFilter 에 도 착 했 습 니 다. 오류 보기 로 전환 해 야 합 니 다!되 돌아 오 는 header 값 을 설정 합 니 다: e4154c 52 - 6b1c - 4227 - 8a49 - 21b147 e2a5bb
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.