【Lolttery】项目开发日志 - (四)dubbo初战

这几天又学到了新知识:dubbo框架

此框架很好的解决了我之前的Netty微服务框架中遇到的服务注册、管理的问题。于是拿来学学

官网地址:http://dubbo.io/

1、服务端的配置:

dubbo可以与spring良好的结合,所以服务端的配置就比较简洁:

<dubbo:application name="match-provider" />
    <dubbo:protocol name="dubbo" serialization="fastjson" charset="utf-8"/>
    <dubbo:registry address="redis://${ds.redis.url}:6379" />

    <dubbo:annotation package="com.xinou.lolttery.server.dubbo" />

在这里使用了dubbo协议,fastjson做序列化。默认也是使用netty作为服务器。

其实最开始使用的是默认的协议和序列化。但是会出现Class not found的错误。原因在于原来为了便于管理json,返回数据使用各种实体bean组合,在默认的序列化情况下包含了java类的信息,会导致客户端找不到此实体类。

为了和原代码保持一致,于是决定使用fastjson。

注册中心用redis,单纯是因为现在有一个redis服务。官方并不推荐使用。以后会考虑换用zookeeper

在具体的实现类中的注解如下:

@Service(version="1.0",interfaceClass = MatchService.class)
public class MatchServiceImpl implements MatchService {

MatchService接口放在common项目下,被生产者和消费者共同依赖。

要注意这个Service注解并不是spring的注解,而是dubbo包下的注解。version也很重要,最开始的时候遇到了双方版本号不一致(1.0.0与1.0)导致找不到服务的情况。

如此想来依赖版本号对于未来的版本管理也是甚好的。

剩下的代码就和正常的服务入口代码一样了。

2、客户端

客户端的问题在于不一定使用spring框架。

于是仿照官网的api调用,自己写了一个客户端工具,每次需要服务的时候只要如main函数中调用即可。省去了自己满世界找服务地址的麻烦。

/**
 * dubbo分布式服务客户端
 * Created by shizhida on 16/4/1.
 */
public class DubboClient {

    public static void main(String[] args) {
        MatchService matchService = DubboClient.getInstance().getService(MatchService.class);
        System.out.println(matchService.listMatchByTime(1,1));
    }

    static class inner{
        public static DubboClient client = new DubboClient();
    }

    public static DubboClient getInstance(){
        return inner.client;
    }

    //连接缓存
    private Map<Class,ReferenceConfig> configpool = new ConcurrentHashMap<>();
    //服务缓存
    private Map<Class,Object> servicepool = new ConcurrentHashMap<>();

    private ApplicationConfig application;
    private RegistryConfig registry;

    public <T> T getService(Class<T> clazz){
        //直接从服务缓存池中取出
        if(servicepool.containsKey(clazz)){
            return (T) servicepool.get(clazz);
        }
        //若是服务缓存池中没有,检查连接缓存池并生成一个新的服务
        else if(configpool.containsKey(clazz)){
            ReferenceConfig<T> referenceConfig = configpool.get(clazz);
            return referenceConfig.get();
        }
        //若连接缓存池中也没有,则生成一个新的连接并生成新的服务
        else {
            ReferenceConfig<T> referenceConfig = genReferenceConfig(clazz);
            T service = referenceConfig.get();
            servicepool.put(clazz,service);
            return service;
        }

    }

    private <T> ReferenceConfig<T> genReferenceConfig(Class<T> clazz) {
        ReferenceConfig<T> reference = new ReferenceConfig<>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
        reference.setApplication(application);
        reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
        reference.setInterface(clazz);
        reference.setVersion("1.0");
        configpool.put(clazz,reference);

        return reference;
    }

