springboot의 수동 건물 + 두보 + 사육사 프레임 RPC

1. RPC는 무엇입니까?

RPC는 의미 원격 프로 시저 호출 , 중국어 = 원격 호출. 우리는 먼저 시내 전화 봐.

시내 전화

예를 들면 다음 방법 우리는 하나의 컴퓨터에 로컬 호출되는 컨트롤러의 프로그램의 서비스 계층을 호출한다. 이 방법 (서비스) 및 프로그램은 동일한 프로세스에 의해 호출된다. 이러한 방법으로 우리는 직접 찾아 가서 어떤 방법으로 호출 할 수있는 바닥 포인터 (주소)를 통과했다.

원격 호출

그러나보다 약간의 동시성 이십만 이상의 높은 동시성, 고성능, 일반적으로, 당신은 최고 수준의 서버로 분리 해 할 수있는 일을 공유하는 분산 응용 프로그램을 사용하여 높은 신뢰성을 고려, 호출 그래서 다른 서비스를 기반으로. 이 RPC 원격 서비스 호출입니다.

2, 어떻게 RPC 서비스에?

1, 우리는 종종 시스템에서 수행하고 B는 /이 아키텍처 S, IMPL는 서비스 인터페이스를 노출하게 한 다음 전화를 걸. 그러나 큰 문제는 각 시간이 매우 우아, 그래서 매우 좋지 않아, 필요 코드를 작성 HTTP를 전송한다. 여부 우리는 고려합니다 시내 전화 그것처럼?

2 스프링 IOC는, 스프링 주입, 주입을 통한 서비스 객체와 함께 사용되는 물체가 주석을 스캔 @Reference 경우는, 다음 프록시 객체, 컨테이너에 프록시 객체를 생성 수득했다. 프록시의 내부는 RPC 원격 절차 호출 세션 객체를 통해 달성 될 것이다.

@Reference
private Service service;

...

service.add(1,2);

...

오늘 우리는 두보는 생각이 라인을 사용하는 것입니다 말한다.

RPC 두 가지 문제가 해결되어야합니다 :

(1) 분산 시스템, 서비스 호출 사이의 문제를 해결합니다.

(2) 원격 호출은 호출자가 원격 호출의 논리를 인식 할 수 있도록하는 것이, 지역의 한 쉽게 호출 할 수 있습니다.

아이디어의 RPC 실현

응용 프로그램은이 서비스의 구현 클래스처럼 보이는 사실, 클라이언트 런타임 라이브러리로, 원격 호출 RPC 방법을 통해 프록시 객체의 내부에 있다는 것입니다 프록시 객체에 올 때 클라이언트 스텁이 우리 위에, RPC 발신자입니다 소켓을 JDK, 마지막으로 내부 네트워크를 통해 달성되는 데이터의 전송을 실현하는 등의 원격 호출 키트의 실현이다.

이 과정에서 가장 중요한 것은가입니다 직렬화역 직렬화 데이터 전송 패킷이 진해야하기 때문에, 당신은 당신이 자바 바이너리 형식으로 객체 직렬화해야 할 사람들이 모르는 과거에 자바 객체를 던져, 패스 서버에 끝이 서버는 자바 객체 직렬화 복원 후받습니다.

3, Springboot + 두보 + 사육사가 RPC를 구현하여.

먼저 간단한 두보와 사육사 있습니다

일부 두보 핵심 기능 :

(1) 원격 메소드 호출 투명성 단지 로컬 메소드 호출 원격 메소드를 호출하는 것과 동일. 다른 서비스 사이의 각 메서드 호출 (말을하는 것입니다 좀 더 간단한 인터페이스 호출) 서비스는 소비자가 서비스를 제공 할 수있는 서비스를 제공 할 수있다.

(2) 부하 분산 및 내결함성,로드 밸런싱 전략의 기본은 무작위, 구성 가능한 옵션입니다.

(3) 자동 등록 및 서비스 발견, 죽은 서비스 제공자의 주소를 쓸 필요없는 IP 주소 레지스트리 기반 쿼리 인터페이스 이름 서비스 제공 업체, 부드럽게 추가하거나 서비스 제공을 제거 할 수 있습니다. 일반적인 사육사는 레지스트리을한다.

사육사 :

사육사는 클라이언트와 서버 서비스를 등록하는 등록 센터입니다.

