【Lolttery】项目开发日志 (五)目标dubbox,前进

275 阅读3分钟

距离上一次开始使用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业务逻辑。当前端跟不上的时候才有时间去研究一下技术上的问题。

其实项目是个挺操蛋的项目,人手不够,技术不过关,业务不熟练,基本上所有创业公司的坑都挨个踩着过来的。

然而硬着头皮上,才是增长知识的最快方式。要说在这个项目中的收获,很多不是具体的代码能描述的,而是一种对于整体的掌控力的提升。一种对于自己代码风格的突破吧。

算是第一次尝试突破在老东家的代码风格,学习加入一些自己的理解.

唉,反正整个后台就我自己一个人,给自己加油吧~