zoukankan      html  css  js  c++  java
  • RPC框架--missian框架

    Missian简介

    注:(创始者不明,应用于sina下面的公司(爱问))

    Missian是一个构建于MinaHessian基础上的异步RPC框架,能够兼容HTTP协议和TCP协议,能和Hessian互通兼容,它提供了:

    1、一个基于mina的高性能服务器,具备mina所有的一切优秀基因。Missian服务器能够在一个端口之上兼容tcp和http协议格式,因 此开启了Missian服务之后,即可以用Missian客户端调用(同步/异步,HTTP/TCP),也可以供Hessian客户端调用。

    2、一个基于阻塞式的传统Socket的同步客户端,同样支持HTTP和TCP,它可以使用HTTP或TCP去访问Missian服务,同时也可以 使用HTTP方式去访问Hessian服务。您可以选择使用短连接的方式,也可以使用长连接(这时强制要求使用连接池,但Missian提供了一个基于 apache commons-pool的Socket连接池实现)。可以根据具体情况决定使用方式。

    3、一个基于Mina NioSocketConnector的异步客户端。默认使用一个4个线程的线程池来处理回调,但开发者也可以指定线程数,或者传入一个存在的线程池。异 步客户端只能调用Missian服务,而不能够调用Hessian服务(正在思考如何实现)。同样,协议可以是HTTP或者TCP。

    Mina: 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框,和netty框架类似;

    Hessian:采用的是二进制协议,所以它很适合于发送二进制数据的RPC框架,基于http的同步框架

    missian主要实现

    /**
    * api: 接口
    * url:远程调用RPC服务器的地址
    * loader :对象
    **/
    public
    Object create(Class<?> api, String url, ClassLoader loader) { if (api == null) throw new NullPointerException( "api must not be null for HessianProxyFactory.create()"); InvocationHandler handler = null; TransportURL u = new TransportURL(url); handler = new SyncMissianProxy(u, this);            // 通过 hessian 远程调度 初始化 hander return Proxy.newProxyInstance(loader, new Class[] { api,    // 通过动态代理实现接口 HessianRemoteObject.class }, handler); }

    missian整合spring搭建使用

    1、引入jar包

        <dependency>
                <groupId>missian</groupId>
                <artifactId>missian-wenwo</artifactId>  <!--  此包在私服暂时找不到,sina下的框架 -->
                <version>0.4.4</version>
                <exclusions>
                    <exclusion>
                        <artifactId>spring-core</artifactId>
                        <groupId>org.springframework</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>spring-context</artifactId>
                        <groupId>org.springframework</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

    2、搭建服务器 beans-context-missian.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
    
        <bean
            class="org.springframework.beans.factory.config.CustomEditorConfigurer ">
            <property name="customEditors">
                <map>
                    <entry key="java.net.SocketAddress">
                        <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
                    </entry>
                </map>
            </property>
        </bean>
        <!-- The IoHandler implementation -->
        <bean id="minaHandler" class="com.missian.server.handler.MissianHandler">
            <constructor-arg>
                <bean class="com.missian.common.beanlocate.SpringLocator" />
            </constructor-arg>
        </bean>
    
        <!-- the IoFilters -->
        <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
        <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
            <constructor-arg>
                <bean class="com.missian.server.codec.MissianCodecFactory " />
            </constructor-arg>
        </bean>
        <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter">
            <property name="messageReceivedLogLevel" value="DEBUG" />
            <property name="messageSentLogLevel" value="DEBUG" />
            <property name="sessionCreatedLogLevel" value="DEBUG" />
            <property name="sessionClosedLogLevel" value="DEBUG" />
            <property name="sessionIdleLogLevel" value="DEBUG" />
            <property name="sessionOpenedLogLevel" value="DEBUG" />
        </bean>
        <!-- The non-SSL filter chain. -->
        <bean id="filterChainBuilder"
            class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
            <property name="filters">
                <map>
                    <entry key="codecFilter" value-ref="codecFilter" />
                    <entry key="executor" value-ref="executorFilter" />
                    <entry key="loggingFilter" value-ref="loggingFilter" />
                </map>
            </property>
        </bean>
        <!-- The IoAcceptor which binds to port 1235 server side  对外开放端口 1235 -->
        <bean id="minaAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
            init-method="bind" destroy-method="unbind">
            <property name="defaultLocalAddress" value=":1235" />
            <property name="handler" ref="minaHandler" />
            <property name="reuseAddress" value="true" />
            <property name="filterChainBuilder" ref="filterChainBuilder" />
        </bean>
        
        <bean id="missianFactory" class="com.missian.client.sync.SyncMissianProxyFactory">
            <constructor-arg index="0">
                <bean class="com.missian.client.NetworkConfig">
                    <property name="readTimeout" value="60000"/>
                    <property name="connectTimeout" value="60000"/>
                    <property name="receiveBufferSize" value="2048"/>
                </bean>
            </constructor-arg>
        </bean>
        
    </beans>

    3、搭建客户端beans-context-missianclient.xml,可以访问其它的missan服务器

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
        <bean id="weiboBigNodeFacade" factory-bean="missianFactory" factory-method="create">
            <constructor-arg index="0" value="com.wenwo.weiboproxy.service.WeiboBigNodeFacade" type="java.lang.Class" />   <!-- 要调用的接口 ,此接口必须在missan服务器中实现了,获取交给了spring管理-->
            <constructor-arg index="1" value="tcp://127.0.0.1:1235/weiboBigNodeFacade" />                     <!--  调用的服务器和接口  -->
        </bean>
        
    </beans>

    4、使用RPC

    这就是使用rpc的过程

  • 相关阅读:
    vue证明题二,让vue跑起来
    vue证明题一,vue全家桶的构成
    Vue证明题
    layDay日期格式不合法报错解决
    【ASP.NET Core】运行原理(3):认证
    【ASP.NET Core】运行原理(2):启动WebHost
    【ASP.NET Core】运行原理(1):创建WebHost
    [Open Source] .NET 基于StackExchange.Redis的扩展
    [高并发]EntityFramework之高性能扩展
    [Tool] Git 使用 与 Git Flow
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/10330314.html
Copyright © 2011-2022 走看看