项目使用SpringBoot做微服务,Nacos作为注册和配置中心,服务之间调用使用Dubbo

项目结构

dubbo架构图
dubbo-architecture.jpeg
微服务代码结构
image.png
说明:

  1. xxx-client 提供 dubbo service 接口,供消费者调用
  2. xxx-service 提供具体 service 实现

一个服务如果需要调用另一个服务,引用这个服务的client就可以。

添加maven依赖

微服务的pom.xml使用dubbo+nacos时需额外引入以下依赖

  1. <properties>
  2. <dubbo.version>2.7.15</dubbo.version>
  3. <nacos-client.version>2.0.3</nacos-client.version>
  4. <nacos.spring.version>1.1.0</nacos.spring.version>
  5. </properties>
  6. <!-- Dubbo dependency -->
  7. <dependency>
  8. <groupId>org.apache.dubbo</groupId>
  9. <artifactId>dubbo</artifactId>
  10. <version>${dubbo.version}</version>
  11. </dependency>
  12. <!-- Dubbo Nacos configcenter dependency -->
  13. <dependency>
  14. <groupId>org.apache.dubbo</groupId>
  15. <artifactId>dubbo-configcenter-nacos</artifactId>
  16. <version>${dubbo.version}</version>
  17. </dependency>
  18. <!-- Dubbo Nacos registry dependency -->
  19. <dependency>
  20. <groupId>org.apache.dubbo</groupId>
  21. <artifactId>dubbo-registry-nacos</artifactId>
  22. <version>${dubbo.version}</version>
  23. </dependency>
  24. <!-- Nacos Spring dependency -->
  25. <dependency>
  26. <groupId>com.alibaba.nacos</groupId>
  27. <artifactId>nacos-spring-context</artifactId>
  28. <version>${nacos.spring.version}</version>
  29. </dependency>

因为nacos-spring-boot-starter 不支持springboot2.4+版本,所以我们用nacos-spring-context就行。

配置文件

bootstrap.yml 配置 dubbo application name,建议配置为spring.project.name

  1. dubbo:
  2. application:
  3. name: @project.name@

在每个运行环境的yml单独配置duubo config center 和 nacos config,例如,dev环境

  1. dubbo:
  2. config-center:
  3. address: nacos://${dubbo_server_url}:8848?username=username&password=password
  4. namespace: dubbodev
  5. nacos:
  6. config:
  7. server-addr: ${nacos_server_url}:8848
  8. namespace: dev_namespace
  9. username: dev
  10. password: dev_password

上述dubbo config center的namespace和nacos config的namespace是不同的,方便开发时进行隔离区分。
这里的dubbo使用nacos的用户名密码也最好根据环境区分开来,如dubbodev,dubbotest,dubboprod等。

dubbodev用于下存放dubbo的配置文件,在这个命名空间下新增dubbo.properties,
dataId:dubbo.properties,group:dubbo,内容如下(dev示例)

  1. dubbo.registry.address=nacos:/nacos://${dubbo_server_url}:8848?username=username&password=password
  2. dubbo.registry.check=false
  3. dubbo.registry.simplified=true
  4. dubbo.provider.timeout=30000
  5. dubbo.provider.retries=0
  6. dubbo.provider.loadbalance=leastactive
  7. dubbo.provider.version=DEV
  8. dubbo.consumer.check=false
  9. dubbo.consumer.version=DEV
  10. dubbo.application.qos-enable=false
  11. dubbo.service.shutdown.wait=6000

dev_namespace存放项目中实际需要用到的各种配置文件。

Application类增加注解

  1. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  2. import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @EnableDubbo
  6. @EnableNacosConfig
  7. @SpringBootApplication
  8. public class Application {
  9. public static void main(String[] args) {
  10. SpringApplication.run(Application.class, args);
  11. }
  12. }

额外添加两个注解 @EnableDubbo 和 @EnableNacosConfig,用于开启dubbo调用和启用nacos配置。

Dubbo远程调用接口示例

服务提供
client包定义dubbo接口

  1. public interface CountryService {
  2. ServiceResult<List<CountryDTO>> getAllCountry();
  3. }

在service中实现client包的接口,使用@DubboService注解注册服务。

  1. @DubboService
  2. public class CountryServiceImpl implements CountryService {
  3. @Override
  4. public ServiceResult<List<CountryDTO>> getAllCountry() {
  5. return ServiceResult.ok(getAllCountryList());
  6. }
  7. }

服务调用
先添加dubbo服务提供者的client包依赖,然后进行远程调用。

  1. import org.apache.dubbo.config.annotation.DubboReference;
  2. import org.junit.jupiter.api.Test;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import java.util.List;
  5. import static org.junit.jupiter.api.Assertions.assertTrue;
  6. @SpringBootTest
  7. public class CountryTest {
  8. @DubboReference(check = false)
  9. private CountryService countryDubboService;
  10. @Test
  11. public void testGetSelect() {
  12. ServiceResult<List<CountryDTO>> res = countryDubboService.getAllCountry();
  13. assertTrue(res.isSuccess());
  14. assertTrue(res.getData().size() > 0);
  15. }
  16. }

使用@DubboReference注入dubbo client的接口即可调用,check = false 关闭启动时检查接口可用,防止服务依赖问题因为启动顺序不正确导致服务起不来。

Nacos获取配置信息示例

  1. import com.alibaba.nacos.api.annotation.NacosInjected;
  2. import com.alibaba.nacos.api.config.ConfigService;
  3. import com.alibaba.nacos.api.exception.NacosException;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. @SpringBootTest
  8. @Slf4j
  9. public class NacosTest {
  10. @NacosInjected
  11. private ConfigService configService;
  12. @Test
  13. public void testNacos() {
  14. try {
  15. configService.getConfig("data_id", "group", 2000L);
  16. } catch (NacosException e) {
  17. log.info("get nacos config error.", e);
  18. }
  19. }
  20. }

主要使用 @NacosInjected 注入NacosConfigService来获取配置信息。

动态刷新配置,需要使用监听器:
1、添加listener

  1. configService.addListener(DATA_ID, DEFAULT_GROUP, new AbstractListener() {
  2. @Override
  3. public void receiveConfigInfo(String config) {
  4. assertEquals("9527", config); // asserts true
  5. }
  6. });

2、使用注解方式

  1. @NacosConfigListener(dataId = DATA_ID)
  2. public void onMessage(String config) {
  3. assertEquals("mercyblitz", config); // asserts true
  4. }

更多特性,参考nacos spring,地址: https://nacos.io/zh-cn/docs/nacos-spring.html