# Dubbo

# 历史

  1. 早期Dubbo的定位 基于JAVA的高性能,轻量续RPC框架 【high-performance,lightweight.Java-based RPC framework】 SOA【Service-Oriented Architecture面向服务的架构】RPC+服务治理

  2. 2018年阿里巴巴把这个框架捐献给了Apache基金会,正式更名为Apache Dubbo。最新版本为Dubbo3.x Apache Dubbo是一款易用、高性能的WEB利框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。

  3. Dubbo3已在阿里巴巴内部微服务集群全面落地,成功取代运行多年的HSF框架。依托于Dubbo3,阿里提出了自己的微服务解决方案DNS(dubbo,nacos,sentinel)

dubbo默认端口

20880

# SOA

时至今日,SOA与微服务架构基本可以统一成一个概念了。 SOA其实就是单体架构演变成一直说的微服务,由原先单个整体的服务的,拆分成若干个独立的服务,并且通过网址之间可调用,还衍生出一些注册中心,配置中心,负载均衡等等 SOA

# Dubbo3 核心内容

  • 易用性 开箱即用易用性高,如Jva版本的面向接口代理特性能实现本地透明调用功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。更加完善了多语言支持(GO PYTHON RUST)超大规模微服务实践
    • 高性能通信 (Triple GRPC)
    • 高可扩展性 (SPI)多种序列化方式多种协议)
    • 丰富的服务治理能力
    • 超大规模集群勇例水平扩展

# 细节

  1. 协议端口 显示的指定端口在后期过多的服务之后,会造成遗忘端口到底有没有指定,dubbo提供了自的解决方法,-1,当端口被占用了自动+1,如20880被占用了就尝试使用20881,以此类推

# Hello World

# 依赖

# dubbo2依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.10</version>
</dependency>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-registry-nacos</artifactId>
    <version>2.7.10</version>
</dependency>

# dubbo3依赖


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

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
    </dependencies>

# Springcloud

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

# 接口

User就是一个账号和密码字段就不放出来了

public interface UserService {
    String login(User user);
}

# 提供者

提供者需要引入API的maven包

import com.gao.api.entity.User;
import com.gao.api.interfaces.UserService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class UserServiceImpl implements UserService {
    @Override
    public String login(User user) {
        System.out.println(user);
        return "success";
    }
}

# 配置

dubbo:
  application:
    name: provider-dubbo
    protocol: -1

spring:
  application:
    name: provider

# 消费者

同样需要引入API的maven包

import com.gao.api.entity.User;
import com.gao.api.interfaces.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/t")
public class TestController {

    @DubboReference(url = "dubbo://localhost:20880/com.gao.api.interfaces.UserService")
    private UserService userService;

    @GetMapping
    public String testLogin() {
        return userService.login(new User("zs", "123"));
    }
}

# 配置

qos-enable 解释

spring:
  application:
    name: consumer

dubbo:
  application:
    name: consumer
    qos-enable: false
server:
  port: 8999

# 可能出现问题

  1. JDK17与Dubbo3.1.x搭配使用会出现如下问题
    • JDK9之后深反射问题,需要通过 JVM参数配置解决
-Dio.netty.tryReflectionSetAccessible=true  
     --add-opens  
     java.base/jdk.internal.misc=ALL-UNNAMED  
     --add-opens  
     java.base/java.nio=ALL-UNNAMED  
     --add-opens  
     java.base/java.lang=ALL-UNNAMED
  • Dubbo3.2.0.beat4以前的版本使用的是Spring5.2.x不能支持JDK17会产生如下异常,Unsupported class file major version61【major61对应17】
    版本需要升级到Dubbo3.2.0.beat5以上版本
  1. ERROR org.apache.dubbo.qos.server.Server,Address already in use

Qos=Quality of Service,qos是Dubbot的在线运维命令,可以对服务进行动态的配置、控制及查询, Dubboo2.5.8新版本重构了telnet(telnet是从Dubbo2.0.5开始支持的)模块,提供了新的telnet命令支持,新 版本的telnet端口与dubbo协议的端口是不同的端口,默认为22222。正是因为这个问题:如果在一台服务器 里面,启动 porovider 时22222端口,而consumer启动时就会报错了。

解决办法:

#是否开启在线运维命令
dubbo.appligation.qos.enable=true
#不允许其他机器的访问
dubbo.application.qos.port=33333
#修改port
dubbo.application.qos.accept.foreign.ip=false