一、引入dubbo相关包

在game子模块pom.xml加入相关maven包

因为dubbo和zkclient的日志默认使用的是log4j,与我们系统使用的logback不一致, dubbo使用的spring2.5.6与我们系统使用的sping4也不一致,所以需要去掉他们默认的,改成我们自己系统一致的。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.3</version>
    <exclusions>           
        <exclusion>             
            <groupId>org.springframework</groupId>             
            <artifactId>spring</artifactId>         
        </exclusion>           
        <exclusion>            
            <groupId>log4j</groupId>             
            <artifactId>log4j</artifactId>           
        </exclusion>         
    </exclusions>
</dependency>  
<dependency>
    <groupId>com.101tec</groupId>          
    <artifactId>zkclient</artifactId>
    <version>0.9</version>
    <exclusions>           
         <exclusion>
                <groupId>org.slf4j</groupId>                      
                <artifactId>slf4j-log4j12</artifactId>
          </exclusion>
          <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
          </exclusion>
   </exclusions>
</dependency>      
<dependency>           
    <groupId>org.slf4j</groupId>           
    <artifactId>log4j-over-slf4j</artifactId>           
    <version>1.7.25</version>
</dependency>

二、将原来的game-service模块拆分成game-service和game-provider两个子模块

原game-service子模块中service所有接口类放入新game-service子模块中,原game-service子模块中service.impl和component等包放入game-provider子模块中

修改后的game-service作为接口的定义,game-provider作为提供者实现接口。

项目拆分之后消费者模块需要修改成只引入game-service子模块

三、服务提供者实现

1、在game-provider子模块pom.xml引入game-service子模块和原game-service项目maven包

2、在game-provider子模块src/main/resource下创建 dubbo_provider.properties 文件

dubbo_provider.properties
# 提供方应用信息,用于计算依赖关系
dubbo.application.name=game-provider
dubbo.application.logger=slf4j
 
# 声明需要暴露的服务接口所在的包
dubbo.annotation.package=com.xunleijr.game
 
# 用dubbo协议在20880端口暴露服务
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.protocol.accessLog=true
 
dubbo.provider.timeout=3000
 
dubbo.provider.retries=1
dubbo.provider.delay=-1
 
# 使用zookeeper注册中心暴露服务地址
dubbo.registr.protocol=zookeeper
dubbo.registry.address.production=
dubbo.registry.address.quasi_production=10.26.91.214:2181
dubbo.registry.address.test=192.168.20.36:2181
dubbo.registry.register=true
dubbo.registry.subscribe=true

3、创建Dubbo提供者配置类

DubboProviderConfig.java
package com.xunleijr.game.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.xunleijr.game.annotation.AnnotationBean;
import com.xunleijr.game.common.AppConstant;
 
@Configuration
@PropertySource(value = "classpath:dubbo_provider.properties")
public class DubboProviderConfig {
 
    @Value("${dubbo.application.name}")
    private String applicationName;
 
    @Value("${dubbo.registr.protocol}")
    private String protocol;
 
    @Value("${dubbo.registry.address.production}")
    private String registryAddress_production;
     
    @Value("${dubbo.registry.address.quasi_production}")
    private String registryAddress_quasiProduction;
     
    @Value("${dubbo.registry.address.test}")
    private String registryAddress_test;
 
    @Value("${dubbo.protocol.name}")
    private String protocolName;
 
    @Value("${dubbo.protocol.port:20880}")
    private int protocolPort;
 
    @Value("${dubbo.provider.timeout:3000}")
    private int timeout;
 
    @Value("${dubbo.provider.retries:1}")
    private int retries;
 
    @Value("${dubbo.provider.delay:1}")
    private int delay;
     
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
 
