距离上一次开始使用dubbo已经有一段时间了,这段时间在项目的开发和实践中,对于dubbo有了更深的了解。今天终于决定抛弃原有的netty框架,正式转战dubbox
dubbox是在阿里停止对dubbo进行更新之后,由当当网维护的一个dubbo版本。在使用上基本完全兼容原有的dubbo方式。另外支持了更高版本的spring和FST等高效序列化库。
另外很重要的一点,dubbox支持restful方式的调用,这意味着对APP的http服务也可以统一到这一套框架中,而不需要再部署一个tomcat对APP端提供restful方式的调用。
为了这次改动,详细看了一遍dubbox的demo。并进行了以下修改
###1、使用zookeeper作为注册中心。
上次的时候就说过要在适当的时候换用zookeeper作为注册中心,那么现在显然就是一个合适的时候了~
zookeeper的安装其实挺简单,下载,配置zoo.cfg,只要如下两行,指定一下数据目录和日志目录
dataDir=/root/zookeeper/data
dataLogDir=/root/zookeeper/log
然后执行
zookeeper/bin/zkServer.sh start
就可以简单的启动一个实例。
而且因为之前使用了配置文件,只要简单的修改配置文件:
dubbo.registry = zookeeper://192.168.3.9:2181
重新指定一个注册中心,就可以愉快的玩耍了。
值得一说的是,dubbo对于redis的支持果然如同文档所说,是不稳定的。很多时候在关闭服务的时候并不能在redis注销此服务。换用zookeeper之后,这个问题也就随之解决了。
###2、更换启动方式
原本的启动器是启动一个netty服务,然后通过netty服务中启动spring的实例以执行dubbo。可以说绕了很大一圈。为了在dubbo还不可靠的情况下保障服务可用性。
现在dubbo已经基本稳定了,所以决定换用更为简洁的启动方式:
public class Application {
private static Logger logger = LoggerFactory.getLogger(Application.class);
public static String serverName = "";
private static volatile boolean running = true;
public static GenericApplicationContext applicationContext;
public static ChannelFuture future;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void setApplicationContext(GenericApplicationContext applicationContext) {
Application.applicationContext = applicationContext;
}
public static void startup(){
Application.applicationContext.start();
logger.info("service "+serverName+" start");
synchronized (Application.class) {
while (running) {
try {
Application.class.wait();
} catch (Throwable e) {
}
}
}
}
public static void shutdown(){
running = false;
}
}
看似写了一大堆,其实启动的只有一句:
Application.applicationContext.start();
是一个标准的spring应用启动方式。下面的循环则保证程序不会退出。直到将标志位置为false。
为保证调用的方式相对不变,仍旧另外提供了一个启动器来进行一些初始化的操作:
public class DubboBootstrap {
public DubboBootstrap(String serverName){
//在初始化启动器时获取spring的上下文。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
//将上下文加入到一个全局的变量中便于使用
Application.setApplicationContext(context);
Application.serverName = serverName;
}
/**
* netty启动
* @throws Exception
*/
public void run() throws Exception {
Application.startup();
}
}
至此在每个服务实例的启动器上就只剩下了一行:
new DubboBootstrap(server_name).run();
省去了每次启动手动指定服务,指定服务端ip的麻烦。将一切交给配置文件和可靠地dubbox吧~
###3、其它
项目搞了一个多月了,主要的工作还是善乏可陈的CRUD业务逻辑。当前端跟不上的时候才有时间去研究一下技术上的问题。
其实项目是个挺操蛋的项目,人手不够,技术不过关,业务不熟练,基本上所有创业公司的坑都挨个踩着过来的。
然而硬着头皮上,才是增长知识的最快方式。要说在这个项目中的收获,很多不是具体的代码能描述的,而是一种对于整体的掌控力的提升。一种对于自己代码风格的突破吧。
算是第一次尝试突破在老东家的代码风格,学习加入一些自己的理解.
唉,反正整个后台就我自己一个人,给自己加油吧~