项目源码地址

https://gitee.com/guangyang1314666/springboot-demo/tree/master/springboot-dubbo-nacos

Dubbo 是什么?

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:

  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 服务自动注册和发现。

    为什么我要区分 2.6.x 和 2.7.x ?

    Dubbo有很长一段时间的发展史,2018年的时候不知道为什么阿里暂更了一年,之后又重新开始更新。之前一直是阿里在维护,后面阿里把它捐给了Apache基金会,由Apache来维护,2.6.x之前,maven中的包名都是alibaba,2.7.0之后包名改成了apache,其中整合入系统中有一些差异;发展史:
    • 2008年,阿里巴巴开始内部使用 Dubbo;
    • 2009年初,发布1.0版本;
    • 2011年10月,阿里巴巴宣布开源,版本为2.0.7;
    • 2014年,当当网 fork 了 Dubbo 版本,命名为dubbox-2.8.0,并支持 HTTP REST 协议;
    • 2014年10月,发布2.3.11版本;
    • 2017年9月,阿里巴巴重启维护,重点升级所依赖的 JDK 及组件版本,发布2.5.4/5版本;
    • 2018年2月,阿里巴巴宣布将 Dubbo 捐献给 Apache,进入 Apache 孵化器;
    • 2018年6月,Apache Dubbo 发布首个加入 Apache 孵化器的版本2.6.2,发展首位committer,来自有赞的@yiji同学;
    • 2018年7月,Dubbo 官方域名更新到 dubbo.apache.org,页面焕然一新,并启 用新 logo,品牌全面升级;
    • 2018年11月,加入孵化器以来,发展来自有赞的 @yiji同学成为首位 PPMC member;
    • 2018年12月,第八届云计算标准和应用大会 ,Dubbo 获得中国优秀开源项目一等奖,同时获得开源中国举办的2018中国优秀开源项目奖,位列排行榜第3;
    • 2019年1月,发布了2.7.0,支持 Java 1.8,包名更改为org.apache,支持 Restful 服务;
    • 2019年1月,Dubbo 社区正式发布 Dubbo Ecosystem, 升级为完整的微服务解决方案;
    • 2019年5月21日,Dubbo 从 Apache 正式毕业。

Dubbo项目的基本结构

Dubbo的原理什么的以及它的组成这里就不扯了,直接说说dubbo的项目结构吧。

基本的Dubbo项目组成分为三个部分:

  • 接口层
  • 服务提供层
  • 服务器消费层

    实现整合nacos1.1.4作为dubbo2.7.x注册中心

    依赖

    1. <dependency>
    2. <groupId>org.apache.dubbo</groupId>
    3. <artifactId>dubbo-spring-boot-starter</artifactId>
    4. <version>2.7.5</version>
    5. </dependency>
    6. <!-- nacos 2.7.x引入-->
    7. <dependency>
    8. <groupId>org.apache.dubbo</groupId>
    9. <artifactId>dubbo-registry-nacos</artifactId>
    10. <version>2.7.5</version>
    11. </dependency>
    :::warning 注意事项:dubbo-registry-nacos 自动引入的 nacos-client jar 是 1.1.1 版本的 :::

    服务提供者

    主函数

    @EnableDubbo //开启Dubbo的注解支持
    @SpringBootApplication
    public class ProducerMain {
      public static void main(String[] args) {
          SpringApplication.run(ProducerMain.class,args);
      }
    }
    

    配置文件

    ```yaml spring: application: name: dubbo-nacos-producer main:

    解决Bean重复定义问题

    allow-bean-definition-overriding: true

# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service

dubbo: scan:

# 接口实现类的包名
base-packages: com.guangyang.dubbo.service.impl

Dubbo Application

The default value of dubbo.application.name is ${spring.application.name}

application: name: ${spring.application.name}

# 禁用QOS同一台机器可能会有端口冲突现象
qos-enable: false
qos-accept-foreign-ip: false
# 服务提供的版本
version: 1.0.0

Dubbo Protocol

protocol:

#协议名称
name: dubbo
#服务暴露端口
port: 20880

Dubbo Registry

registry: address: nacos://127.0.0.1:8848

# 定义注册的命名空间
parameters:
  namespace: 437e9b88-393c-486e-9061-506f12f09a7b

demo: service: version: 1.0.0 name: ${spring.application.name}

<a name="BnHCw"></a>
### 服务实现层
```java
@Service // 注意,这个是dubbo包里面的service,不是spring包里面的
public class ProducerServiceImpl implements ProducerService {

    @Value("${demo.service.name}")
    private String serviceName;
    @Override
    public String applicationDemo() {
        RpcContext rpcContext = RpcContext.getContext();
        return String.format("Service [name :%s , port : %d] %s",
                serviceName,
                rpcContext.getLocalPort(),
                rpcContext.getMethodName());
    }
}

服务消费者

主函数

@EnableDubbo
@SpringBootApplication
public class ConsumerMain {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerMain.class,args);
    }
}

配置文件

server:
  port: 9090
spring:
  application:
    name: dubbo-consumer
  main:
    # 解决Bean重复定义问题
    allow-bean-definition-overriding: true

dubbo:
  # 配置服务信息
  application:
    name: dubbo-consumer
    # 禁用QOS同一台机器可能会有端口冲突现象
    qos-enable: false
    qos-accept-foreign-ip: false
    # 服务提供的版本
    version: 1.0.0
  # 配置注册中心
  registry:
    address: nacos://127.0.0.1:8848
    # 定义注册的命名空间
    parameters:
      namespace: 437e9b88-393c-486e-9061-506f12f09a7b

  # 设置超时时间
  consumer:
    timeout: 4000

控制层(消费服务)

@RestController
public class ConsumerController {
    // Dubbo远程调用注解
    @Reference
    ProducerService producerService;

    @GetMapping("/producer/demo")
    public String demo() {
        return producerService.applicationDemo();
    }
}