NettyClient端调用remote service的方式

递归王子
• 阅读 4309

使用netty开发rpc的话,对于client端来说,面临的一个问题就是client如何方便地对远程服务进行调用。java的rmi通过代理模式给了很好的实例,通过代理,使得调用远程服务像调用本地服务一样,对使用者来说,非常简便。对于发布的服务,使用java的接口暴露给使用者,使用者引入该服务接口,然后配置接口。这里简述了几种具体的调用方式。

不使用ioc的方式

public void proxyDemo(){
        HelloService helloService = client.rpcProxy(HelloService.class, Pair.of(500L, TimeUnit.MILLISECONDS));
        System.out.println(helloService.say("proxy demo"));
    }

这个是最直接的使用方式,通过jdk的proxy返回代理类,然后直接调用。不过,一般工程里头涉及多次调用的话,每次new一个代理类比较浪费,可以考虑集成ioc容器。以下几种就是使用spring的调用方式。

java config方式

    @Bean
    public HelloService buildHelloService(RpcProxyFactory rpcProxyFactory){
        return rpcProxyFactory.proxyBean(HelloService.class,100/*timeout*/);
    }

好处是,可以直接共用service-api的接口,不好的是java config稍微不如xml直观,不过适应就好

xml方式

<bean id="helloService" class="com.codecraft.rpc.spring.SpringProxyFactoryBean">
        <property name="innerClassName">
            <value>com.codecraft.rpc.service.demo.HelloService</value>
        </property>
        <property name="timeoutInMillis">
            <value>200</value>
        </property>
    </bean>

这种方式就是配置感觉略微复杂点,不过还可以接受,具体可参照navi

自定义schema的xml

<dubbo:reference id="helloService" interface="com.codecraft.rpc.service.demo.HelloService" timeout="200"/>

参照dubbo的方式,自定义schema,dubbo-config-spring,这种方式是使用简单,但是扩展spring的xsd略微复杂。

client再次定义接口

使用spring的scanner的方式,client端再次写接口添加注解,然后client端扫描装配,重复定义,不建议用,具体可参照rpc-spring

参考

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
lzy lzy
3年前
RPC框架手撕之路---初步了解RPC(小白勿喷)
博主小菜鸡一只,目前研二上学期,之前对rpc框架了解不多,想课余时间丰富一下自己的java知识,通过该系列博客勉励自己,内容对大佬来说可能过于简单,还请轻喷,谢谢。初步理解:RPC是指远程过程调用,通过网络从远程计算机程序上请求服务,此框架需要做到的是——使得客户端直接调用服务端的方法就像调用本地方法一样简单,所以一般不涉及到解析和封装HTTP请求和相应的
Stella981 Stella981
3年前
Eureka Server集群重启问题追踪
问题在生产环境重启EurekaServer集群的时候,发现订单客户端调用分布式Id生成服务出错,1Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: IDG显示订单服务调不到
Stella981 Stella981
3年前
Feign请求响应结果被截取com.fasterxml.jackson.core.io.JsonEOFException
在生产环境使用feign调用外部接口时,偶尔会出现下面错误2020101511:00:18,535ERRORcom.shein.abc.rmp.controller.RecExplainConfigControllerrec_explain_query.failffeign.codec.DecodeExc
Wesley13 Wesley13
3年前
RPC原理及实现
1简介RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。2调用分类RPC调用分以下两种:同步调用客户方等待调用执行完成并返回结果。
Wesley13 Wesley13
3年前
C++实现简单的RPC框架
简介    RPC是远程过程调用(RemoteProcedureCall)的缩写形式 ,RPC的目的是为了简化网络通信,让用户可以专注于业务处理,不用关心网络层的处理,真正实现在客户端A中调用函数F就可以调用服务端B中的函数F的目的。    RPC模型引入存根进程(stub)的概念, 对于服务端的服务类A,在客户端通过A::s
Stella981 Stella981
3年前
Netty RPC的简易DEMO
这个是rpc远程调用的简单demo:Consumer通过rpc远程调用Provider的服务方法sayHelloWorld(Stringmsg),然后Provider返回""HelloWorld"给Consumer。这里采用netty来实现远程通信实现rpc调用,消费者通过代理来进行远程调用远程服务。本文涉及的知识点有代理模式,jd
Stella981 Stella981
3年前
Dubbo之服务调用
概述Dubbo能够像调用本地服务一样调用远程服务,是依赖于Dubbo的代理机制。业务系统调用的服务方法,使用代理类,代理类里隐藏了远程通信的功能。代理对象会代理到InvokerInvocationHandler上,再调用它属性Invoker_invoke_()方法。这个Invoker是服务引用的过程中由Protocol创建的。比如
Stella981 Stella981
3年前
Dubbo泛化调用
dubbo泛化调用引用官方定义:泛化调用主要用于消费端没有API接口的情况;不需要引入接口jar包,而是直接通过GenericService接口来发起服务调用,参数及返回值中的所有POJO均用Map表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。GenericService这个接口只有一个方法,名为$in
API 小达人 API 小达人
1年前
Eolink Apikit「 零代码」快速发起 RPC 接口自动化测试
RPC(RemoteProcedureCall)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC的核心思想是将远程服务抽象成一个接口,客户端通过调用这个接口,就可以实现对远程服务的访问。EolinkApikit支持多协议,RPC、DUBBO、HTTP、REST、Websocket、gRPC、TCP、UDP、SOAP、HSF等。零代码快速发起RPC接口自动化测试,可以根据RPC接口文档自动生成测试用例,开发者只需简单修改即可使用。
递归王子
递归王子
Lv1
你喜欢的人未必懂你,还是去找个喜欢你的吧。
文章
4
粉丝
0
获赞
0