Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用;智能容错和负载均衡;以及服务自动注册和发现。

Dubbo是阿里巴巴开源的一款高性能的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo框架是基于Spring容器运行的。

官方网站:https://dubbo.apache.org/

为什么Dubbo 被移除出spring cloud alibaba主干 dubbo和spring cloud alibaba_服务端

registry

注册中心:是用于发布和订阅服务的一个平台,用于替换SOA结构体系框架中的ESB服务总线的。

发布
开发服务端代码完毕后,将服务信息发布出去,实现一个服务的公开。
订阅
客户端程序,从服务端下载服务内容,这个过程是订阅。
订阅服务时,会将发布的服务所有信息,一次性下载到客户端。
客户端也可以自定义,修改部分服务配置信息。如:超长的时间,调用的重试次数等。

Consumer
服务端的消费者,就是服务的客户端。消费者必须使用Dubbo技术开发部分代码,基本上都是配置文件定义。
Provider
服务提供者。服务端使用Dubbo技术开发部分代码,以配置文件为主。
container
容器,Dubbo技术的服务端(Provider),在启动执行时,必须依赖Spring容器才能正常启动。
monitor(Dubbo Admin)
监控中心,是Dubbo提供的一个jar工程。
主要功能是监控服务端(Provider)和消费端(Consumer)的使用数据的。如服务端有多少个接口、多少方法、调用次数,压力信息等。客户端有多少,调用过哪些服务端,调用次数等。

执行流程
start 启动:启动Spring容器时,自动启动 Dubbo的 Provider

register 注册:Dubbo的Provider在启动后自动会去注册中心进行注册
注册内容包括:1.Provider的IP、端口、访问协议;2.对外提供的接口列表、方法、接口类;3.Dubbo的版本。

subscribe 订阅:当Consumer启动时,会自动去Registry注册中心获取已注册的服务的信息。

notify 通知:当Provider的信息发生变化时,自动由Registry向Consumer推送通知。

invoke 调用:Consumer调用Provider中的方法。同步请求:消耗一定性能。但是必须是同步请求,因为需要接收调用方法后的结果。

count 次数:每隔2分钟,provider和consumer自动向Monitor发送访问次数,Monitor进行统计。
协议
Dubbo协议
优点:底层采用Netty,采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好。
缺点:上传大文件时,不建议使用Dubbo文件上传。

RMI(Remote Method Invocation)协议
优点:JDK自带的能力,可与原生RMI互操作,基于TCP协议。缺点:偶尔连接失败。

Hessian 协议
优点:可与原生Hessian互操作,基于Http协议。缺点:需hessian.jar支持,http短连接开销大。

在Nacos服务注册中心之下,利用Dubbo来实现服务提供方与服务消费方。

构建服务公共接口

生产者服务与消费者服务公共业务接口。
创建子模块alm-common,新增 NotifyService

package com.alm.cloud.common.service;

public interface NotifyService{
    void send();
}
构建服务接口提供方

创建子模块alm-common,新增 NotifyService

<artifactId>provider</artifactId>
    <groupId>com.alm.cloud.provider</groupId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.example.cloud3</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2021.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.1</version>
        </dependency>
    </dependencies>
生产者 实现具体公共接口
package com.example.cloud3.provider.service;

import com.example.cloud3.common.service.SmsService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class SmsServiceImpl implements SmsService {

    private int count = 0;
    @Override
    public void send(){
        System.out.println("[Provider] send a msg..."+ (++count));
    }
}



@EnableDiscoveryClient //此注解可以省略
@SpringBootApplication
public class Provider_8031_Application {
    public static void main(String[] args) {
        SpringApplication.run(Provider_8031_Application.class, args);
    }
}

消费者服务 Consumer

<dependencies>
        <dependency>
            <groupId>com.example.cloud3</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2021.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.1</version>
        </dependency>
    </dependencies>

application.yml

server:
  port: 8021

spring:
  application:
    name: consumer-8021
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        enabled: true
        register-enabled: true
        server-addr: 127.0.0.1:8848

dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: "spring-cloud://localhost"
  cloud:
    subscribed-services: provider-8031
  consumer:
    check: false

main、controller

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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



import com.example.cloud3.common.service.SmsService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SmsController {
    @DubboReference private SmsService smsService;
    @RequestMapping("/sendMsg")
    public String sendMsg(){
        smsService.send();
        System.out.println("[Consumer] send success!");
        return "success";
    }
}