美文网首页
【手把手系列】 springboot集成dubbo

【手把手系列】 springboot集成dubbo

作者: 关键_词 | 来源:发表于2019-02-14 15:10 被阅读0次

    本教程用于springboot与dubbo的集成,阅读前请确保你已熟悉相关理论知识,并对java基础知识、环境搭建有一定的了解。本教程不再叙述如何安装JDK、配置环境变量、软件安装及启动等过程。欢迎评论及拍砖。

    需准备的环境:(windows系统)

    • JDK 1.8.0_131
    • Apache-maven 3.3.9
    • Apache-zookeeper 3.4.13
    • Apache-tomcat 7.0.57
    • IntelliJ IDEA

    通过spring初始化工具,新建spring-boot项目,创建3个模块,分别命名为:

    • producer(生产者模块)
    • consumer(消费者模块)
    • api(公用接口封装模块)

    项目结构图如下:

    图1 - 项目结构示意图

    主POM文件

    POM引入包如下,我这里放在了主POM中,只需引入web模块、test模块、dubbo和zookeeper(如果不用ZK注册中心,可以不用引入):

    <dependencies>
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
       </dependency>
    
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
       </dependency>
    
       <!-- web -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
    
       <!-- dubbo依赖 -->
       <dependency>
          <groupId>com.alibaba.spring.boot</groupId>
          <artifactId>dubbo-spring-boot-starter</artifactId>
          <version>2.0.0</version>
       </dependency>
    
       <dependency>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.3.3</version>
       </dependency>
       <dependency>
          <groupId>com.github.sgroschupf</groupId>
          <artifactId>zkclient</artifactId>
          <version>0.1</version>
       </dependency>
    </dependencies>
    

    api模块

    定义接口ITestService,定义方法say,代码如下:

    public interface ITestService {
        String say(String username);
    }
    

    producer模块

    application.yml中定义端口server.port=8101(改成yml的书写格式)
    在resources下创建dubbo.properties文件,内容如下:

    dubbo.container=logback,spring
    dubbo.application.logger=slf4j
    dubbo.application.name=dubbo-producer
    dubbo.application.owner=dev
    dubbo.registry.address=zookeeper://localhost:2181
    dubbo.provider.retries=0
    dubbo.provider.timeout=10000
    dubbo.consumer.check=false
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=20880
    dubbo.service.shutdown.wait=30000
    dubbo.protocol.host=
    dubbo.protocol.accesslog=${accesslog}
    

    在resources下创建config/dubbo-provider.xml文件,内容如下:

    <dubbo:application name="${dubbo.application.name}"/>
    <!--公共配置在dubbo.properties-->
    <dubbo:provider timeout="5000" delay="-1" loadbalance="leastactive" retries="0"
                    cluster="failfast" threadpool="fixed" threads="400"/>
    <!-- 对外提供的服务 -->
    <dubbo:service interface="com.hifun.dubbo.service.ITestService" ref="testService" version="1.0.0"/>
    

    定义接口实现类TestServiceImpl实现ITestService,代码如下:

    @Service("testService")
    public class TestServiceImpl implements ITestService {
        @Override
        public String say(String username) {
            return "hello " + username;
        }
    }
    

    定义Application启动类DubboProducerApplication,代码如下:

    @SpringBootApplication
    @PropertySource("classpath:dubbo.properties")
    @ImportResource("classpath:config/*.xml")
    public class DubboProducerApplication {
        public static void main(String[] args) {
            SpringApplication.run(DubboProducerApplication.class, args);
        }
    }
    

    启动生产者,确认启动成功。

    consumer模块

    application.yml中定义端口server.port=8102(改成yml的书写格式)
    在resources下创建dubbo.properties文件,内容与producer模块一致即可。
    在resources下创建config/dubbo-consumer.xml文件,内容如下:

    <!-- 消费方应用信息,用于计算依赖关系 -->
    <dubbo:application name="${dubbo.application.name}"/>
    <dubbo:registry address="${dubbo.registry.address}" />
    <dubbo:reference interface="com.hifun.dubbo.service.ITestService"
                     id="testService" retries="0" timeout="6000" version="1.0.0"/>
    

    定义对外服务接口类TestController,用于提供外部接口服务,代码如下:

    @RestController
    public class TestController {
        @Autowired
        private ITestService testService;
    
        @RequestMapping(value = "/hello/{username}")
        public String hello(@PathVariable String username) {
            System.out.println("testService--->" + (testService instanceof ITestService));
            return testService.say(username);
        }
    }
    

    定义Application启动类DubboConsumerApplication,代码如下:

    @SpringBootApplication
    @PropertySource("classpath:dubbo.properties")
    @ImportResource("classpath:config/*.xml")
    public class DubboClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(DubboClientApplication.class, args);
        }
    }
    

    启动消费者,确认启动成功。
    浏览器访问地址http://localhost:8102/hello/123, 打印出”hello 123”则表示访问正常。

    admin模块

    服务治理管理端,dubbo-2.6.1版本之后不再有dubbo-admin,因此需要在之前的版本打包安装,我用的是2.5.4版本。GITHUB地址:dubbo-2.5.4源码。下载后打成war包(mvn package),将dubbo-admin-2.5.4-SNAPSHOT.war放到tomcat的webapps目录下,启动tomcat。

    浏览器访问dubbo-admin,输入账号密码root,出现如下界面,表示本地启动成功。

    图2 - dubbo-admin

    注意事项

    • 生产者和消费者启动成功,但在浏览器访问controller外放的接口时,出现如下报错:
      com.alibaba.dubbo.rpc.RpcException: No provider available from registry localhost:2181 for service com.hifun.dubbo.service.ITestService on consumer xxx.xxx.xxx.xxx use dubbo version 2.6.0, may be providers disabled or not registered ?
      原因: producer通过<dubbo:service/>配置提供dubbo服务,consumer通过<dubbo:reference/>配置指向dubbo服务接口。若配置version属性,则需保持配置一致;否则均不做配置。
    • 生产者和消费者之间互通的接口应放置在独立模块,便于两个模块引入和调用。
    • 参照网上其他的教程,生产者可以不是web项目,只需Application保持启动状态即可。
    • 其他问题遇到后再追加。

    如果有哪里写的不对或者可以改进的地方,欢迎留言探讨。如果需要转载,请帮忙评论并附上原文地址https://www.jianshu.com/p/ce77f6038b8b。万分感激。

    相关文章

      网友评论

          本文标题:【手把手系列】 springboot集成dubbo

          本文链接:https://www.haomeiwen.com/subject/jkyeeqtx.html