RPC:Dubbo


RPC的高并发、低延迟可以为多个微服务提供相互间的通信

1. 添加依赖

<!-- Dubbo Spring Boot Starter -->
<dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>2.7.15</version>
</dependency>

2. 创建服务接口

public interface HelloService {

    String sayHello(String name);
}

3. 实现 Dubbo 服务提供方

bootstrap.yaml新增配置

dubbo:
      scan:
          base-packages: com.rainbowred.core.service
      protocol:
          name: dubbo
          port: 20880
      registry:
          address: nacos://172.16.3.38:8848

实现 HelloService 接口

@DubboService(version = "1.0.0")
public class DefaultHelloService implements HelloService {

    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

nacos显示有dubbo服务

4. 实现 Dubbo 服务消费方

bootstrap.yaml新增配置

dubbo:
      registry:
          address: nacos://172.16.3.38:8848
@RestController
@RequestMapping("/tc")
public class TestController {

    @DubboReference(version = "1.0.0")
    private HelloService helloService;

    @RequestMapping("/testRpc")
    public String testRpc(String data) {
        return helloService.sayHello(data);
    }
}

5. 注意:启动时会出现循环依赖报错,报错详情如下:

Description:

The dependencies of some of the beans in the application context form a cycle:

   targeterBeanPostProcessor defined in class path resource [com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.class]
      ↓
   com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository (field private com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository.dubboMetadataConfigServiceProxy)
      ↓
   com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy
┌─────┐
|  com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration (field private com.alibaba.cloud.dubbo.metadata.resolver.MetadataResolver com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration.metadataResolver)
└─────┘

暂时解决办法:yaml文件新增配置

spring:
  main:
    allow-circular-references: true

6. 单元测试:使用JUnit结合Mockito

  • 测试Dubbo服务提供者

测试服务提供者,通常需要测试其业务逻辑而不是Dubbo框架本身。可以使用标准JUnit测试来完成。

import com.rainbowred.commons.services.rpc.HelloService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
 * @author wangyitao
 * @date 2023/11/28.
 */

public class HelloServiceImplTest {

    /**
     * 测试Dubbo服务提供者
     */
    @Test
    public void testSayHello() {
        HelloService service = new HelloServiceImpl();
        String result = service.sayHello("World");
        Assertions.assertEquals("Hello, World !", result);
    }

}

测试结果:

  • 测试Dubbo服务消费者

对于服务消费者,可以使用Mockito来模拟Dubbo服务的行为。

import com.rainbowred.commons.services.rpc.HelloService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import org.mockito.Mockito;

import static org.mockito.Mockito.*;

/**
 * @author wangyitao
 * @date 2023/11/28.
 */
public class HelloServiceConsumerTest {

    /**
     * 测试Dubbo服务消费者
     */
    @Test
    public void testSayHello() {
        // 创建一个模拟的HelloService对象
        HelloService mockService = mock(HelloService.class);

        // 配置模拟对象的行为
        when(mockService.sayHello("World")).thenReturn("Hello, World !");

        // 使用模拟的服务
        String response = mockService.sayHello("World");

        // 验证结果
        Assertions.assertEquals("Hello, World", response);

        // 验证交互行为
        verify(mockService).sayHello("World");
    }
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值