《Netty学习打卡--从小白到放弃》----- 13 - netty 之thrift 简单RPC通信

打卡日期(2019-07-12)

学习要点

简单实现thrift客户端与服务器端通信
-   1.编写thrift文件
-   2.利用thrift自动生成代码工具,将.thrift文件转换成需要的开发语言文件
-   3.编写服务端代码
-   4.编写客户端代码

1.编写thrift文件

#包名
namespace java com.dragon.thrift

#定义数据类型
typedef i16 short
typedef i32 int
typedef string String
typedef bool boolean
typedef double Double

#定义结构体
struct Person{
    1: optional String name
    2: optional String address
    3: optional int age
    4: optional boolean married
    5: optional Double weight
}

exception DataException{
    1: optional String message
    2: optional int code
}

service PersonService{

    Person getPersonByUserName(1: required String name) throws (1: DataException dataEx)

    void savePerson(1: required Person person) throws(1:DataException dataEx)

}

2.生成对应开发语言文件

运行命令:将.thrift文件转成java文件
thrift --gen java src/main/thrift/Person.thrift

3.编写客户端代码

package com.dragon.thrift.server;

import com.dragon.thrift.DataException;
import com.dragon.thrift.Person;
import com.dragon.thrift.PersonService;
import org.apache.thrift.TException;

public class PersonServiceImpl implements PersonService.Iface {
    
    
    @Override
    public Person getPersonByUserName(String name) throws DataException, TException {
    
    
         System.out.println("通过用户名称获取用户信息:"+ name);
        Person person = null;
        if (name.equals("张三")) {
    
    
            person = new Person();
            person.setName("张三");
            person.setAddress("北京市朝阳区");
            person.setMarried(false);
            person.setWeight(100.01);
            person.setAge(30);
        } else {
    
    
            DataException dataException = new DataException();
            dataException.setCode(101);
            dataException.setMessage("用户不存在");
            throw dataException;
        }
        return person;
    }

    @Override
    public void savePerson(Person person) throws DataException, TException {
    
    
         System.out.println("保存用户信息 savePerson");
        System.out.println(person.getName());
        System.out.println(person.getAddress());
        System.out.println(person.getWeight());
    }
}
package com.dragon.thrift.server;

import com.dragon.thrift.PersonService;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

public class MyThriftServer {
    
    

    public static void main(String[] params) throws TTransportException {
    
    

        // 非阻塞服务socket,绑定端口8080
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8080);

        // THsHaServer 其模型任务是读写任务放到线程池里面去处理,半同步半异步服务模型
        // Half-sync,用于handler对RPC同步处理
        // Half-async,处理IO事件
        /***
         * @Param minWorkerThreads 最少工作线程数,默认5
         * @Param maxWorkerThreads 最大工作线程数,默认Integer的最大值 2147483647
         */
        THsHaServer.Args args = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);

        // processor 服务器端辅助对象sklenton,负责调用服务器端的本地代码
        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());

        // Protocol 设置协议层,将数据转换成不同的格式
        args.protocolFactory(new TCompactProtocol.Factory());

        // transport 设置传输层
        args.transportFactory(new TFramedTransport.Factory());

        // sklenton 服务端辅助对象,调用服务端的本地方法
        args.processorFactory(new TProcessorFactory(processor));


        TServer server = new THsHaServer(args);

        // 启动service
        server.serve();
    }
}

4.编写客户端代码

package com.dragon.thrift.server;

import com.dragon.thrift.Person;
import com.dragon.thrift.PersonService;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

public class MyThriftClient {
    
    

    public static void main(String[] args) throws TTransportException {
    
    

        // 设置传输层
        TTransport tTransport = new TFramedTransport(new TSocket("localhost",8080),600);

        // 设置传输层协议
        TProtocol protocol = new TCompactProtocol(tTransport);

        // 客户端服务对象,stub
        PersonService.Client client = new PersonService.Client(protocol);

        try {
    
    
            // 开启传输
            tTransport.open();

            Person person = client.getPersonByUserName("张三");
            System.out.println(person.getName());
            System.out.println(person.getWeight());
            System.out.println(person.getAddress());
            System.out.println(person.getAge());


            System.out.println("=========================");
            person.setName("李四");
            client.savePerson(person);



        }catch (Exception e){
    
    

        }finally {
    
    
            // 关闭传输
            tTransport.close();
        }
    }
}

运行客户端和服务端代码,运行结果如下:

Server
通过用户名称获取用户信息:张三
保存用户信息 savePerson
李四
北京市朝阳区
100.01


Client
张三
100.01
北京市朝阳区
30
=========================

至此一个完整利用java 基于thrift的RPC通讯案例完成

猜你喜欢

转载自blog.csdn.net/u011291990/article/details/95598196