Zuul 기본적인 이해와 사용

왜 마이크로 서비스 게이트웨이

일반적으로 다른 마이크로 서비스는 다른 네트워크 주소를 가지고 있고, 외부 클라이언트는 여러 서비스 인터페이스를 호출 할 필요가 있습니다
비즈니스 요구 사항을 완료 할 수 있습니다. 예를 들어, 영화 티켓 수집 APP는 마이크로 필름 분류, 사용자 서비스를 다시 호출 할 수 있습니다
마이크로 서비스, 마이크로 결제 서비스. : 클라이언트와 마이크로 서비스가 직접 통신 할 경우에 대한 질문이있을 것이다
, # 클라이언트가 반복해서 마이크로 서비스를 요청하는 클라이언트의 복잡성이 증가
상대적인 복잡성 특정 시나리오에서 # 크로스 도메인 요청 처리를
각각 # 인증 복잡 서비스는 독립적 인 인증이 필요
# 클라이언트 서비스를 직접 마이크로 통한 경우 수 다시 분할 마이크로 서비스를해야 할 수도 있습니다 프로젝트의 반복으로 재구성하기가 어렵
편지, 그것은 어려울 것이다 재건 구현하기 위해
다른 프로토콜을 사용할 수 # 특정 마이크로 서비스를 직접 액세스하기 어려울 것이다
이것은 마이크로 서비스 게이트웨이에 의해 해결 될 수 있으며, 상기 과제를. 마이크로 서비스 게이트웨이가 클라이언트와 서버 측 사이에
층간, 모든 외부 요청은 마이크로 서빙 게이트웨이를 통해 이동합니다.

Zuul 무엇입니까

Zuul 오픈 소스 넷플 릭스 마이크로 서비스 게이트웨이, 그는 유레카, 리본, Hystrix과 다른 구성 요소 수
를 사용. Zuul 핵심 구성 요소는 일련의 필터이며, 다음과 같은 기능을 수행 할 수있는 이러한 필터 :
검증 요구 사항은 각 자원을 식별하고, 요청과 일치하지 않는 사람들을 거부 할 : # 신원 인증 및 보안
# 검토 및 모니터링 :
## 동적 라우팅 : 동적 경로는 다른 백엔드 클러스터에 요구
성능을 이해하기 위해, 클러스터 트래픽 증가 # 스트레스 테스트
# 하중 분포 : 분포의 종류마다 부하 용량에 대응하고, 요청이 제한값을 초과 버린다
# 정적 반응 과정 : 에지 위치는 내부 클러스터로 전달 피하기 위해, 대응하는
# 광역 유연성 : ELB (ElasticLoad 균형)을 달성하기위한 도메인 간 라우팅 요청 AWS의 영역
을 사용 다변화
Zuul의 봄 클라우드 통합 및 강화했다.
아키텍처 다이어그램을, 형태의 진화를 Zuul 사용 후

1.1 마이크로 관리 백그라운드 서비스 게이트웨이

1. 의존

<의존성> 
        <의존성> 
            <의 groupId> org.springframework.cloud </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 유레카 클라이언트 </ artifactId를> 
        </ 의존성> 
        <의존성> 
            <의 groupId> org.springframework. 구름 </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 zuul </ artifactId를> 
        </ 의존성> 
        <의존성> 
            <의 groupId> org.springframework.cloud </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 구성 </ artifactId를> 
        </ 의존성> 
    </ 의존성>

2. 시작 클래스

@SpringBootApplication 
@EnableEurekaClient 
@EnableZuulProxy 
공용 클래스 ManagerApplication { 
    공공 정적 무효 메인 (문자열 []에 args) { 
        SpringApplication.run (ManagerApplication.class); 
    } 

   
}

  

3. 프로필

 

 

4. 필터

