美文网首页
【手把手系列】 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