    /**
     * 设置dubbo扫描包
     *
     * @param packageName
     * @return
     */
    @Bean
    public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
        AnnotationBean annotationBean = new AnnotationBean();
        annotationBean.setPackage(packageName);
        return annotationBean;
    }
 
    /**
     * 注入dubbo上下文
     *
     * @return
     */
    @Bean
    public ApplicationConfig applicationConfig() {
        // 当前应用配置
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(this.applicationName);
        return applicationConfig;
    }
 
    /**
     * 注入dubbo注册中心配置,基于zookeeper
     *
     * @return
     */
    @Bean
    public RegistryConfig registryConfig() {
        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setProtocol(protocol);
        String registryAddress = null;
        switch (AppConstant.CURR_SYSTEM_ENVIRONMENT) {
        case PRODUCTION_ENVIRONMENT:
            registryAddress = registryAddress_production;
            break;
        case QUASI_PRODUCTION_ENVIRONMENT:
            registryAddress = registryAddress_quasiProduction;
            break;
        case TEST_ENVIRONMENT:
            registryAddress = registryAddress_test;
            break;
        }
        registry.setAddress(registryAddress);
        System.out.println("########### registry Config 【" + protocol + ":" + registryAddress + "】");
        return registry;
    }
 
    /**
     * 默认基于dubbo协议提供服务
     *
     * @return
     */
    @Bean
    public ProtocolConfig protocolConfig() {
        // 服务提供者协议配置
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName(protocolName);
        protocolConfig.setPort(protocolPort);
        protocolConfig.setThreads(200);
        System.out.println("########### protocol config【" + protocolName + ":" + protocolPort + "】");
        return protocolConfig;
    }
 
    /**
     * dubbo服务提供
     *
     * @param applicationConfig
     * @param registryConfig
     * @param protocolConfig
     * @return
     */
    @Bean(name = "defaultProvider")
    public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig,
            ProtocolConfig protocolConfig) {
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setTimeout(timeout);
        providerConfig.setRetries(retries);
        providerConfig.setDelay(delay);
        providerConfig.setApplication(applicationConfig);
        providerConfig.setRegistry(registryConfig);
        providerConfig.setProtocol(protocolConfig);
        System.out.println("########### provider init...");
        return providerConfig;
    }
 
}

4、修改接口实现类的@Service注解为@com.alibaba.dubbo.config.annotation.Service(version = "1.0.0")

5、将game-model子模块中除protocol buffer相关类之外的类实现java.io.Serializable接口

6、创建服务提供者启动类

ProviderMain.java
package com.xunleijr.game;
 
import java.io.IOException;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
import com.xunleijr.game.config.DubboProviderConfig;
import com.xunleijr.game.config.MainConfig;
 
/**
 * 服务提供者启动类
 * @author Yixi
 *
 */
public class ProviderMain {
     
    private static Logger logger = LoggerFactory.getLogger(ProviderMain.class);
     
    @SuppressWarnings("resource")
    public static void main(String[] args) {
          
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(MainConfig.class);
        ctx.register(DubboProviderConfig.class);
        ctx.refresh();
        ctx.registerShutdownHook();// 在JVM注册一个关闭钩子,确保IOC容器最终会被正确关闭
        ctx.start();
             
        logger.info("dubbo provider start...");
        try {
            // 输入任意字符退出
            System.in.read();
        catch (IOException e) {}
    }
 
}

四、服务消费者实现

1、消费者src/main/resources下创建dubbo_consumer.properties文件

dubbo_consumer.properties
dubbo.application.name=game-***-consumer
dubbo.application.logger=slf4j
 
dubbo.annotation.package=com.xunleijr.game
 
dubbo.registr.protocol=zookeeper
dubbo.registry.address.production=
dubbo.registry.address.quasi_production=10.26.91.214:2181
dubbo.registry.address.test=192.168.20.36:2181
dubbo.registry.register=true
dubbo.registry.subscribe=true

2、创建Dubbo消费者配置类

package com.xunleijr.game.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.xunleijr.game.common.AppConstant;
 
@Configuration
@PropertySource(value = "classpath:dubbo_consumer.properties")
public class DubboConsumerConfig {
 
    @Value("${dubbo.application.name}")
    private String applicationName;
 
    @Value("${dubbo.registr.protocol}")
    private String protocol;
 
    @Value("${dubbo.registry.address.production}")
    private String registryAddress_production;
     
    @Value("${dubbo.registry.address.quasi_production}")
    private String registryAddress_quasiProduction;
     
    @Value("${dubbo.registry.address.test}")
    private String registryAddress_test;
     
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
 
    /**
     * 设置dubbo扫描包
     *
     * @param packageName
     * @return
     */
    @Bean
    public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
        AnnotationBean annotationBean = new AnnotationBean();
        annotationBean.setPackage(packageName);
        return annotationBean;
    }
 
    /**
     * 注入dubbo上下文
     *
     * @return
     */
    @Bean
    public ApplicationConfig applicationConfig() {
        // 当前应用配置
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(this.applicationName);
        return applicationConfig;
    }
 
