weibocom / motan

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

在配合consul的时候出现问题,服务注册到了consul,但是状态一直是failing #116

Closed freeFeatrue closed 8 years ago

freeFeatrue commented 8 years ago

按照文档操作,我的consul启动命令 consul agent -dev ; 项目的配置文件配置连接到这个注册中心,服务可以正常注册,但是现实的服务状态一直是failing!

sunnights commented 8 years ago

你好,请确认服务注册后是否调用了心跳开关 MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); 如果已打开,consul的ui控制台会显示passing,否则是failing

freeFeatrue commented 8 years ago

`import javax.annotation.PostConstruct;

import org.springframework.stereotype.Service;

import com.weibo.api.motan.common.MotanConstants; import com.weibo.api.motan.util.MotanSwitcherUtil;

@Service public class InitApplication {

@PostConstruct
public void onApplicationEvent() {
    //添加保持心跳
    MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
}

}` 有调用,这个是我spring容器初始化后执行的,启用心跳开关,这样应该可以吧

sunnights commented 8 years ago

可以调用MotanSwitcherUtil.isOpen(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER)查看一下开关是否调用成功

freeFeatrue commented 8 years ago

`@Controller public class TestController {

@RequestMapping("test")
public ModelAndView test(){

    System.out.println(MotanSwitcherUtil.isOpen(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER));

    return new ModelAndView("test");
}

}` 打印结果是true

freeFeatrue commented 8 years ago

保持心跳是用代码定时请求consul服务吗?能告诉是哪儿一段程序吗?我调试一下也可以!

sunnights commented 8 years ago

在motan-manager的服务查询里也查不到服务信息吗

sunnights commented 8 years ago

可以查看ConsulRegistry.java下doRegister和doAvailable里的相关代码,心跳管理在ConsulHeartbeatManager中

freeFeatrue commented 8 years ago

可以看到查到服务信息,只不过服务的状态是UnavailableServer!我先跟下代码

freeFeatrue commented 8 years ago

1.代码 ConsulHeartbeatManager.java 61行 switcherStatus = false, 检测心跳的程序就没有执行 2.代码 ConsulRegistry.java 162行,doAvailable(URL url) 根本没有执行(打断点,启动服务不走断点)

sunnights commented 8 years ago

这说明设置的心跳开关没有起作用...

freeFeatrue commented 8 years ago

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); 我觉得这个开关设置代码有问题,AbstractRegistry.java 62行, available(null); 传入的参数是null; 执行到ConsulRegistry.java 162行 doAvailable(URL url) 的时候根本就没有设置成功!

sunnights commented 8 years ago

这段逻辑没问题,null是暂时的标识,表示对所有url都起作用 正常调用心跳开关是可以提供服务的

freeFeatrue commented 8 years ago

恩,好吧!我错了! MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); 我这段代码执行的位置不对,虽然设置进去了true,不知道为啥没起作用!应该是在server启动之前设置了!

freeFeatrue commented 8 years ago

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); 我改到手动出发就可以了,请问你们再用的时候这段代码是放到什么事件里面执行呢?

sunnights commented 8 years ago

你可以看一下MotanConstants.REGISTRY_HEARTBEAT_SWITCHER的调用位置 在AbstractRegistry里会注册SwitcherListener监听开关状态,当开关变化的时候触发SwitcherListener的onValueChanged操作

rayzhang0603 commented 8 years ago

@freeFeatrue 这段代码只是演示了控制开关的方式,实际使用可以根据你的业务需求自己决定。 微博在实际使用中,由运维平台通过统一的开关管理机制进行控制。一般rpc服务上线后默认是503状态,在服务检测通过后,才会打开开关提供服务。

freeFeatrue commented 8 years ago

明白了,谢谢!