왜 마이크로 서비스 게이트웨이
일반적으로 다른 마이크로 서비스는 다른 네트워크 주소를 가지고 있고, 외부 클라이언트는 여러 서비스 인터페이스를 호출 할 필요가 있습니다
비즈니스 요구 사항을 완료 할 수 있습니다. 예를 들어, 영화 티켓 수집 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; } }