Spring cloud gateway 구덩이 실 록 - 포트 의 구덩이, 에이전트 원 격 WS 서비스 타 임 스 404, 403 의 구덩이 설정
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 는 영향 을 주지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.