construção manual de springboot + dubbo + tratador RPC quadro

1. O que é RPC?

rpc significa Remote Procedure Call , chinês = chamadas remotas. Nós primeiro olhar para chamada local.

chamadas locais

Por exemplo: um método que chamamos a camada de serviço no programa no controlador, que é uma chamada local em uma única máquina. Que este método (serviço) e o programa é invocado no mesmo processo. Desta forma, passou o ponteiro inferior (endereço) pode ser encontrado diretamente chamar qual caminho a percorrer.

chamada remota

Mas, por alguma concorrência mais de duzentos mil ou mais, com base em alta concorrência, de alto desempenho, considerações de alta confiabilidade geralmente usam aplicações distribuídas, irá compartilhar as coisas que você pode separar-se em um servidor de classe superior, de modo que outro serviço de chamada. Esta é chamada de serviço remoto rpc.

2, como serviços RPC?

1, que muitas vezes fazer no sistema e B / S essa arquitetura, vamos Impl expor uma interface de serviço, e, em seguida, fazer a chamada. Mas é um grande problema, sempre que o envio Http necessidade de escrever código, por isso não é muito bom, muito elegante. Nós gostamos de considerar é se uma chamada local , como ele?

2, utilizado em conjunto com a mola COI, objecto de serviço através de injecção da mola, de injecção, se o objecto é verificado anotações adicionado @Reference, então dar-lhe gera um objecto de proxy, o objecto de proxy para o recipiente. O interior do proxy deve ser alcançado através da RPC Remote Procedure Call httpclient.

@Reference
private Service service;

...

service.add(1,2);

...

Hoje dizemos dubbo é usar esta linha de pensamento.

RPC duas questões a serem abordadas:

(1) para resolver o sistema distribuído, problemas entre chamadas de serviço.

(2) chamada remota, para ser capaz de chamar tão fácil como local, para que o chamador não pode perceber a lógica de chamadas remotas.

realização RPC de idéias

aplicação é chamadores rpc, Cliente Stub está acima de nós quando se trata do objeto proxy, isto é, que se parece com classe de implementação de serviço, de fato, é interno para o objeto proxy com uma maneira rpc chamada remota, como Cliente Run-Time Library, é a realização de um kit de chamada remota, como o JDK da tomada, e, finalmente, realizar a transmissão de dados é alcançada através da rede subjacente.

Este processo é a coisa mais importante é a serialização e de-serialização , porque o pacote de transmissão de dados deve ser binário, você acabou de jogar um objeto Java no passado, as pessoas não sabem, você tem que serializar objetos Java em um formato binário, passe um fim Server, Server recebe depois, então desserializado em objetos Java.

3, usando Springboot + Dubbo + Zookeeper implementar RPC.

Primeiro são breves dubbo e zookeeper

Algumas funções essenciais dubbo:

(1) transparência invocação de método remoto, assim como o mesmo que chamar um local métodos remotos chamada de método. Cada chamada de método entre os diferentes serviços (isto é um pouco de chamadas de interface mais simples), um serviço pode ser um provedor de serviços pode também servir os consumidores.

(2) balanceamento de carga e tolerância a falhas, balanceamento de carga padrão estratégia é aleatória, opções configuráveis.

(3) a descoberta de registro e serviço automático, não mais necessidade de escrever o serviço de endereço provedor de mortos, registro de endereços consulta com base fornecedor de serviços nome da interface IP, e pode ser facilmente adicionar ou remover provedor de serviços. Zookeeper comum fazer registro.

Funcionário do zoológico:

zookeeper é um centro registrada para registrar serviços de cliente e servidor.

Primeiro de tudo, serviço de pão e serviço lingüiça em servidores separados, nós tubos eles chamam provedor (provedor), assumimos que eles são bons dubbo configuração relacionada e tratador, quando começar o programa, ele irá registrar com o centro de serviço eles são uma boa informação, usamos ferramentas de visualização zookeeper pode ser visto refletido em java é @Service este comentário, esta fonte não é fornecido, ele é fornecido dubbo.

Em seguida, iniciar o cliente chamado o consumidor (consumidores), após o início @Reference encontrado este comentário, ele irá para o centro de registro para registrar-se para encontrar o serviço correspondente, se ele só queria um serviço como o (presunto), seguida registrado apenas uma vez.

Finalmente, chamando, consumidor de longa distância serviço de chamada, se necessário, irá enviar um pedido para o registro, eo registro retorna uma lista de tais serviços, em seguida, selecione uma chamada de serviço, e ele será adicionado à lista de cache (não essenciais), sob chamar para usar diretamente a lista nele.

 

Nota: Os consumidores e prestadores só começam quando o interagem zookeeper com o uma vez e apenas uma vez.

Porque: o registro é para baixo não afeta o funcionamento dos consumidores e prestadores de serviços, servidor mesmo tratador vai para baixo, os consumidores e prestadores ainda estão operando normalmente. Quando os consumidores começam a obter uma lista de prestadores de serviços do tratador. Tudo registro e monitoramento de centro de tempo de inatividade, não afeta o provedor foi executado e os consumidores, os consumidores no cache local da lista de provedor. Depois dawdle centro de registo de distância, mas você não pode registrar o novo serviço. Não é possível registar o novo serviço, o antigo serviço não afeta a operação.

implementação de código:

diretório do projeto:

O pom top maven

<?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-fogo

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-provider

<?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

Endereço do projeto: [email protected]: Zesystem / my-rpc.git

Publicado 134 artigos originais · Louvor obteve 91 · vista 160 000 +

Acho que você gosta

Origin blog.csdn.net/weixin_44588495/article/details/104855903
Recomendado
Clasificación