本文共 7772 字,大约阅读时间需要 25 分钟。
org.apache.avro avro 1.8.2 junit junit 4.12 org.apache.avro avro-maven-plugin 1.8.1 generate-sources schema ${project.basedir}/src/main/avro/ ${project.basedir}/src/main/java/ org.apache.maven.plugins maven-compiler-plugin
{ "type":"record", "namespace":"com.qidai", "name":"Employee", "doc":"Test Employee bean", "fields":[ {"name":"id","type":["null","int"]}, {"name":"name","type":["null","string"]}, {"name":"age","type":["null","int"]}, {"name":"gender","type":["null","string"]} ]}
@Testpublic void ser() throws Exception { Employee employee = Employee.newBuilder().setAge(12).setGender("NAN").setId(1).setName("tom").build(); DatumWriteremployeeDatumWriter = new SpecificDatumWriter<>(Employee.class); DataFileWriter dataFileWriter = new DataFileWriter<>(employeeDatumWriter); dataFileWriter.create(employee.getSchema(), new File("emp.avro")); dataFileWriter.append(employee); dataFileWriter.close();}@Testpublic void deSer() throws Exception { DatumReader employeeDatumReader = new SpecificDatumReader<>(Employee.class); DataFileReader dataFileReader = new DataFileReader<>(new File("emp.avro"), employeeDatumReader); Employee employee = null; while (dataFileReader.hasNext()) { employee = dataFileReader.next(); System.out.println(employee); }}
@Testpublic void ser() throws Exception { Schema schema = new Schema.Parser().parse(new File("emp.avsc")); GenericRecord empRecord1 = new GenericData.Record(schema); empRecord1.put("id", 1); empRecord1.put("name", "Ben"); empRecord1.put("age", 7); empRecord1.put("gender", "nv"); File file = new File("empser.avro"); DatumWriterdatumWriter = new GenericDatumWriter<>(schema); DataFileWriter dataFileWriter = new DataFileWriter<>(datumWriter); dataFileWriter.create(schema, file); dataFileWriter.append(empRecord1); dataFileWriter.close();}@Testpublic void deSer() throws Exception { //指定avro格式文件 Schema schema = new Schema.Parser().parse(new File("emp.avsc")); //指定序列化好的数据文件 File file = new File("empser.avro"); DatumReader datumReader = new GenericDatumReader<>(schema); DataFileReader dataFileReader = new DataFileReader<>(file, datumReader); GenericRecord emp = null; while (dataFileReader.hasNext()) { emp = dataFileReader.next(); System.out.println(emp); }}
{"namespace":"com.qidai.bean","name":"User","doc":"test rpc class","type":"record", "fields":[ {"name":"name","type":["string","null"]}, {"name":"age","type":["int","null"]}, {"name":"date","type":["string","null"]} ]}
@namespace("com.qidai.proto")protocol UserProtocol{ import schema "user.avsc"; string sendMes(com.qidai.bean.User user); //对应协议中的方法}
org.apache.avro avro 1.8.2 org.apache.avro avro-ipc 1.8.2 junit junit 4.12 org.apache.avro avro-maven-plugin 1.8.1 generate-sources schema idl-protocol ${project.basedir}/src/main/avro/ ${project.basedir}/src/main/java/ org.apache.maven.plugins maven-compiler-plugin
public class UserProtocolImpl implements UserProtocol { @Override public CharSequence sendMes(User user) throws AvroRemoteException { System.out.println("Server --> 接收" + user.toString()); return "Client sendMes " + user.toString(); }}
public class UserProtocolImpl implements UserProtocol { @Override public CharSequence sendMes(User user) throws AvroRemoteException { System.out.println("Client --> 发送" + user.toString()); return "Client sendMes " + user.toString(); }}
public class ServerApp { public static void main(String[] args) throws IOException, InterruptedException { Responder responder = new SpecificResponder(UserProtocol.class,new UserProtocolImpl()); SaslSocketServer server = new SaslSocketServer(responder,new InetSocketAddress(9999)); server.start(); Thread.sleep(5000000); }}
public class ClientApp { public static void main(String[] args) throws IOException { SaslSocketTransceiver transceiver = new SaslSocketTransceiver(new InetSocketAddress(9999)); UserProtocol client = SpecificRequestor.getClient(UserProtocol.class, transceiver); Scanner scanner = new Scanner(System.in); while (scanner.next() != null) { User user = new User(); user.setName("xiaofen"); System.out.println(client.sendMes(user)); } }}
测试:先启动serverApp,然后启动clientApp,这时候在client的console中输入任意值,会发现服务端和客户端都会输出消息
Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}Server --> {"name": "xiaofen", "age": null, "date": null}
1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}1Client sendMes {"name": "xiaofen", "age": null, "date": null}
2.基于netty的实现:NettyServer和NettyTransceiver
3.基于TCP的实现:SocketServer和SocketTransceiver 4.基于UDP的实现:DatagramServer和DatagramTransceiver 5.基于加密的TCP实现:SaslSocketServer和SaslSocketTransceiver转载地址:http://zuwzx.baihongyu.com/