Open hechengcai opened 7 years ago
如果同时启动的client和server是同一个service,即client调用同一服务器上的server,需要保证server先初始化启动起来,然后client在初始化。 如果不是同一个service,即一个server中使用了其他service的client,则需要client先初始化后在初始化server。 client和server一起配置时, protocol和registry可以共用也可以通过id各自设置不同的。service和referer的配置互相不会有影响的。
还是不成功。请问能搞一个例子出来吗?
在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服务
搞定了,调用不同 server 上的服务,就需要按上面的配置。 如果是同一个 server 上的服务互相调用,就注入Impl实现类就行了。
但是还是有几个问题: 1,配置信息必须在一个 xml 文件中,如果弄两个 xml 文件,一个 server 的,一个 client 的,加载两个 xml 文件是不行的。 2,server2调用 server1的服务,必须先启动 server1,才能启动 server2。如果server1, server2互相调用呢?
1、你可以再调试一下,使用两个xml和使用一个实际是一样的,只要保证spring的bean可以初始化,并且能够正确注入就可以。 2、一般不应该出现互相依赖的场景,尽量通过业务逻辑解耦来解决。如果一定要解决这种场景,可以在service和referer的配置中加上check=false参数,此时即使没有从注册中心获取到信息,也会把系统启动起来。
另外,如果是同一个jvm内进行同一个service(既是server也是client)的调用可以使用injvm协议进行注册。
@hechengcai 我在实际中会把server和client的配置分两个xml,spring里使用下面的方式import就可以了
@Configuration
@ImportResource(locations = {"classpath:motan_server.xml", "classpath:motan_client.xml"})
请问一个服务调用另外一个服务,怎么配置? 就是有一个服务,本身提供服务,但是它又需要调用别的服务。 我把 client 和 server 的配置合在一起不成功。 请问有例子吗?