weibocom / motan

A cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services.
Other
5.9k stars 1.78k forks source link

请问一个服务调用另外一个服务,怎么配置? #410

Open hechengcai opened 7 years ago

hechengcai commented 7 years ago

请问一个服务调用另外一个服务,怎么配置? 就是有一个服务,本身提供服务,但是它又需要调用别的服务。 我把 client 和 server 的配置合在一起不成功。 请问有例子吗?

rayzhang0603 commented 7 years ago

如果同时启动的client和server是同一个service,即client调用同一服务器上的server,需要保证server先初始化启动起来,然后client在初始化。 如果不是同一个service,即一个server中使用了其他service的client,则需要client先初始化后在初始化server。 client和server一起配置时, protocol和registry可以共用也可以通过id各自设置不同的。service和referer的配置互相不会有影响的。

hechengcai commented 7 years ago

还是不成功。请问能搞一个例子出来吗?

rayzhang0603 commented 7 years ago

在service2中使用了service1的rpc client的xml配置如下。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:motan="http://api.weibo.com/schema/motan"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">
<!--============= client ================-->
<!-- 使用直连方便测试,可以替换为其他注册中心 -->
<motan:registry regProtocol="direct" address="localhost:8002" name="directRegistry" />
<!-- motan协议配置 -->
<motan:protocol default="true" name="motan" haStrategy="failover"
                loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/>

<!-- 通用referer基础配置 -->
<motan:basicReferer requestTimeout="300" accessLog="false"
                    retries="2" group="motan-demo-rpc" module="motan-demo-rpc"
                    application="myMotanDemo" protocol="motan" registry="directRegistry"
                    id="motantestClientBasicConfig" throwException="false" check="true"/>

<!-- 设置service1的 rpc client -->
<motan:referer id="service1Referer"
               interface="com.weibo.motan.demo.service.Service1"
               connectTimeout="1000" requestTimeout="1000" basicReferer="motantestClientBasicConfig"/>

<!--================server ================-->
 <motan:basicService export="motan:8002"
                    group="motan-demo-rpc" accessLog="false" shareChannel="true" module="motan-demo-rpc"
                    application="myMotanDemo" registry="directRegistry" id="serviceBasicConfig"/>

<!-- 具体rpc服务配置,声明实现的接口类。-->
<motan:service interface="com.weibo.motan.demo.service.Service2"
               ref="Service2Impl" export="motan:8009" basicService="serviceBasicConfig">
</motan:service>

<!-- service 2 的业务具体实现类,其中引用了service1的rpc client -->
<bean id="Service2Impl" class="com.weibo.motan.demo.service.Service2Impl">
    <property name="service1" ref="service1Referer"/>
</bean>

1、需要先配置并启动service1的rpc server,并且用上面client的相关的配置调通service1 2、然后在增加service2相关配置,并确认servcie2中引用的service1已经正确注入 3、最后在实现service2的client,调用service2服务

hechengcai commented 7 years ago

搞定了,调用不同 server 上的服务,就需要按上面的配置。 如果是同一个 server 上的服务互相调用,就注入Impl实现类就行了。

但是还是有几个问题: 1,配置信息必须在一个 xml 文件中,如果弄两个 xml 文件,一个 server 的,一个 client 的,加载两个 xml 文件是不行的。 2,server2调用 server1的服务,必须先启动 server1,才能启动 server2。如果server1, server2互相调用呢?

rayzhang0603 commented 7 years ago

1、你可以再调试一下,使用两个xml和使用一个实际是一样的,只要保证spring的bean可以初始化,并且能够正确注入就可以。 2、一般不应该出现互相依赖的场景,尽量通过业务逻辑解耦来解决。如果一定要解决这种场景,可以在service和referer的配置中加上check=false参数,此时即使没有从注册中心获取到信息,也会把系统启动起来。

另外,如果是同一个jvm内进行同一个service(既是server也是client)的调用可以使用injvm协议进行注册。

thermosym commented 7 years ago

@hechengcai 我在实际中会把server和client的配置分两个xml,spring里使用下面的方式import就可以了

@Configuration
@ImportResource(locations = {"classpath:motan_server.xml", "classpath:motan_client.xml"})