【囫囵吞枣】如何初始化一个Spring Boot 微服务项目 Part 4 | 豆包MarsCode AI刷题

36 阅读3分钟

终于来到了最后一步——写Java!我搓的无意义小demo终于要能跑起来了hhh

5 使用Dubbo实现服务间通信

5.1 application.yml配置

我们使用triple进行通信。不管用什么协议进行通信,我们都要为不同的微服务设置端口:

dubbo:
  application:
    name: domestic-fund-service
  registry:
    address: nacos://${NACOS_ADDRESS:127.0.0.1}:8848
  protocol:
    port: 50052
    name: tri

在上面的例子中:

  • 我们设置了服务名称为domestic-fund-service。服务名称在一个项目的范围内唯一,这便于Nacos后台看服务上线状态和订阅状态。
  • 我们设置了Nacos以实现服务发现功能。Nacos详细介绍请看Nacos官网。
  • 我们设置了通信协议为triple(就是name: tri那个)。

dubbo的配置比较简单,这样写差不多就可以了。

5.2 服务入口类注解配置

@SpringBootApplication
@EnableDubbo
@MapperScan("world.willfrog.alphafrogmicro.common.dao")
public class DomesticFundServiceImplApplication {
    public static void main(String[] args) {
        SpringApplication.run(DomesticFundServiceImplApplication.class, args);
    }
}

在上面的例子中:

  • 本项目的DAO层是公用的。这不难理解,因为在早期,数据往往都存放在一个数据源上,各个服务访问同一个实体的方式也应该是一样的(当然这里也有我懒的原因……以后面试的时候拷打我主从数据库怎么办,唉)
  • @EnableDubbo注解启动了这个项目中各个Bean的Dubbo配置。

5.3 定义指定的服务为DubboService

@DubboService
@Service
@Slf4j
public class DomesticFundServiceImpl extends DomesticFundServiceImplBase {
    // CODE
}

DomesticFundServiceImplBase登场了!这就是我们上一节提到的Java桩代码的base class。

注意到,在上面的例子中,我们使用了@DubboService这一注解。通过这个注解,我们才能让别的服务以rpc通信的方式来调用本服务。

那么,别的服务在调用DomesticFundService时,需不需要显式地发起rpc请求呢?当然不用,Java桩代码已经帮我们搞定了。

5.4 使用DubboReference调用其它服务

我们可以像Autowired那样在需要调用的Dubbo Service上加@DubboReference注解:

@Controller
@RequestMapping("/domestic/fund")
@Slf4j
public class DomesticFundController {

    @DubboReference
    private DomesticFundService domesticFundService;
    // More Code...
}

这里需要说明一点,这里的DomesticFundService,具体是谁定义的?是我们写的境内基金服务的具体实现吗?

No!这是ProtoBuf在mvn compile阶段生成的桩代码。我们调用domesticFundService的方法,实际上就是在给境内基金服务发送ProtoBuf序列化好的数据;它的返回值就是境内基金服务发送回来的ProtoBuf序列化好的数据。

5.5 未解之谜:从DAO Object到ProtoBuf message

这是一个我自己还没想好解决办法的问题。假设一个message有几十个field,其中只有两个是必填的,剩下的字段都是可选的。那么从DAO层拿到一个object后,我就要写几十个if语句来判断每个可选字段是否为null,只有不为null的时候,我们才添加上对应的字段,最后再build message。

这样的写法非常非常冗长,老实说我没想到解决办法,就把这个问题留在这里吧,以后想到了再写