1. RPCとは何ですか?
RPCの略リモートプロシージャコール、中国=リモート呼び出し。私たちは、最初にローカルのコールを見てください。
市内通話
例:メソッドは、我々は、単一のマシン上のローカル呼び出しであるコントローラ、プログラムでサービス層を呼び出します。この方法(サービス)とプログラムが同じプロセスで呼び出されます。このようにして、我々は直接見に行くためにどの方法で呼び出すことができます下のポインタ(アドレス)を渡されました。
リモート呼び出し
しかし、以上の20万以上、高い同時実行に基づいて、高性能、高信頼性の考慮事項は、一般的に、分散アプリケーションを使用して、いくつかの並行処理のために、他のサービスを呼び出すためにそうすることを、あなたはトップクラスのサーバーに出て分離することができ、物事を共有します。これは、RPCリモートサービスコールです。
2、どのようにRPCサービスへ?
1は、私たちは多くの場合、システム内で行うと、B / Sこのアーキテクチャ、Implをサービス・インターフェースを公開して、呼び出しを行いましょう。しかし、それは、それぞれの時間は、書き込みコードへのHTTPの必要性を送信する、非常にエレガントなので、非常に良いではない大きな問題です。我々は検討したいと思うかどうかであるローカルコールそれのように、?
オブジェクトがスキャンされる場合に2は、春のIoC、射出バネ、射出介してサービス・オブジェクトと一緒に使用、注釈は、それが容器にプロキシオブジェクトは、プロキシオブジェクトを生成し得、@Referenceを添加しました。プロキシの内部には、RPCリモートプロシージャコールHttpClientを介して達成されます。
@Reference
private Service service;
...
service.add(1,2);
...
今日はダボは思考のこのラインを使用することであると言います。
RPC対処すべき2つの問題:
(1)分散システム、サービス呼び出しの間に問題を解決します。
(2)リモート呼び出し、呼び出し側がリモート呼び出しのロジックを知覚することができないように、ローカルのように簡単に呼び出すことができるようにします。
アイデアのRPC実現
アプリケーションがRPC発信者であることは、クライアントランタイムライブラリとして、サービス実装クラスのように見えますが、実際には、リモート呼び出しのRPCの方法を通じてプロキシオブジェクトの内部にあること、であるプロキシオブジェクトになると、クライアントスタブは、私たちの上にありますソケットにJDK、および最終的には基盤となるネットワークを介して達成されたデータの伝送を実現するなどのリモート呼び出しキットの実現、です。
このプロセスは、最も重要なことはすることですシリアライズとデシリアライズ、データ送信パケットがバイナリでなければならないので、あなただけの過去にJavaオブジェクトを投げる人が知らない、あなたはJavaはバイナリ形式にオブジェクトをシリアライズする必要があり、パスサーバー、サーバーへの最後は、Javaオブジェクトにデシリアライズ、後に受け取ります。
3、Springboot +ダボ+飼育係は、RPCを実装して使用しました。
まず簡単なのダボと飼育係があります
いくつかのダボのコア機能:
単にローカルメソッド呼び出し、リモート・メソッドを呼び出すと同様に(1)リモート・メソッド呼び出しの透明性、。(もう少し簡単なインターフェース呼び出しを言うことです)異なるサービス間の各メソッドの呼び出しは、サービスは、サービスプロバイダかもしれ消費者にも役立つことができます。
(2)負荷分散とフォールトトレランス、負荷分散戦略のデフォルトはランダム、設定可能なオプションです。
(3)自動登録とサービスの発見、死んサービスプロバイダのアドレスを書き込むために不要になった、IPアドレスレジストリベースのクエリインタフェース名、サービスプロバイダ、およびスムーズなサービス・プロバイダーを追加または削除することができます。一般的な飼育係は、レジストリを行います。
飼育係:
飼育係は、クライアントとサーバーのサービスを登録するための登録センターです。
まず第一に、それは、パンのサービスと別々のサーバー上のソーセージのサービスは、我々は、彼らが(プロバイダ)プロバイダを呼び出すチューブ、我々は、彼らがプログラムを起動するとき、それはサービスセンターに登録されます、彼らは良い関連する構成ダボと飼育係あると仮定します彼らは、良い情報です我々は、飼育係の視覚化ツールを使用するJavaに反映見ることができ@Serviceこのコメントで、この春は、それがダボを提供され、提供されていません。
その後、我々はその後、消費者(消費者)と呼ばれるクライアントそれだけで、このような(ハム)のようなサービスを望んでいた場合、@Referenceこのコメントを見つけ開始した後、それは、対応するサービスを見つけるために登録する登録センターに行くを開始します一度だけ登録。
最後に、必要に応じて、消費者の長距離電話サービスを呼び出し、レジストリにアプリケーションが送信されます、そして、レジストリは、その後、そのようなサービスのリストを返すサービスコールを選択して、それがキャッシュされた(非必須)のリストに追加されます、下直接上のリストを使用するために呼び出します。
注:消費者やプロバイダのみ起動したときに一度だけと飼育係が相互作用します。
ので:レジストリは、消費者とプロバイダーの動作には影響しませんダウンしても、飼育係のサーバーがダウンし、消費者とプロバイダーは、まだ正常に動作しています。消費者は、飼育係からサービスプロバイダのリストを取得するために起動したとき。すべてのレジストリと監視センターのダウンタイムは、プロバイダが実行され、プロバイダリストのローカルキャッシュの消費者、消費者にされてきた影響はありません。離れ登録センターの遊び人の後、しかし、あなたは新しいサービスを登録することはできません。新しいサービスを登録することはできません、古いサービスは、動作には影響を与えません。
コードの実装:
プロジェクトディレクトリ:
トップMavenのPOM
<?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 / MY-rpc.git