dubbo一定要先启动服务端在启动客户端吗?

flying~closer 2017-11-10 02:17:50
我了解客户端不是会从ZK中订阅服务,当客户端先启动的时候没有订阅到,这个时候调用,会报引用对象空指针。但是当服务端也跟着启动zk中不就恢复了该服务,客户端应该也能调用到啊。为什么怎么试都是是报空指针呢?我是个dubbo新手希望各位牛人指点,主要把问题是不理解为什么先启动客户端后启动服务器端就不行了。下面是我主要代码:
服务端配置:
<dubbo:annotation />
<!--提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->
<dubbo:application name="dubbo_provider_pj"></dubbo:application>
<!--使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 服务订阅 -->
<!-- <dubbo:reference interface = "com.cn.wwj.service.GetUserIdPass1000Service"
id ="getUserIdPass1000Service"> </dubbo:reference> -->
<!-- 服务提供 -->
<!-- 使用 Failover Cluster 模式如果调用失败一次,可以再次重试2次调用,服务级别调用超时时间为100ms调用方法t的超时时间为80ms,
允许重试2次,最坏情况调用花费时间160ms。dubbo:service元素配置了loadbalance=”random”,则该元素的子元素dubbo:method
如果没有指定负载均衡策略,则默认为loadbalance=”random”,否则如果dubbo:method指定了loadbalance=”leastactive” -->
<bean id="iUserService" class="com.cn.wwj.service.impl.IUserServiceImpl" />
<dubbo:service interface="com.cn.wwj.service.IUserService"
version="1.0.0" cluster="failover" retries="2" timeout="100" ref="iUserService"
loadbalance="random">
<dubbo:method name="getUserById" retries="2" timeout="80"
loadbalance="leastactive" />
</dubbo:service>
客户端配置:
<dubbo:annotation />
<!--提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->
<dubbo:application name="dubbo_provider_pj2"></dubbo:application>
<!--使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用 -->
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 订阅服务 -->
<dubbo:reference interface="com.cn.wwj.service.IUserService"
id="iUserService" url="127.0.0.1:20880"></dubbo:reference>
代码:
@Reference
private IUserService iUserService;
/* @Autowired
private GetUserIdPass1000Service getUserIdPass1000Service;*/
@RequestMapping("/getUserById1")
public String toIndex(HttpServletRequest request,Model model){
Long userId = Long.valueOf(request.getParameter("id"));
User user = iUserService.getUserById(userId);
model.addAttribute("user", user);
return "showUser";
}
报错:
java.lang.NullPointerException
at com.cn.wwj.controller.UserController.toIndex(UserController.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(Abstract
...全文
812 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
admin_ypc 2018-12-03
  • 打赏
  • 举报
回复
dubbo客户端在启动的时候才会连接zookeeper拉取服务端接口列表,更新本地缓存文件,所以需要服务端先启动,将自己先注册到zk
oldmee 2018-12-03
  • 打赏
  • 举报
回复
UserController.java:第29行
dongbaladong 2017-11-10
  • 打赏
  • 举报
回复
不用,就算先启动客户端再启动服务端也可以正常运行
flying~closer 2017-11-10
  • 打赏
  • 举报
回复
客户端不是去注册中心订阅的吗?如果后面启动了服务端,理论上不应该调用的到吗?不太理解
朱小斌 2017-11-10
  • 打赏
  • 举报
回复
不启动服务端,客户端没有地址可以去调用

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