Springboot整合dubbo构建maven多模块项目(二)- 代码编写

完整代码下载:http://download.csdn.net/download/liyanlei5858/10206848

在上一章Springboot整合dubbo构建maven多模块项目(一)中,我们配置了一个dubbo项目,包含两个模块springboot-dubbo-server和springboot-dubbo-client,并且在pom中都添加了对dubbo及zk的依赖,在springboot-dubbo-client模块的pom中还添加了对springboot-dubbo-server模块的依赖。

项目结构:


下面我们一起来实践下dubbo服务端及客户端的简单设置,以及在dubbo admin中查看服务的注册及消费情况。

1 环境搭建

dubbo环境的搭建可参考文章环境搭建(一):Dubbo环境搭建,包括基于docker的zookeeper安装及dubbo admin的安装。

2 dubbo服务提供方配置

目录结构


2.1 创建xml配置文件

不能直接在spring boot默认的配置文件application.properties中配置dubbo的属性,因为spring boot官方没有dubbo对应的starter,所以spring boot不能解析dubbo的属性。有网友编写了spring-boot-starter-dubbo,让我们可以使用spring boot的方式方便地开发dubbo程序,有需要的同学可以去了解一些。

本文实践的目的,是为了学习dubbo在spring boot中的配置,不是更方便地开发,所以我们这里还是选用原始的xml配置文件的方式来进行dubbo的配置,然后使用@ImportResource注解来加载xml配置。

下面是服务提供方的配置文件provider.xml。

有两种方式可以暴露dubbo服务,一是通过注解方式,二是通过xml配置方式,区别就在最后几行配置上。

使用注解方式,在类上打@service注解,就必须要用dubbo:annotation指定启动扫描路径。下面的provider.xml使用就是这种方式。

使用xml配置方式用dubbo:service申明要暴露的单个接口,就不需要再指定dubbo:annotation了。

provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="demo-provider" />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry protocol="zookeeper" address="localhost:2181" timeout="60000"/>

    <!-- dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />


    <!-- 暴露dubbo服务的方式一-->
    <!-- 使用注解方式暴露接口,会自动扫描package下所有包中dubbo相关的注解,这样就不用在xml中再针对每个服务接口配置dubbo:service interface-->
    <!--<dubbo:annotation package="com.example.demo.service"/>-->


    <!-- 暴露dubbo服务的方式二 -->
    <!-- 使用xml配置方式申明暴露一个接口服务,在程序启动的时候会自动注册到zookeeper         等同于在类上打@service注解,打了注解就必须要用annotation指定启动扫描路径,使用这种方式,就不需要指定annotation-->
    <dubbo:service interface="com.example.demo.service.ItemService" ref="itemService"/>
    <!-- 具体的实现beanid与上面的ref要一致-->
    <bean id="itemService" class="com.example.demo.service.ItemServiceImpl" />

</beans>


2.2 创建测试接口及测试类

服务提供方提供一个checkItemStatus方法,用来检查一个商品是否可售。
接口定义类 ItemService.java

package com.example.demo.service;

public interface ItemService {
    //检查商品是否可售
    boolean checkItemStatus(String id);
}

接口实现类 ItemServiceImpl.java

package com.example.demo.service;

import com.alibaba.dubbo.config.annotation.Service;
//@Service  //Service注解是dubbo的注解,不是spring的。若使用xml配置方式暴露接口,则不需要该注解。
public class ItemServiceImpl implements ItemService {

    @Override
    public boolean checkItemStatus(String id) {
        if (id.contains("111")) {
            return true;
        } else {
            return false;
        }
    }
}

2.3 编写启动类

启动类 SpringbootDubboServerApplication.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:provider.xml")  //加载xml文件
public class SpringbootDubboServerApplication {

   public static void main(String[] args) throws InterruptedException {
      SpringApplication.run(SpringbootDubboServerApplication.class, args);
      Thread.sleep(Long.MAX_VALUE); //pom中没有加spring-boot-starter-web依赖,启动时没有tomcat容器,会自动退出,所以加了一个sleep防止自动退出
   }
}

这里的classpath指的是各模块下的target/classes目录,该目录不仅包括java文件编译后的class文件,还包括resources目录下的配置文件。以本模块为例,target/classes包含了以下内容:

3 dubbo服务消费方配置

项目结构


3.1 创建xml配置文件

创建远程服务代理和暴露dubbo服务一样,也有两种方式,一是使用注解方式,二是使用xml配置方式。下面的consumer.xml中使用的是第一种方式。如果使用xml配置方式创建远程服务代理,将dubbo:annotation一行替换成如下配置即可。
consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="demo-consumer"/>

    <!--zookeeper注册中心 -->
    <dubbo:registry  protocol="zookeeper" address="localhost:2181" timeout="60000"/>

    <!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。-->
    <dubbo:consumer check="false" />

    <!-- 使用注解方式创建远程服务代理-->
    <dubbo:annotation package="com.example.demo.controller"/>

    <!-- 使用xml配置方式创建远程服务代理,id即为provider.xml中暴露的服务的id-->
    <!-- 等同于dubbo:annotation 加上代码里的@Reference注解-->
    <!--<dubbo:reference id="itemService" interface="com.example.demo.service.ItemService"/>-->


</beans>

3.2 创建测试类

ItemController.java

package com.example.demo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.example.demo.service.ItemService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ItemController {

    //注入服务提供方暴露的接口,通过@Reference注解,dubbo会在扫描的时候自动代理接口,然后通过rpc调用远程服务。
    //如果用xml配置方式,需要将@Reference换成@Autowired    @Reference
//    @Autowired
    ItemService itemService;

    @RequestMapping("/canbuy")
    public String canBuy(@RequestParam("id") String id){
        System.out.println(id);
        boolean flag = itemService.checkItemStatus(id);
        if (flag) {
            return "can buy!";
        } else {
            return "can not buy!";
        }
    }

}

3.3 编写启动类

SpringbootDubboClientApplication.java

package com.example.demo.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:consumer.xml") //加载xml配置文件
public class SpringbootDubboClientApplication {

    public static void main(String[] args) throws Exception{
        SpringApplication.run(SpringbootDubboClientApplication.class, args);
    }
}
右键-->debug(run)运行启动类:



4 测试

我们先后运行SpringbootDubboServerApplication.java和SpringbootDubboClientApplication.java,启动dubbo服务提供方和调用方。

在浏览器中输入dubbo admin的安装地址,如127.0.0.1:8089,打开dubbo admin界面,在服务治理-服务界面,可以看到我们注册的dubbo服务。状态“正常”,表示提供者和消费者都有。如果有乙方没有,在状态栏都会显示出来。

alt 文本

服务治理-应用页面,可以看到提供者DubboWithSpringBoot-Server和消费者DubboWithSpringBoot-Client。

alt 文本

在浏览器中调用canbuy接口,正常返回结果,说明我们的配置都生效啦~~~

http://localhost:8080/canbuy?id=111

alt 文本

到这里,Spring Boot集成Dubbo的内容都讲完啦。这样一个过程实践下来,再去看代码,就轻松多啦~~至少我们可以很快地完成以下三件事:
1、找到并看懂dubbo的配置文件
2、识dubbo服务的提供方和消费方
3、在admin中查看服务的状态

参考

https://testerhome.com/topics/11360

https://www.cnblogs.com/umgsai/p/6246041.html

https://www.jianshu.com/p/0837b48d1691


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值