Spring cloud gateway 구덩이 실 록 - 포트 의 구덩이, 에이전트 원 격 WS 서비스 타 임 스 404, 403 의 구덩이 설정

5650 단어 Springcloud
먼저 솔 루 션 을 붙 여 주세요. Spring cloud gateway 라 고 약칭 하면 SCG 입 니 다.
server:
  port: 8000

spring:
  cloud:
    gateway:
      routes:
      - id: https
        uri: https://www.zhaoxu4java.com/-/x/pro/market/overview
        predicates:
        - Path=/overview
      - id: wss
        uri: wss://www.zhaoxu4java.com:443/-/s/pro/ws
        filters:
        - RemoveRequestHeader=Host
        - AddRequestHeader=Host, www.zhaoxu4java.com
        predicates:
        - Path=/ws

첫 번 째 구덩이 포트 의 구덩이:
HTTPS 나 HTTP 프로 토 콜 은 포트 번 호 를 설정 하지 않 고 기본 443 또는 80 으로 Spring cloud gateway - core 소스 코드 를 참조 할 수 있 습 니 다.
@ConfigurationProperties("spring.cloud.gateway.x-forwarded")
public class XForwardedHeadersFilter implements HttpHeadersFilter, Ordered {
	/** default http port */
	public static final int HTTP_PORT = 80;

	/** default https port */
	public static final int HTTPS_PORT = 443;

	/** http url scheme */
	public static final String HTTP_SCHEME = "http";

	/** https url scheme */
	public static final String HTTPS_SCHEME = "https";

그러나 ws 나 ws 에 기본 포트 번호 설정 이 없 기 때문에 웹 소켓 서 비 스 를 설정 할 때 도 메 인 이름 뒤에 포트 번 호 를 추가 하지 않 으 면 SCG 는 서버 포트 를 이 서비스의 포트 로 추가 합 니 다. 뉴스 서비스 뒤의 포트 번호 가 정말 server port 와 일치 하지 않 는 한 포트 번 호 를 추가 하 십시오. SCG - core 소스 코드 를 참조 하 십시오.
package org.springframework.cloud.gateway.filter;
public class RouteToRequestUrlFilter implements GlobalFilter, Ordered {
@Override
	public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //  
		...
		URI requestUrl = UriComponentsBuilder.fromUri(uri)
				.uri(routeUri)
				.build(encoded)
				.toUri();
		exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
		return chain.filter(exchange);
}
}

이 코드 는 SCG 에 요청 url 코드 를 생 성 하 는 것 입 니 다. 관심 이 있 으 면 toUri 방법 을 누 르 면 구체 적 인 지정 port 논 리 를 볼 수 있 습 니 다.또한 SCG 는 웹 소켓 에 대한 다른 지원 형식 으로 포트 번 호 를 추가 하 는 것 을 피 할 수 있 습 니 다. scheme 을 http 또는 https 로 설정 하고 SCG 를 요청 하 는 클 라 이언 트 를 웹 소켓 요청 형식 으로 하면 됩 니 다. 코드 는 다음 과 같 습 니 다.
- id: wss
        uri: https://www.zhaoxu4java.com:443/-/s/pro/ws
        filters:
        - RemoveRequestHeader=Host
        - AddRequestHeader=Host, www.zhaoxu4java.com
        predicates:
        - Path=/ws

클 라 이언 트:
HttpClient httpClient = vertx.createHttpClient(new HttpClientOptions().setSsl(port == 443).setConnectTimeout(timeout));

        httpClient.websocket(port, host, requestUrl, websocket -> {...}

클 라 이언 트 가 ws 요청 을 하면 요청 한 headers 에 upgrade: websocket 을 추가 합 니 다. SCG 는 이 매개 변 수 를 검사 하고 마지막 으로 requestUrl 의 scheme 를 https 나 http 로 바 꿉 니 다. 소스 코드 는 다음 과 같 습 니 다.
package org.springframework.cloud.gateway.filter;

public class WebsocketRoutingFilter implements GlobalFilter, Ordered {
...
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		changeSchemeIfIsWebSocketUpgrade(exchange);
        ...
}


private void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchange) {
		// Check the Upgrade
		URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
		String scheme = requestUrl.getScheme().toLowerCase();
		String upgrade = exchange.getRequest().getHeaders().getUpgrade();
		// change the scheme if the socket client send a "http" or "https"
		if ("WebSocket".equalsIgnoreCase(upgrade) && ("http".equals(scheme) || "https".equals(scheme))) {
			String wsScheme = convertHttpToWs(scheme);
			URI wsRequestUrl = UriComponentsBuilder.fromUri(requestUrl).scheme(wsScheme).build().toUri();
			exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, wsRequestUrl);
			if (log.isTraceEnabled()) {
				log.trace("changeSchemeTo:[" + wsRequestUrl + "]");
			}
		}
	}

	/* for testing */ static String convertHttpToWs(String scheme) {
		scheme = scheme.toLowerCase();
		return "http".equals(scheme) ? "ws" : "https".equals(scheme) ? "wss" : scheme;
	}
}

