Dubbo直连模式的使用

本文介绍了在不使用注册中心的情况下,如何通过Dubbo实现服务间的直接调用,类似于SpringCloud的Feign。文章详细展示了服务端和客户端的配置、接口定义及实现,以及如何通过单元测试进行调用。Dubbo通过socketTCP协议进行接口调用,实现了远程过程调用,简化了模块间通信的复杂性。
摘要由CSDN通过智能技术生成

之前开发过程中有使用过SpringCloud,并没有使用过Dubbo,一次有缘的机会使用到了Dubbo,这次的使用没有用注册中心,采用直连的方式使用的,感觉也还奇妙的,有点像SpringCloud 的Feign 调用方式,不同的是SpringCloud采用的是http封装访问的,而Dubbo是socket TCP进行接口指定引用实现方式,也称远程过程调用。

那么什么场景下使用呢,假如我们开发时会进行模块划分,有对外的接口,供其他调用jar包使用,也有对内的业务,有公共对内和对外都有的业务,那么,外部其他模块或其他服务器要使用我们的模块,他们该怎么用呢,还是原始方式写一堆http协议?请求网络调用吗?有点麻烦,现在就可以直接Dubbo的方式让它直接能获取服务端接口实现方法,

服务端

配置文件

server:
  port: 8080

dubbo:
 application:
   name: Lottery
   version: 1.0.0
 registry:
   # 不需要注册中心
   address: N/A
 protocol:
   name: dubbo
   port: 20880
# 扫描模块
 scan:
   base-packages: cn.itedus.lottery.rpc

pom文件

  <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>

首先在服务端定义接口,发送指令的接口定义

public interface ISendCommon {
    String send(String recommad);
}

然后服务端实现上边的发送指令接口,注意这里的注解Service要使用Dubbo的

package cn.itedus.lottery.interfaces;

import cn.itedus.lottery.ISendCommon;
import org.apache.dubbo.config.annotation.Service;

@Service
public class SendCommon implements ISendCommon {
    @Override
    public String send(String recommad) {
        // 指令操作模拟
        return recommad + "成功!";
    }
}

服务端启动类,@EnableDubbo打开Dubbo

@SpringBootApplication
@Configurable
@EnableDubbo
public class LotteryApplication {

    public static void main(String[] args) {
        SpringApplication.run(LotteryApplication.class, args);
    }

}

 如果返回使用了实体类必须手动加上序列化才可使用,如

implements Serializable

客户端

其实客户端是同样的配置方式

dubbo:
 application:
   name: Lottery
   version: 1.0.0
 registry:
   address: N/A
 protocol:
   name: dubbo
   port: 20880
 scan:
   base-packages: cn.itedus.lottery.rpc

pom文件要加入服务端包的依赖,否则使用不了方法

<dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>

        <!-- 依赖自写的rpc层 -->
        <dependency>
            <groupId>cn.itedus.lottery</groupId>
            <artifactId>lottery-rpc</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

 单元测试调用服务器指定接口实现业务逻辑

package cn.itedus.lottery.test;


import cn.itedus.lottery.IActivityBooth;
import cn.itedus.lottery.ISendCommon;
import cn.itedus.lottery.rpc.req.ActivityReq;
import cn.itedus.lottery.rpc.res.ActivityRes;
import com.alibaba.fastjson.JSON;
import org.apache.dubbo.config.annotation.Reference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * @Author df
 * @Date 2022/5/18 10:07
 * @Version 1.0
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApiTest {

    // @Reference让定义的接口引用去指向一个具体的接口实现
    // 基于接口的远程调用
    @Reference(interfaceClass = ISendCommon.class, url = "dubbo://127.0.0.1:20880")
    private ISendCommon iSendCommon;

    @Test
    public void test_rpc() {
        String result = iSendCommon.send("关闭");
        System.out.println(result);
    }

}

启动后台服务端项目,启动以后Dubbo就启动了,然后客户端单元测试访问,访问结果如下,

没有报错,成功访问到了也没有报错

Dubbo的实现方式是客户端将要请求的接口什么的都以参数的形式序列化好进行socket传输给服务端,服务端接收完毕后反序列化,然后找到接口的实现类并调用,成功后返回结果,将结果进行序列化,客户端收到后将结果反序列化后使用,在返回后你可以看下对象是proxy,其实是代理对象,创建代理对象的好处就是可以在原有对象上增强或减少功能,如序列化反序列化,包装连接请求等等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Dubbo直连模式的示例代码: 1. 在provider端配置服务 ```xml <!-- 配置服务 --> <dubbo:service interface="com.example.service.SomeService" ref="someServiceImpl" /> <!-- 直连地址 --> <dubbo:protocol name="dubbo" port="20880" /> ``` 2. 在consumer端配置直连地址 ```xml <!-- 直连地址 --> <dubbo:reference interface="com.example.service.SomeService" url="dubbo://127.0.0.1:20880" /> ``` 3. 在代码中使用 ```java // 获取服务 SomeService someService = DubboReferencer.getReference(SomeService.class); // 调用服务 someService.doSomething(); ``` 其中,DubboReferencer是一个工具类,用于获取Dubbo服务的引用,示例代码如下: ```java public class DubboReferencer { /** * 获取Dubbo服务引用 * @param clazz 服务接口类 * @param <T> 服务接口泛型 * @return 服务引用 */ public static <T> T getReference(Class<T> clazz) { // 初始化Dubbo配置 ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("consumer"); ReferenceConfig<T> referenceConfig = new ReferenceConfig<>(); referenceConfig.setApplication(applicationConfig); referenceConfig.setInterface(clazz); referenceConfig.setUrl("dubbo://127.0.0.1:20880"); referenceConfig.setRetries(0); return referenceConfig.get(); } } ``` 以上就是使用Dubbo直连模式的示例代码。需要注意的是,直连模式不支持负载均衡、容错等功能,适用于开发环境和调试场景。在生产环境中,应该使用注册中心来协调服务提供者和消费者之间的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值