Dubbo 의 http 프로 토 콜 을 상세 하 게 해석 합 니 다.

9121 단어 JAVA
해 가 붉 고 꽃 이 가지각색 입 니 다. 독자 여러분, 안녕하세요? 또 Dubbo 지식 을 나 눌 때 가 되 었 습 니 다.Dubbo 프레임 워 크 가 지원 하 는 협의 에 대해 당신 의 첫 번 째 반응 은 무엇 입 니까?Dubbo 가 기본적으로 지원 하 는 dubbo 프로 토 콜 과 흔히 말 하 는 Dubbo 에 기여 하 는 rest 프로 토 콜 또는 오늘 의 주인공 http 가 있 을 것 입 니 다.지금까지 Dubbo 의 최신 버 전 은 2.7.3 까지 진행 되 었 습 니 다. dubbo, hessain, http, injvm, jsonrpc, memcached, native - trift, thrift, redis, rest, rmi, webservice, xml 등 프로 토 콜 을 지 원 했 습 니 다. 일부 프로 토 콜 의 사용 방식 은 아직 공식 문서 에 보완 되 지 않 았 습 니 다.원래 Dubbo 가 이렇게 많은 협 의 를 지지 하 는 것 은 너의 예상 을 벗어난 것 이 아니 냐?
이렇게 많은 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 中的 http 协议_第1张图片
사용자 정의 dubbo 프로 토 콜 을 실현 하 는 데 30 가지 종류 가 있다 는 것 을 알 아야 합 니 다!http 프로 토 콜 이 이렇게 간단 한데 그 배후 의 주요 원인 은 두 가지 가 있다.
  • remoting 층 은 http 통신 을 사용 하고 사용자 정의 디 코딩 이 필요 하지 않 습 니 다
  • Spring 이 제공 하 는 HttpInvoker 의 도움 을 받 아 refer 와 exporter 의 논리
  • 를 봉 했다.
    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 에 포 장 된 서비스 노출 기 로 서비스 인터페이스 를 공공 인터페이스 로 하고 서 비 스 를 실현 하 는 유형 으로 외부 에 서 비 스 를 제공한다.
  • @ Bean ("/ AccountService") 은 IOC 용기 에 있 는 bean 의 이름 뿐만 아니 라 경로 맵 기능 도 합 니 다. 로 컬 서버 가 8080 포트 에 노출 되면 예제 서비스의 접근 경 로 는 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 은 서비스 가 있 는 주 소 를 지정 하여 이전에 설정 한 서비스 노출 자의 경로 와 대응 해 야 합 니 다.
  • HttpInvokerProxyFactory Bean 이 용기 에 등록 할 때 하나의 AccountService 인터페이스의 프 록 시 클래스 를 동시에 생 성하 여 Spring 에서 원 격 으로 호출 하 는 논리 입 니 다.

  • 호출 세부 분석
    Spring HttpInvoker 의 밑바닥 실현 에 대해 깊이 연구 할 필요 가 없 지만 여러분 은 세부 사항 을 궁금 해 할 것 입 니 다. dubbo 중의 http 신문 문 체 는 어떻게 조직 되 었 습 니까?어떻게 대상 을 직렬 화 합 니까?
    저 희 는 wireshark 를 사용 하여 클 라 이언 트 가 보 낸 요청 과 서버 에서 응답 하 는 메 시 지 를 캡 처 할 수 있 습 니 다.
    一文详细解读 Dubbo 中的 http 协议_第2张图片
    신문 의 흐름 을 추적 하면 상세 한 요청 과 응답 내용 을 볼 수 있다.ContentType: application/x-java-serialized-object 와 메시지 바디 부분의 ASCII 코드 를 보면 자바 Serialize 서열 화 를 사용 했다.우 리 는 바디 부분 을 파일 로 내 보 내 고 자바 Serialize 의 반 직렬 화 응답 을 사용 하여 노산 의 정 체 를 검증 합 니 다.
    一文详细解读 Dubbo 中的 http 协议_第3张图片
    자바 Serialize 를 사용 하면 메 시 지 를 정상적으로 반 직렬 화 할 수 있 습 니 다. 결 과 는 Spring 에 내 장 된 포장 류 Remote Invocation Result 로 실제 업무 복귀 결 과 를 장식 하고 있 습 니 다.
    http 프로 토 콜 의 의미
    Dubbo 가 제공 하 는 많은 협 의 는 각자 적용 되 는 장면 이 있다. 예 를 들 어
  • dubbo: /, dubbo 프로 토 콜 은 기본 프로 토 콜 로 바 이 너 리 프로 토 콜 을 사용자 정의 합 니 다.단일 긴 연결 로 자원 절약 하기;tcp 기반 으로 netty 위 에 구조 되 어 있 으 며 성능 은 그런대로 괜 찮 은 편 입 니 다.프로 토 콜 디자인 에 있어 서 충분 한 전망 성 이 없고 서비스 - mesh 가 되 기 에 적합 하지 않 습 니 다. 얼마나 우아 한 지 는 말 할 수 없 지만 어쨌든 비바람 이 이렇게 많은 해 동안 사용 되 었 습 니 다. 주변 에 도 많은 부대 구성 요소 가 있 습 니 다. 예 를 들 어 dubbo 2. js, dubbo - go, dubbo - cpp 는 어느 정도 에 다 국어 문 제 를 해결 하 였 습 니 다.
  • 웹 서비스: /, hession: /, thrift: / 등 프로 토 콜 은 기본적으로 기 존 프로 토 콜 의 서버 / 클 라 이언 트 에 적합 하기 위해 서 입 니 다. dubbo 프레임 워 크 의 api 를 빌려 그 기능 특성 을 사용 할 수 있 습 니 다. 의미 가 크 지 않 습 니 다.
  • redis: /, memcached: / / 등 프로 토 콜 은 사용자 설정 에 노출 된 프로 토 콜 이 아니 라 일반적으로 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 의 기술 공유' 는 글 에 대한 모든 의문 이 답 을 받 고 자바 와 관련 된 기술 공 유 를 가 져 옵 니 다.

    좋은 웹페이지 즐겨찾기