Spring Cloud Zuul 상세 설명

10639 단어 SpringCloud
목차
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
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기