    /**
     * 注入dubbo注册中心配置,基于zookeeper
     *
     * @return
     */
    @Bean
    public RegistryConfig registryConfig() {
        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setProtocol(protocol);
        String registryAddress = null;
        switch (AppConstant.CURR_SYSTEM_ENVIRONMENT) {
        case PRODUCTION_ENVIRONMENT:
            registryAddress = registryAddress_production;
            break;
        case QUASI_PRODUCTION_ENVIRONMENT:
            registryAddress = registryAddress_quasiProduction;
            break;
        case TEST_ENVIRONMENT:
            registryAddress = registryAddress_test;
            break;
        }
        registry.setAddress(registryAddress);
        return registry;
    }
 
}

3、在springmvc初始化时加载dubbo配置

修改WebInitializer.java

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
****
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // 加载配置文件类
        return new Class[] { DubboConsumerConfig.class };
    }
****
 
}

4、修改消费者类中需要远程调用接口类上面的@Autowired注解修改为@com.alibaba.dubbo.config.annotation.Reference(version = "1.0.0")

项目集成dubbo的更多相关文章

  1. Spring Boot 项目实战(五)集成 Dubbo

    一.前言 上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题.随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以 ...

  2. 玩转Spring Boot 集成Dubbo

    玩转Spring Boot 集成Dubbo 使用Spring Boot 与Dubbo集成,这里我之前尝试了使用注解的方式,简单的使用注解注册服务其实是没有问题的,但是当你涉及到使用注解的时候在服务里面 ...

  3. Spring boot 集成 Dubbo 快速搭建

    架构: 1.ZooKeeper:服务注册中心 2.api工程:提供对外暴露的服务API 3.provider:服务提供者 4.consumer:服务消费者 示例如下: (一)新建 Maven 项目 a ...

  4. JEECMS9.3集成dubbo操作记录

    需求描述: 门户及其他应用系统需要查询JEECMS9.3中发布的栏目及数据,而其他系统都是基于dubbo开发的,因此想要将JEECMS9.3中集成dubbo并对外提供内容管理服务. 需求实现: 1.添 ...

  5. SpringCloud系列之集成Dubbo应用篇

    目录 前言 项目版本 项目说明 集成Dubbo 2.6.x 新项目模块 老项目模块 集成Dubbo 2.7.x 新项目模块 老项目模块 参考资料 系列文章 前言 SpringCloud系列开篇文章就说 ...

  6. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  7. 集成Dubbo服务(Spring)

    Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...

  8. Vuejs实例-02Vue.js项目集成ElementUI

    Vuejs实例-02Vue.js项目集成ElementUI 0:前言 vue.js的UI组件库,在git上有多个项目,我见的使用者比较多的是iView和Element.两个组件库,组件都很丰富. 官网 ...

  9. 项目集成自动分词系统ansj,实现自定义词库

    一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...

随机推荐

  1. linux的开机启动过程:

    简单视图 按下电源开关 开机自检(BIOS)弹笔记本logo的时候,检查cpu 硬盘 这些硬件问题 MBR引导 一般是通过硬盘启动系统 GRUB的菜单 黑底白字有个倒数计时 可以选择内核 yum命令可 ...

  2. 机器审核图片学习(1)pornDetector

    a) https://github.com/bakwc/PornDetector 封装了两个库,opencv与scikit-learn 另外一种法师封装了opencv与tensorflow

  3. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  4. 一言不合就写socket的post和get请求(拼内容,然后发出去即可)

    一言不合就写socket的post和get请求.写个桌面程序,利用java写get和post请求.测试成功: SocketReq.java package com.test.CipherIndex; ...

  5. SSH框架的搭建与配置文件的书写格式

    通常Java Web 开发的时候,我们一般会采用三大框框架的整合来架构,这样做主要是为方便维护.但是有时候会忘了一些配文件(*.xml)的格式头,这里主要就三大框架Spring.struts.hibe ...

  6. wpf控件设计时支持(3)

    原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...

  7. nginx 502错 failed (13: Permission denied)

    安装nginx和php-fpm之后出现502错误 找了个理由说php-fpm不启动 ,但在我的实践中,该过程开始 找了半天没找到病因.视图nginx记录后 我发现下面的错误 [crit] 2686#0 ...

  8. WPF-Button|IsCancel&&IsDefault

    原文:WPF-Button|IsCancel&&IsDefault Button个别属性 <Button ToolTip="ESC" IsDefault=&q ...

  9. 早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)

    今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return f ...

  10. ASP UserInfoList 方法1

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserInfoList.a ...