文章目录
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");
}
}
测试结果: