Dubbo 의 http 프로 토 콜 을 상세 하 게 해석 합 니 다.
9121 단어 JAVA
이렇게 많은 RPC 프로 토 콜 은 다음 과 같은 의문 을 가 질 수 있 습 니 다. rest, jsonrpc, 웹 서 비 스 는 모두 http 통신 에 의존 하지 않 습 니까?왜 http 프로 토 콜 이 따로 있 습 니까?이 질문 에 급 하 게 대답 하지 않 고 오늘 의 화 제 를 끌 어 내 Dubbo 프레임 워 크 에서 이른바 http 프로 토 콜 을 소개 합 니 다.
Dubbo 의 http 프로 토 콜
Dubbo 에서 http 프로 토 콜 을 사용 하 는 것 은 다른 프로 토 콜 과 기본적으로 같 습 니 다. protocol 만 지정 하면 됩 니 다.
server 속성 선택 값: jetty, tomcat, servlet.
설정 후 서비스 소비자 가 서비스 제공 자 에 게 호출 을 하면 바 텀 은 표준 http 프로 토 콜 을 사용 하여 통신 을 합 니 다.바로https://github.com/apache/dubbo-samples 공식 예제 를 찾 았 습 니 다. 그 중의 하위 모듈: dubbo - samples - Huttp 는 http 프로 토 콜 호출 예 를 구축 하 였 습 니 다.
여러분 의 오 해 를 피하 기 위해 본 논문 에서 모든 http 프로 토 콜 은 dubbo 의 http 프로 토 콜 을 말 합 니 다. 여러분 이 잘 알 고 있 는 일반적인 http 프로 토 콜 이 아 닙 니 다.
http 프로 토 콜 의 기본 원리
기본 적 인 dubbo 프로 토 콜 에서 http 프로 토 콜 로 바 꾸 는 것 은 매우 간단 한 일이 다. 위 는 바로 사용자 의 시각 에서 본 모든 내용 이다. 그 다음 에 우 리 는 그 밑바닥 실현 원 리 를 연구 할 것 이다.
Dubbo 의 소스 코드 를 뒤 져 보면 HttpProtocol 의 실현 을 찾 을 수 있 습 니 다. 놀 라 실 수도 있 습 니 다. 기본적으로 HttpProtocol 의 한 종류 에 의존 하여 http 프로 토 콜 을 실 현 했 습 니 다.
사용자 정의 dubbo 프로 토 콜 을 실현 하 는 데 30 가지 종류 가 있다 는 것 을 알 아야 합 니 다!http 프로 토 콜 이 이렇게 간단 한데 그 배후 의 주요 원인 은 두 가지 가 있다.
Spring 이 제공 하 는 HttpInvoker 는 어느 곳 이 신성 합 니까?확실히 생소 한 개념 이지 만 복잡 하지 않 습 니 다. 쉽게 말 하면 자바 직렬 화 를 사용 하여 대상 을 바이트 로 바 꾸 고 http 를 통 해 보 냅 니 다. server 엔 드 에서 Spring 은 url 맵 에 따라 용기 에 대응 하 는 Bean 반사 호출 과정 을 찾 을 수 있 습 니 다. 본 적 이 없어 도 괜 찮 습 니 다. 아래 의 예 시 를 통 해 이 개념 을 신속하게 파악 할 수 있 습 니 다.
Spring HttpInvoker
이 절의 내용 은 Spring 문 서 를 참조 할 수 있 습 니 다.https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#remoting-httpinvoker-server
다음 예제 에 서 는 Spring 원생 HttpInvoker 를 원 격 호출 하 는 방법 을 보 여 줍 니 다.
서비스 공급 자 만 들 기
public class AccountServiceImpl implements AccountService {
@Override
public Account findById(int id) {
Account account = new Account(id, new Date().toString());
return account;
}
}
@Bean
AccountService accountService(){
return new AccountServiceImpl();
}
@Bean("/AccountService")
public HttpInvokerServiceExporter accountServiceExporter(AccountService accountService){
HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
exporter.setService(accountService);
exporter.setServiceInterface(AccountService.class);
return exporter;
}
노출 서비스의 코드 는 상당히 간단 하 므 로 두 가 지 를 주의해 야 합 니 다.
org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter
는 Spring 에 포 장 된 서비스 노출 기 로 서비스 인터페이스 를 공공 인터페이스 로 하고 서 비 스 를 실현 하 는 유형 으로 외부 에 서 비 스 를 제공한다.http://localhost:8080/AccountService
서비스 소비 자 를 만들다
@Configuration
public class HttpProxyConfig {
@Bean("accountServiceProxy")
public HttpInvokerProxyFactoryBean accountServiceProxy(){
HttpInvokerProxyFactoryBean accountService = new HttpInvokerProxyFactoryBean();
accountService.setServiceInterface(AccountService.class);
accountService.setServiceUrl("http://localhost:8080/AccountService");
return accountService;
}
}
@SpringBootApplication
public class HttpClientApp {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(HttpClientApp.class, args);
AccountService accountService = applicationContext.getBean(AccountService.class);
System.out.println(accountService.findById(10086));
}
}
소비자 측 인용 서비스 역시 두 가지 주의 점 이 있다.
org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean
는 Spring 패 키 징 의 서비스 인용 기 입 니 다. serviceInterface 는 프 록 시 생 성 인 터 페 이 스 를 지정 하고 serviceUrl 은 서비스 가 있 는 주 소 를 지정 하여 이전에 설정 한 서비스 노출 자의 경로 와 대응 해 야 합 니 다.호출 세부 분석
Spring HttpInvoker 의 밑바닥 실현 에 대해 깊이 연구 할 필요 가 없 지만 여러분 은 세부 사항 을 궁금 해 할 것 입 니 다. dubbo 중의 http 신문 문 체 는 어떻게 조직 되 었 습 니까?어떻게 대상 을 직렬 화 합 니까?
저 희 는 wireshark 를 사용 하여 클 라 이언 트 가 보 낸 요청 과 서버 에서 응답 하 는 메 시 지 를 캡 처 할 수 있 습 니 다.
신문 의 흐름 을 추적 하면 상세 한 요청 과 응답 내용 을 볼 수 있다.
ContentType: application/x-java-serialized-object
와 메시지 바디 부분의 ASCII 코드 를 보면 자바 Serialize 서열 화 를 사용 했다.우 리 는 바디 부분 을 파일 로 내 보 내 고 자바 Serialize 의 반 직렬 화 응답 을 사용 하여 노산 의 정 체 를 검증 합 니 다.자바 Serialize 를 사용 하면 메 시 지 를 정상적으로 반 직렬 화 할 수 있 습 니 다. 결 과 는 Spring 에 내 장 된 포장 류 Remote Invocation Result 로 실제 업무 복귀 결 과 를 장식 하고 있 습 니 다.
http 프로 토 콜 의 의미
Dubbo 가 제공 하 는 많은 협 의 는 각자 적용 되 는 장면 이 있다. 예 를 들 어
모든 프로 토 콜 의 구체 적 인 사용 장면 과 그 특성 에 대해 저 는 단독으로 글 을 써 서 분석 할 수 있 습 니 다. 지금 은 dubbo 가 http 프로 토 콜 을 제공 하여 어떤 문 제 를 해결 하 는 지, 어떤 장면 에서 사용 자 는 dubbo 의 http 프로 토 콜 을 사용 하 는 지 고려 해 야 합 니 다.
저 는 개인 적 으로 dubbo 현재 http 프로 토 콜 이 닭 갈비 라 고 생각 합 니 다. 원생 http 통신 의 장점 은 유 니 버 설 에 있 습 니 다. 기본 적 인 모든 언어 는 http 클 라 이언 트 와 서버 지원 이 있 지만 dubbo 의 http 프로 토 콜 은
application/x-java-serialized-object
형식 으로 기본 적 인 payload 를 사용 하여 언어 간 의 장점 을 잃 었 습 니 다.HttpInvoker 는 설정 직렬 화 형식 을 지원 하 므 로 섣 불리 지적 해 서 는 안 된다 고 반박 할 수 있 습 니 다.그러나 사실은 우리 가 주목 하 는 것 은 바로 기본 적 인 실현 이다. dubbo: / 프로 토 콜 도 fastjson 을 직렬 화 방안 으로 설정 할 수 있 지만 우 리 는 dubbo: / 프로 토 콜 이 우수한 크로스 언어 방안 이 라 고 생각 하지 않 는 다. 이 유 는 같다.물론 응용 층 협의 가 우수한 지, mesh 에 적합 한 지 등 여러 가지 방향 으로 분석 해 야 한다. 이런 것들 은 본 고 에서 분석 하지 않 는 다.결국 본 고 는 일정한 지면 을 써 서 모두 에 게 dubbo 의 http 협 의 를 소 개 했 는데 결국은 너 에 게 알려 주 고 싶 었 다. 이것 은 비교적 닭 갈비 의 협의 인 데 좀 실 망 스 럽 지 않 니?실망 하지 마 세 요. dubbo 는 2.7.4 버 전에 서 기 존의 http 프로 토 콜 을 폐기 하고 jsonrpc 프로 토 콜 로 대체 할 수 있 습 니 다. 사실은 jsonrpc 프로 토 콜 의 이름 을 바 꾸 었 을 뿐 입 니 다. jsonrpc 의 세부 사항 에 대해 다음 글 에서 소개 하 겠 습 니 다. 그러면 저 는 jsonrpc 가 기 존의 http 프로 토 콜 보다 http 프로 토 콜 의 모 자 를 쓰기 에 더 적합 한 지 분석 하 겠 습 니 다.기 존의 http 프로 토 콜 에 대해 저 는 spring - httpinvoker 프로 토 콜 이 라 고 부 르 는 경향 이 있 습 니 다.
요약, dubbo 기 존 http 프로 토 콜 의 의 미 는 무엇 입 니까?Spring HttpInvoker 를 사용 하 는 것 에 익숙 하 다 면 기 존의 http 프로 토 콜 은 어느 정도 쓸모 가 있 을 지 모 르 지만, dubbo 커 뮤 니 케 이 션 군 과 Spring 문서 가 사용 하 는 지면 을 소개 하 는 것 을 보면 매우 작은 편 입 니 다.또한 우 리 는 협의 발전의 역 사 를 잘 인식 하고 협의 가 왜 존재 하 는 지, 왜 도태 되 었 는 지 알 수 있다.
물론 제 가 말 한 것 은 아 닙 니 다. 최종 적 으로 dubbo 지역사회 의 결정 을 봐 야 합 니 다. 만약 에 이 이전 방안 에 관심 이 있다 면 토론 에 참여 하고 싶 습 니 다. 여러분 이 dubbo 지역사회 의 메 일 링 리스트 에서 당신 의 견 해 를 발표 하 는 것 을 환영 합 니 다.
Topic:[Proposal] replace the protocol="http" with protocol="jsonrpc"
제 위 챗 공식 번호 에 관심 을 가 져 주 십시오. 'Kirito 의 기술 공유' 는 글 에 대한 모든 의문 이 답 을 받 고 자바 와 관련 된 기술 공 유 를 가 져 옵 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.