1)用户(User)
2)用户存根(User-Stub)
3)RPC通信包(被称为RPCRuntime)
4)服务器存根(Server)
5)服务器(Server)
当用户发起一个远程CALL的时候,远程如下:
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.0modelVersion> <groupId>com.blbgroupId> <artifactId>Avro_RPCartifactId> <version>1.0-SNAPSHOTversion> <name>Avro_RPCname> <url>http://www.example.comurl> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <maven.compiler.source>1.7maven.compiler.source> <maven.compiler.target>1.7maven.compiler.target> properties> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.11version> <scope>testscope> dependency> <dependency> <groupId>org.apache.avrogroupId> <artifactId>avroartifactId> <version>1.8.2version> dependency> <dependency> <groupId>org.apache.avrogroupId> <artifactId>avro-toolsartifactId> <version>1.8.2version> dependency> <dependency> <groupId>org.apache.avrogroupId> <artifactId>avro-maven-pluginartifactId> <version>1.8.2version> dependency> <dependency> <groupId>org.apache.avrogroupId> <artifactId>avro-compilerartifactId> <version>1.8.2version> dependency> <dependency> <groupId>org.apache.avrogroupId> <artifactId>avro-ipcartifactId> <version>1.8.2version> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.apache.avrogroupId> <artifactId>avro-maven-pluginartifactId> <version>1.8.2version> <executions> <execution> <phase>generate-sourcesphase> <goals> <goal>schemagoal> goals> <configuration> <sourceDirectory>${project.basedir}/src/main/avro/sourceDirectory> <outputDirectory>${project.basedir}/src/main/java/outputDirectory> configuration> execution> executions> plugin> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-compiler-pluginartifactId> <configuration> <source>1.8source> <target>1.8target> configuration> plugin> plugins> <pluginManagement> <plugins> <plugin> <artifactId>maven-clean-pluginartifactId> <version>3.1.0version> plugin> <plugin> <artifactId>maven-resources-pluginartifactId> <version>3.0.2version> plugin> <plugin> <artifactId>maven-compiler-pluginartifactId> <version>3.8.0version> plugin> <plugin> <artifactId>maven-surefire-pluginartifactId> <version>2.22.1version> plugin> <plugin> <artifactId>maven-jar-pluginartifactId> <version>3.0.2version> plugin> <plugin> <artifactId>maven-install-pluginartifactId> <version>2.5.2version> plugin> <plugin> <artifactId>maven-deploy-pluginartifactId> <version>2.8.2version> plugin> <plugin> <artifactId>maven-site-pluginartifactId> <version>3.7.1version> plugin> <plugin> <artifactId>maven-project-info-reports-pluginartifactId> <version>3.0.0version> plugin> plugins> pluginManagement> build> project>
@namespace("rpc.service") protocol AddService{ int add(int i,int y); }
@namespace("rpc.service") protocol TransferService{ import schema "User.avsc"; void parseUser(avro.domain.User user); }
@namespace("rpc.service") protocol MapService{ import schema "User.avsc"; void parseUserMap(map userMap); }
@namespace("com.service") protocol AddService{ import schema "user.avsc"; int add(int x , int y); void parseUser(com.domain.User user); }
package com.blb.service; import com.blb.pojo.User; import org.apache.avro.AvroRemoteException; public class AddServiceImpl implements AddService { @Override public int add(int x, int y) throws AvroRemoteException { System.out.println(x+y); return x+y; } @Override public Void parseUser(User user) throws AvroRemoteException { System.out.println(user); return null; } }
package com.blb.server; import com.blb.service.AddService; import com.blb.service.AddServiceImpl; import org.apache.avro.ipc.NettyServer; import org.apache.avro.ipc.specific.SpecificResponder; import java.net.InetSocketAddress; public class RPC_Server { public static void main(String[] args) { NettyServer server = new NettyServer( new SpecificResponder(AddService.class,new AddServiceImpl()), new InetSocketAddress(9999) ); System.out.println("服务端启动"); } }
package com.blb.client; import com.blb.service.AddService; import org.apache.avro.ipc.NettyTransceiver; import org.apache.avro.ipc.specific.SpecificRequestor; import java.io.IOException; import java.net.InetSocketAddress; public class RPC_Client { public static void main(String[] args) throws IOException { NettyTransceiver client = new NettyTransceiver( new InetSocketAddress("127.0.0.1",9999) ); //--因为接口不能直接使用,avro底层是通过jdk动态代理生成接口的代理对象 AddService proxy = SpecificRequestor.getClient(AddService.class,client); int result = proxy.add(2,3); System.out.println("客户端收到结果:"+result); } }
Avro实现RPC