Dubbo服务发布调用实现

服务发布调用实现

系统需求
根据商品id,查询商品信息

Dao

单表查询,不需要写代码
使用Mybatis逆向工程生成的代码

Interface

在taotao-manager-interface工程中
创建一个ItemService接口

public interface ItemService {
    TbItem getItemById(long itemId);
}

Service

实现接口
要找到接口,需要添加对接口的引用

<dependency>
    <groupId>com.taotaogroupId>
    <artifactId>taotao-manager-interfaceartifactId>
    <version>0.0.1-SNAPSHOTversion>
dependency>

在taotao-manager-Service工程中
创建一个itemSeviceImpl的实现类

@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private TbItemMapper itemMapper;

    @Override
    public TbItem getItemById(long itemId) {
        TbItem item = itemMapper.selectByPrimaryKey(itemId);
        return item;
    }
}

发布服务

使用Dubbo发布服务,引入jar包
父工程,控制版本号
Service,添加jar包引用


<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>dubboartifactId>
    <exclusions>
        <exclusion>
            <artifactId>springartifactId>
            <groupId>org.springframeworkgroupId>
        exclusion>
        <exclusion>
            <artifactId>nettyartifactId>
            <groupId>org.jboss.nettygroupId>
        exclusion>
    exclusions>
dependency>
<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
dependency>
<dependency>
    <groupId>com.github.sgroschupfgroupId>
    <artifactId>zkclientartifactId>
dependency>

注意

Maven依赖传递
引入Dubbo的时候,会把依赖的Spring版本也添加进来

排除Spring的引用,否则,可能会有版本冲突问题
同理,排除netty的引用
选中,右键Exclude Maven Artifact
Dubbo服务发布调用实现_第1张图片

引用标签

在配置文件中,使用dubbo标签
需要添加dubbo标签,dubbo约束

否则,使用dubbo标签,标签提示错误
applicationContext-service.xml

xmlns:dubbo=http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

Dubbo服务发布调用实现_第2张图片

发布服务



<dubbo:application name="taotao-manager" />

<dubbo:registry protocol="zookeeper" address="192.168.25.167:2181" />

<dubbo:protocol name="dubbo" port="20880" />

<dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300"/>

配置说明

dubbo:application,配置应用程序,名称
dubbo:registry,配置注册中心,地址端口号,默认2181

dubbo:protocol,配置dubbo服务端口号,默认20880
这个端口号,可以改为其他端口号
只要不冲突,并且在65535范围内即可

dubbo:service,暴露服务接口
Interface,接口,配置接口的全路径名
Ref,引用接口实现,从容器中获取

itemServiceImpl
通过扫描包,扫描到具体的实现类
在容器中创建一个Bean,添加到Spring容器中
Id,默认为类名,首字母小写itemServiceImpl

<context:component-scan base-package="com.taotao.service"/>

Timeout,设置超时时间

服务调用

Web工程,添加dubbo引用


<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>dubboartifactId>
    <exclusions>
        <exclusion>
            <artifactId>springartifactId>
            <groupId>org.springframeworkgroupId>
        exclusion>
        <exclusion>
            <artifactId>nettyartifactId>
            <groupId>org.jboss.nettygroupId>
        exclusion>
    exclusions>
dependency>
<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
dependency>
<dependency>
    <groupId>com.github.sgroschupfgroupId>
    <artifactId>zkclientartifactId>
dependency>

引用标签

需要在Spring容器中,引用服务
Spring MVC前端控制器,也会初始化一个Spring容器
所以,可以在Spring MVC里面直接引用服务

Springmvc.xml
同理,添加dubbo标签、约束

xmlns:dubbo=http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

Dubbo服务发布调用实现_第3张图片

引用服务


<dubbo:application name="taotao-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.167:2181"/>    
<dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />

配置说明

发布服务,需要在注册中心注册
引用服务,也需要在注册中心注册

dubbo:application,配置应用程序,程序名称
dubbo:registry,配置注册中心,地址端口号
dubbo:reference,引用服务

Interface

Web需要引用Interface接口
Pom文件,添加对接口的引用

<dependency>
    <groupId>com.taotaogroupId>
    <artifactId>taotao-manager-interfaceartifactId>
    <version>0.0.1-SNAPSHOTversion>
dependency>

接口
需要单独提出了,存放接口的定义

服务端,发布服务,需要这个接口定义
表现层,引用服务,也需要这个接口定义
所以,把接口打成一个jar包,方便表现层的引用

虽然,Interface是工程的一个模块
但是,只要是一个jar包有坐标,就可以通过坐标引用

此时,Spring MVC容器中
就有这个Interface的代理对象,通过id给Bean起个名字
容器中,就有这个Bean对象

Controller

通过注解,注入这个对象
在Spring MVC容器初始化的时候
会把这个Bean注入到Controller中,直接调用即可

@Controller
public class ItemController {

    @Autowired
    private ItemService itemService;

    @RequestMapping("/item/{itemId}")
    @ResponseBody
    public TbItem getItemById(@PathVariable Long itemId) {
        TbItem tbItem = itemService.getItemById(itemId);
        return tbItem;
    }
}

你可能感兴趣的:(————Dubbo)