    private DubboClient(){
        application = new ApplicationConfig();
        application.setName("common-client");

        // 连接注册中心配置
        registry = new RegistryConfig();
        registry.setAddress("redis://192.168.3.9:6379");
    }
}
时间: 2024-08-24 00:31:05

【Lolttery】项目开发日志 - (四)dubbo初战的相关文章

仿LOL项目开发第四天

---恢复内容开始--- 仿LOL项目开发第四天 by草帽 上节讲了几乎所有的更新版本的逻辑,那么这节课我们来补充界面框架的搭建的讲解. 我们知道游戏中的每个界面都有自己的一个类型:比如登陆界面,创建角色界面. 既然有这么多的界面,所以呢,我们创建一个单例的UI管理器:WindowManager.cs,然后里面创建一个字典来存所有类型的界面: using UnityEngine; using System.Collections.Generic; using Game; using Game.C

团队开发日志四

##日志四****作者:姜娇英 周佩 时间:2017-1-9***** 5 完成了梯形插值编程的单元测试 * 单元测试2:测试了在反向运动过程(目标位移和速度均反向)中某一时刻的速度和位移是否正确. * 单元测试3:测试了在正向运动(目标位移正向)目标速度反向过程中某一时刻的速度和位移是否正确. * 单元测试3:测试了在反向运动(目标位移反向)目标速度正向过程中某一时刻的速度和位移是否正确.

【Lolttery】项目开发日志 - (三)维护好一个项目好难

项目的各种配置开始出现混乱的现象了 在只有一个人开发的情况下也开始感受到维护一个项目的难度. 之前明明还好用的东西,转眼就各种莫名其妙的报错,完全不知道为什么. 今天一天的工作基本上就是整理各种配置. 再加上之前数据库设计出现了问题,要增加一个表,改几个名字,删几个字段……真是头大 1.gradle排除依赖 在打war包的时候出现了spring-boot与dubbo框架自带的spring2.5.6冲突的情况,于是学会了这么一招: //仅在本地执行时使用,不添加到war providedRunti

诸城项目-开发日志

转首已是两年前,现在坤哥要毕业了,王兵兵师姐读博了,小师弟小师妹也已经读研-- ====== 20140217 使用jquery.PrintArea.js(Version 2.3.3)完成分页打印功能 将想要打印的数据放入到div中就好,该控件使用css控制分打印的 20140218 优化分页打印代码,在文件中加注相关注释 在vs2013中建立测试用的解决方案,考虑到计划书中用vs2010,选用Framework3.5 TuDiChengBao项目名称 使用zTree开始搭建首页,与之搭配大的j

团队项目开发第四天

1.昨天干了什么? 终于更新完了SdK Manager,重新开始做任务了. 2.今天准备干什么? 希望今天能顺利的做出我们的首页页面,包括logo和导航栏的四个分块,fighting! 3.遇到什么困难?

四则运算4开发日志

项目计划日志 实验名称:四则运算4 程序员:吕泽坤 日期:16:27:10 项目 日期  上课 阅读资料  设计思路  编写代码  验证   4/2    上网查询        4/3     设计思路 9:00--10:00     4/4 4/5       编写代码 9:00--10:00 15:00--16:00    4/9         检查 .15.00--16.30 项目开发日志 实验名称:四则运算4 程序员:吕泽坤 日期:16:27:10 日期 开始时间 结束时间 活动 4

数组01开发日志

项目开发日志 工程项目:数组01 开发人员:吕泽坤 开发 日期       开始时间                       结束时间           活动名称                               用时      2016/4/6 16:30 16:30 设计思路,解决判断数字问题 0:30 2.16/4/7 16:00 16:20 完成程序,发表博客 0.20           项目错误记录表 工程项目:数组01 开发人员:吕泽坤 开发日期          

数组02开发日志

项目计划日志 程序员:吕泽坤 时间:12:25:30 日期 上课 阅读资料  设计思路  代码 备注  4.11    查询数组变换为环形数组 14:00--14:10   14:12--14:30 进行淡云测试程序正确性             项目开发日志 程序员:吕泽坤 时间:12:31:39 日期 开始时间 结束时间 活动 备注 4.11 14:00 14:20 编写数组.2             项目缺陷日志 程序员:吕泽坤 时间:12:35:05 开发日期             

四:DRF项目开发的准备

一: 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它的项目就无法运行了.而公司里面往往会存在多个项目的情况,所以需要使用虚拟环境,把当前项目所需要用到的模块及其版本进行隔离包装到一个虚拟环境中使用. 1 安装 pip install virtualenv pip install virtualenv-clone pip install virtualenvw