@Component 
공용 클래스 ManagerFilter 확장 ZuulFilter { 

    @Autowired 
    개인 JwtUtil jwtUtil; 
    / ** 
     * 실행 전에 사전 또는 사후 요청 후 
     * @return 
     * / 
    @Override 
    공공 문자열 filterType () { 
        반환 "사전"; 
    } 

    / ** 
     * 멀티 실행 순서 필터, 숫자가 작을수록 상기 제 구현 
     * @return 
     * / 
    @Override 
    공개 INT filterOrder () { 
        창 0; 
    } 

    / ** 
     * 현재 필터 돌리기 진정한 온 
     * @return 
     * / 
    @ 우선 
    공공 부울 shouldFilter는 () { 
        true로 반환; 
    }

    / ** 
     * 진행 표시 필터 내에서 수행 된 작업 ojbect 값 반환 
     * 더 이상 계속되지 않도록 (false)를 setsendzullRespponse이 
     * @return 
     * @throws ZuulException 
     * / 
    @Override 
    공공 RUN 개체 () {ZuulException가 발생 
        시스템. out.println ( "백 필터를 통해!"); 
        requestContext requestContext RequestContext.getCurrentContext = (); 
        // 요구 필드 
        HttpServletRequest의 requestContext.getRequest 요청 = () 

        . IF (request.getMethod () 등호 ( "옵션") ) { 
            NULL을 반환; 
        } 

        IF (Request.getRequestURI ()을 같이 IndexOf ( "로그인")> 0). { 
            는 null; 
        }
 
        헤더를 얻을 //에게
        문자열 헤더 = request.getHeader ( "승인"); 
        경우 (이! 헤더 = 널 (null) &&! ""동일 (헤더).) { 
            경우 (header.startsWith ( "무기명")) { 
                문자열 토큰 = header.substring (7); 
                {시도 
                    항은 = jwtUtil.parseJWT (토큰) 주장; 
                    문자열 역할 = (문자열) claims.get ( "역할"); 
                    경우 (roles.equals ( "관리자")) { 
                        //把头信息转发下去,并且放行
                        requestContext.addZuulRequestHeader ( "인증", 헤더); 
                        NULL을 반환; 
                    } 
                } 캐치 (예외 전자) {
                    requestContext.setSendZuulResponse (FALSE) // 종료 
                } 
            } 
        } 
        requestContext.setSendZuulResponse (FALSE) // 종료 
        (403) requestContext.setResponseStatusCode; 
        requestContext.setResponseBody를 ( "권한 부족") 
        . requestContext.getResponse ()로 setContentType ( "텍스트 / HTML; 문자셋 = UTF-8."); 
        는 null; 
    } 
}

 

filterType는 다음의 네 가지 zuul의 라이프 사이클에 정의 된 필터의 종류의 캐릭터 라인 대표 반환
: 다음과 같이 필터 유형을
미리 : 경로 요청하기 전에 호출 할 수 있습니다
경로 요청이 호출됩니다 경로
게시물 :에 경로 에러 필터 후 호출
오류 : 요청 처리 중에 에러가 발생했을 때 호출
하는 int 실행 순서에 의해 필터를 정의 : filterOrder하는
shouldFilter : 필터가 이러한 기능으로되도록 수행 될 수 있는지 여부를 결정하기 위해 부울을 리턴
필터 달성 스위칭. 위의 예에서, 우리는 직접 true를 반환하기 때문에 필터는 항상 활성화되어
실행 : 지정된 논리적 필터를.

2.1 마이크로 관리 백그라운드 서비스 게이트웨이

1. 의존

<의존성> 
        <의존성> 
            <의 groupId> org.springframework.cloud </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 유레카 클라이언트 </ artifactId를> 
        </ 의존성> 
        <의존성> 
            <의 groupId> org.springframework. 구름 </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 zuul </ artifactId를> 
        </ 의존성> 
        <의존성> 
            <의 groupId> org.springframework.cloud </의 groupId> 
            <artifactId를> 스프링 클라우드 스타터 구성 </ artifactId를> 
        </ 의존성> 
    </ 의존성>

  

 

2. 시작 클래스

 

@SpringBootApplication 
@EnableEurekaClient 
@EnableZuulProxy 
공용 클래스 웹 응용 { 
    공공 정적 무효 메인 (문자열 []에 args) { 
        SpringApplication.run (WebApplication.class); 
    } 
}

  

3. 프로필

 

4. 필터

@Component 
공용 클래스 웹 필터는 ZuulFilter {확장 
    @Override 
    공공 문자열 filterType () { 
        반환 "사전"; 
    } 

    @Override 
    공개 INT filterOrder () { 
        0을 리턴; 
    } 

    @Override 
    공공 부울 shouldFilter () { 
        TRUE를 반환; 
    } 

    @Override 
    공공 개체 실행 ()가 발생 ZuulException { 
        //得到요청上下文
        RequestContext currentContext = RequestContext.getCurrentContext (); 
        //得到요청域
        HttpServletRequest의 요청 currentContext.getRequest = (); 
        //得到头信息
        문자열 헤더 = request.getHeader ( "승인"); 
        // 헤더 정보가 있는지 여부를 판정한다 
        IF ( "."! = NULL && 헤더 등호 (헤더)) { 
            // 정보 다운 헤드 계속 통과 
            "(권한 부여 currentContext.addZuulRequestHeader을 "헤더); 
        } 
        는 null; 
    } 
}

  

추천

출처www.cnblogs.com/liushisaonian/p/11260563.html