저 는 이런 표기 법 이 이상 하 다 고 생각 합 니 다. 저 는 XForward HeadersFilter 류 의 실현 방식 을 참고 하여 ws 와 ws 에 대한 지 지 를 추가 하고 싶 습 니 다. 그러나 다른 한편, websocket 자체 가 http 를 바탕 으로 악 수 를 한 번 하 는 것 이기 때문에 이 changeschemeifIs WebSocket Upgrade 가 협의 업 그 레이 드 를 진행 하 겠 습 니 다. 초보 튜 토리 얼 (참조)
WebSocket 인 스 턴 스
웹 소켓 프로 토 콜 은 본질 적 으로 TCP 기반 프로 토 콜 입 니 다.
웹 소켓 연결 을 만 들 기 위해 클 라 이언 트 브 라 우 저 는 먼저 서버 에 HTTP 요청 을 해 야 합 니 다. 이 요청 은 일반적인 HTTP 요청 과 달리 추가 헤더 정 보 를 포함 하고 있 습 니 다. 그 중에서 추가 헤더 정보 인 'Upgrade: 웹 소켓' 을 포함 합 니 다.이것 은 프로 토 콜 업 그 레이 드 를 신청 하 는 HTTP 요청 임 을 나타 낸다. 서버 측 에서 이러한 추 가 된 헤더 정 보 를 분석 한 다음 에 응답 정 보 를 클 라 이언 트 에 게 되 돌려 준다. 클 라 이언 트 와 서버 측의 WebSocket 연결 이 구축 되면 쌍방 은 이 연결 채널 을 통 해 자 유 롭 게 정 보 를 전달 할 수 있 고 이 연결 은 클 라 이언 트 나 서버 측의 한 측 까지 지속 적 으로 존재 할 것 이다.연결 을 주동 적 으로 닫 습 니 다.

어쨌든 이 점 은 어 진 사람 이 어 진 사람 을 보고 지혜 로 운 사람 이 지혜 로 운 사람 을 보 자.
두 번 째 구덩이 에서 404 / 403 오류 코드 를 가 져 온 Host 인자!
먼저 원 격 환경 을 소개 합 니 다. SCG 에이전트 의 도 메 인 이름 은 nginx 서비스 에 대응 합 니 다. nginx 서 비 스 는 다음 의 진정한 server 를 계속 전송 합 니 다. 로 컬 에서 이 환경 을 구축 할 때 모든 것 이 정상 적 입 니 다. 프 록 시 라인 과 도 메 인 이름, 심지어 ip 을 테스트 할 때 403 / 404 오류 가 발생 했 습 니 다. debug 는 websocket 요청 을 보 낼 때 host 가 requestUrl 에 대응 하 는 host 가 아 닌 localhost 임 을 발 견 했 습 니 다.따라서 filers 파 라 메 터 를 설정 하여 수정 하고 테스트 를 통과 합 니 다.사용자 정의 filter 를 통 해 변경 하 는 것 도 가능 합 니 다. 설정 한 filter 에 대응 하 는 filter Factory 의 코드 를 참고 하여 headers 를 추가 하고 삭제 할 수 있 습 니 다.물론 통합 서비스 발견 Eureka 후 두 번 째 방식 은 더 좋 은 선택 이 어야 합 니 다. host 와 requestUrlhost 가 일치 하 는 이 문 제 는 계속 연구 해 야 합 니 다. 또한 ws 서비스 만 이런 상황 이 발생 할 수 있 고 http Host 는 영향 을 주지 않 습 니 다.

좋은 웹페이지 즐겨찾기