dubbo和nacos在大营销项目中的应用

dubbo和nacos在大营销项目中的应用

Dubbo配置流程以及踩坑情况

引入dubbo和nacos

  1. 在项目根pom文件中引入nacos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
  1. 配置application-dev.xml
1
2
3
4
5
6
7
8
9
10
11
12
dubbo:
application:
name: big-market
version: 1.0
registry:
id: nacos-registry
address: nacos://127.0.0.1:8848
protocol:
name: dubbo
port: -1
scan:
base-packages: io.github.jasonxqh.api

dubbo.application

name:

  • 作用:定义 Dubbo 应用的名称。这个名称在服务注册中心(如 Nacos)中用于标识该应用。
  • 意义:便于在注册中心中区分不同的 Dubbo 应用,尤其在微服务架构中有多个应用时。

version:

  • 作用:指定应用的版本号。
  • 意义:用于服务版本管理,可以在同一个接口的不同版本之间进行区分和兼容。例如,不同版本的服务可以同时存在,消费者可以选择调用特定版本的服务。

dubbo.registry

id:

  • 作用:给注册中心实例指定一个唯一标识符。
  • 意义:在配置多个注册中心时,通过 id 区分不同的注册中心实例。

address:

  • 作用:指定注册中心的地址和协议。
  • nacos://127.0.0.1:8848
    • nacos:表示使用 Nacos 作为注册中心。
    • 127.0.0.1:8848:Nacos 注册中心的地址和端口。
  • 意义:Dubbo 服务提供者和消费者通过这个地址与 Nacos 进行通信,实现服务的注册与发现。

dubbo.protocol

  • name:
    • 作用:指定使用的通信协议。
    • dubbo,表示使用 Dubbo 协议。
    • 意义:Dubbo 支持多种协议(如 dubbormihttp 等),选择合适的协议以满足不同的性能和兼容性需求。
  • port:
    • 作用:指定服务提供者监听的端口号。
    • -1 表示自动分配端口。
    • 意义
      • 自动分配:在开发或测试环境中,使用自动分配端口可以避免端口冲突,简化配置。
      • 固定端口:在生产环境中,建议指定固定端口,便于服务的管理和监控。

dubbo.scan

base-packages:

  • 作用:指定 Dubbo 扫描注解的基础包路径。
  • io.github.jasonxqh.api
  • 意义
    • 自动扫描:Dubbo 会自动扫描指定包及其子包下的类,查找并注册带有 Dubbo 注解(如 @DubboService@DubboReference)的服务提供者和消费者。
    • 简化配置:无需在每个类上单独配置注册信息,提升开发效率。

启动nacos

首先,要在

docker-compose-environment中配置nacos信息,运行后 拉取镜像,即可启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# http://127.0.0.1:8848/nacos 【账号:nacos 密码:nacos】
nacos:
image: nacos/nacos-server:v2.2.3-slim
container_name: nacos
restart: always
ports:
- "8848:8848"
- "9848:9848"
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
- NACOS_AUTH_IDENTITY_KEY=2222
- NACOS_AUTH_IDENTITY_VALUE=2xxx
- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
networks:
- my-network
depends_on:
mysql:
condition: service_healthy

MYSQL_SERVICE_HOST=mysql

  • 含义:指定 MySQL 服务的主机名为 mysql。在 Docker Compose 中,服务之间可以通过服务名互相通信。因此,mysql 指的是同一 Docker Compose 文件中定义的名为 mysql 的服务。

networks: - my-network

  • 含义:将 Nacos 容器加入到名为 my-network 的 Docker 网络中。

depends_on: mysql

  • 含义:Nacos 服务依赖于名为 mysql 的服务,并且在 MySQL 服务健康(service_healthy)后才启动。

MYSQL_SERVICE_PORT=3306

  • 含义:指定 MySQL 服务的端口为 3306,这是 MySQL 的默认端口。

Dubbo 服务提供者(@DubboService)

@DubboServiceDubbo 提供的注解,用于标识一个类为 Dubbo 服务提供者。它相当于 Spring 中的 @Service 注解,但专门用于 Dubbo 服务的发布和注册

主要功能

  • 服务发布:将标注的类作为 Dubbo 服务提供者,自动将其注册到注册中心(如 Nacos、Zookeeper)。
  • 配置服务属性:通过注解属性配置服务的版本、分组、超时、重试次数等参数。
  • 支持多协议和多注册中心:允许在不同的协议和注册中心下发布服务实例。

常用属性

  • version:指定服务的版本号,用于区分不同版本的服务。
  • group:指定服务的分组,便于在同一个注册中心中管理不同组的服务。
  • interfaceName:指定服务接口的全限定名(不常用,通常通过接口类自动推断)。
  • timeout:调用超时时间,单位毫秒。
  • retries:失败重试次数。
  • protocol:指定服务使用的协议

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Slf4j
@RestController()
@CrossOrigin("*")
@RequestMapping("/api/v1/raffle/activity")
@DubboService(
version = "1.0",
group = "user-group",
timeout = 5000,
retries = 2
)
public class RaffleActivityController implements IRaffleActivityService {
/**/
}
  • 自动注册@DubboService 注解会自动将 RaffleActivityController 类注册为 Dubbo 服务,Dubbo 会根据配置将其信息发布到注册中心。
  • 版本与分组:通过 versiongroup 属性,可以在同一注册中心中管理不同版本和不同组的服务,避免冲突和提高灵活性。
  • 超时与重试:通过 timeoutretries 属性,控制服务调用的容错行为,提升系统的鲁棒性。

bug1

在我正确在application-dev.yml 中配置dubbo时,一开始出现了这个问题,spring无法扫描到我的配置信息。

解决:这种问题很坑,一般不是我们的代码问题,单纯是idea没有刷新配置文件。我们清理缓存并重启即可。

Dubbo 服务消费者(@DubboReference)

@DubboReferenceDubbo 提供的注解,用于注入 Dubbo 服务消费者,即引用远程的 Dubbo 服务。它相当于 Spring 中的 @Autowired 注解,但专门用于引用远程服务。

  1. 在 测试项目中,引入注册到nacos中的包,然后编写测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApiTest {

@DubboReference(interfaceClass = IRaffleActivityService.class, version = "1.0")
private IRaffleActivityService raffleActivityService;

@Test
public void test_rpc() {
ActivityDrawRequestDTO request = new ActivityDrawRequestDTO();
request.setActivityId(100301L);
request.setUserId("xiaofuge");
Response<ActivityDrawResponseDTO> response = raffleActivityService.draw(request);

log.info("请求参数:{}", JSON.toJSONString(request));
log.info("测试结果:{}", JSON.toJSONString(response));
}

}
  • @DubboReference
    • 作用:这是 Dubbo 提供的注解,用于注入远程服务的引用(即消费者)。
    • 属性说明:
      • interfaceClass:指定要引用的远程服务接口类。
      • version:指定服务的版本,用于区分不同版本的服务实例。
    • 优势:
      • 简化配置:通过注解方式注入远程服务,无需手动配置服务地址。
      • 动态代理:Dubbo 自动生成代理对象,简化服务调用。

注意:确保 Dubbo 已正确配置,且 IRaffleActivityService 接口在服务提供者和消费者中版本一致,且接口类在两端保持同步。

bug2

在大营销项目中,需要先 mvn clean install重新构建项目所有的包,这样测试项目中才能引入最新版本的包。否则会出现引用到过去没有serialize的DTO的报错

-------------本文结束,感谢您的阅读-------------