博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thrift RPC实战(六) spring集成thrift
阅读量:5913 次
发布时间:2019-06-19

本文共 4363 字,大约阅读时间需要 14 分钟。

hot3.png

1.服务端设置

通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下

接下来定义ThriftServerProxy类,定义bean中需要用到的3个属性,接下来通过反射来实现服务的启动。

public class RpcServerProxy {    // 端口    private int port;    // 服务接口    private String serviceInterface;    //服务实现类    private Object serviceImplObject;    /**     * 启动RPC服务     */    public void start() {        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();        cachedThreadPool.execute(() -> {            try {                TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(getPort());                Class processor = Class.forName(getServiceInterface() + "$Processor");                Class face = Class.forName(getServiceInterface() + "$Iface");                Constructor con = processor.getConstructor(face);                TProcessor tProcessor = (TProcessor) con.newInstance(serviceImplObject);                TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory(true, true);                TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args(serverTransport);                args.protocolFactory(factory);                args.processor(tProcessor);                TServer server = new TThreadedSelectorServer(args);                // 启动服务                server.serve();            } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException                    | InvocationTargetException | TTransportException e) {                e.printStackTrace();            }        });    }    public Object getServiceImplObject() {        return serviceImplObject;    }    public void setServiceImplObject(Object serviceImplObject) {        this.serviceImplObject = serviceImplObject;    }    public int getPort() {        return port;    }    public void setPort(int port) {        this.port = port;    }    public String getServiceInterface() {        return serviceInterface;    }    public void setServiceInterface(String serviceInterface) {        this.serviceInterface = serviceInterface;    }}

配置监听启动服务

** * 服务启动监听器 */public class RpcServerStartListener implements ServletContextListener {    @Override    public void contextInitialized(ServletContextEvent event) {        try {            ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());            // 获取服务代理列表            List
proxyList = ((List
) context.getBean("serverProxyList")); if (!CollectionUtils.isEmpty(proxyList)) { // 启动代理服务 proxyList.forEach(proxy -> proxy.start()); } } catch (Exception e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { }}

最后在web.xml中添加listener即可

2.客户端配置

对于客户端,从连接池里面获取一个可用的服务端连接,通过反射的方式获取客户端,在spring-client.xml中配置如下:

客户端的代理对象获取client代码:

public class ThriftClientProxy {    private ConnectionManager connectionManager;    public ConnectionManager getConnectionManager() {        return connectionManager;    }    public void setConnectionManager(ConnectionManager connectionManager) {        this.connectionManager = connectionManager;    }    public Object getClient(Class clazz) {        Object result = null;        try {            TTransport transport = connectionManager.getSocket();            TProtocol protocol = new TBinaryProtocol(transport);            Class client = Class.forName(clazz.getName() + "$Client");            Constructor con = client.getConstructor(TProtocol.class);            result = con.newInstance(protocol);            //transport.open();        } catch (Exception e) {            e.printStackTrace();        }        return result;    }}

使用:

ResourceMgtRpc.Iface client = (ResourceMgtRpc.Iface) thriftClientProxy.getClient(ResourceMgtRpc.class);// 封装请求参数QuerySyncStatusRequest requestPo = new QuerySyncStatusRequest();requestPo.setMasterSourceId(master.getResourceId());QuerySyncStatusResponse responsePo = client.querySynStatus(requestPo);

当前的不足:

  没有使用订阅服务列表, 使得在配置中, 需要指定ip:port列表,如果有多个指定的ip:port需要配置多个连接池。

转载于:https://my.oschina.net/u/3737136/blog/1834473

你可能感兴趣的文章
前端进阶之 a 可以同时 == 1 && == 2 && == 3吗?
查看>>
告别抽象的JS执行环境、作用域、作用域链、闭包
查看>>
9012到了!AI时代里,只会简单编程的你会怎么样?
查看>>
中心化交易所与去中心化交易所的优劣势到底在哪?
查看>>
阿里云开年Hi购季活动 新用户分会场必抢5折爆款清单
查看>>
Canvas API总结
查看>>
非渔之鱼,君其飨之:使用 React+Mustache 搭建一个类似蚂蚁金服的 AntDesign 设计语言站点...
查看>>
关于e3mall项目的实战
查看>>
小程序-腾讯人脸识别接口调用(人脸检测与分析)
查看>>
何时使用Entity或DTO
查看>>
这是硅谷的50条增长黑客技巧,你知道几条?
查看>>
SQLServer之修改存储过程
查看>>
1月10日云栖精选夜读:专访金榕:四年蜕变,阿里iDST是如何登上浪潮之巅的?...
查看>>
区块链100讲:梅克尔树保障区块链数据不可篡改,想换根就要砍树!
查看>>
mac搭建openresty服务
查看>>
html+css+js制作一个简易计算器
查看>>
基于iPhone 上的运动协处理器M7判断用户当前的运动(姿态)类型
查看>>
Android Note - 代码优化
查看>>
vue-cli中模拟数据的两种方法
查看>>
Item-Resume
查看>>