우선은, 빵 서비스와 별도의 서버에 소시지 서비스, 우리는 그들이 (공급자) 제공 업체에 연락 튜브, 우리는 그들이 프로그램을 시작할 때, 그것은 서비스 센터에 등록됩니다, 그들은 좋은 관련 구성 두보와 사육사 있다고 가정 그들은 우리가 사육사 시각화 도구가 @Service이 댓글이 스프링 그것은 두보을 제공, 제공되지 자바에 반영 볼 수 있습니다 사용, 좋은 정보입니다.

그럼 우리는, 소비자 (소비자)라는 클라이언트가 그러한 (햄)와 같은 서비스를 원한다면, @Reference이 댓글을 발견 시작한 후, 그것은 해당 서비스를 찾아 등록하려면 등록 센터로 이동합니다 시작 한 번만 등록.

마지막으로, 호출, 소비자 장거리 전화 서비스가 필요 레지스트리에 응용 프로그램 및 레지스트리 반환에게 이러한 서비스의 목록을 보내드립니다, 다음 서비스 호출을 선택하면, 그것은 아래, 캐시 (비 필수) 목록에 추가됩니다 직접에있는 목록을 사용하여 호출합니다.

 

참고 : 소비자와 공급자는 경우에만 함께 사육사의 상호 작용 한 번만 시작합니다.

때문에 : 레지스트리는 소비자와 공급자의 작동에는 영향을 미치지 않습니다 다운, 심지어 사육사 서버는 소비자와 공급자가 여전히 정상적으로 작동, 내려갑니다. 때 소비자는 사육사의 서비스 제공 업체의 목록을 얻으려면 시작합니다. 모든 레지스트리 및 모니터링 센터 가동 중단은 공급자가 실행하고 공급자 목록의 로컬 캐시에 소비자, 소비자되었습니다 영향을주지 않습니다. 멀리 등록 센터 빈둥 거리다 후, 그러나 당신은 새로운 서비스를 등록 할 수 없습니다. 새로운 서비스를 등록 할 수 없습니다, 기존의 서비스는 작동에 영향을주지 않습니다.

코드 구현 :

프로젝트 디렉토리 :

상위 받는다는 치어

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rpc</groupId>
    <artifactId>MyRPC</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>dubbo-api</module>
        <module>dobbo-consumer</module>
        <module>dubbo-provider</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <curator-framework.version>4.0.1</curator-framework.version>
        <zookeeper.version>3.4.13</zookeeper.version>
        <dubbo.starter.version>0.2.0</dubbo.starter.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.starter.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator-framework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

dobbo 화재

package com.rpc.service;

public interface MistraService {

    String printInfo(String msg);
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>MyRPC</artifactId>
        <groupId>com.rpc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-api</artifactId>


</project>

dobbo-제공

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>MyRPC</artifactId>
        <groupId>com.rpc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-provider</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.rpc</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>


</project>
package com.rpc.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.rpc.service.MistraService;

@Service(version = "${mistra.service.version}")
public class MistraServiceImpl implements MistraService {

    @Override
    public String printInfo(String msg) {
        return "hello " + msg;
    }
}
package com.rpc;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }
}
spring.application.name = dubbo-provider
server.port = 9090
dubbo.application.name = dubbo-provider
mistra.service.version = 1.0.0
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
dubbo.registry.address = zookeeper://localhost:2181
dubbo.provider.timeout = 1000

Dobbo-consomer

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>MyRPC</artifactId>
        <groupId>com.rpc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dobbo-consumer</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.rpc</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>


</project>

 

package com.rpc;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }

}

 

package com.rpc.rest;

import com.alibaba.dubbo.config.annotation.Reference;
import com.rpc.service.MistraService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("test")
public class TestRestController {

    @Reference(version = "${mistra.service.version}")
    private MistraService mistraService;

    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable("name") String name) {
        return mistraService.printInfo(name);
    }
}
spring.application.name = dubbo-consumer
server.port = 9091
dubbo.application.name = dubbo-consumer
mistra.service.version = 1.0.0
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
dubbo.registry.address = zookeeper://localhost:2181
dubbo.consumer.timeout = 5000

[email protected] : 프로젝트의 주소 Zesystem / 내 - rpc.git

게시 된 134 개 원래 기사 · 원의 찬양 (91) · 전망 160 000 +

추천

출처blog.csdn.net/weixin_44588495/article/details/104855903