# Dubbo
# 历史
早期Dubbo的定位 基于JAVA的高性能,轻量续RPC框架 【high-performance,lightweight.Java-based RPC framework】 SOA【Service-Oriented Architecture面向服务的架构】RPC+服务治理
2018年阿里巴巴把这个框架捐献给了Apache基金会,正式更名为Apache Dubbo。最新版本为Dubbo3.x Apache Dubbo是一款易用、高性能的WEB利框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。
Dubbo3已在阿里巴巴内部微服务集群全面落地,成功取代运行多年的HSF框架。依托于Dubbo3,阿里提出了自己的微服务解决方案DNS(dubbo,nacos,sentinel)
dubbo默认端口
20880
# SOA
时至今日,SOA与微服务架构基本可以统一成一个概念了。
SOA其实就是单体架构演变成一直说的微服务,由原先单个整体的服务的,拆分成若干个独立的服务,并且通过网址之间可调用,还衍生出一些注册中心,配置中心,负载均衡等等
# Dubbo3 核心内容
- 易用性
开箱即用易用性高,如Jva版本的面向接口代理特性能实现本地透明调用功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。更加完善了多语言支持(GO PYTHON RUST)超大规模微服务实践
- 高性能通信 (Triple GRPC)
- 高可扩展性 (SPI)多种序列化方式多种协议)
- 丰富的服务治理能力
- 超大规模集群勇例水平扩展
# 细节
- 协议端口 显示的指定端口在后期过多的服务之后,会造成遗忘端口到底有没有指定,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"));
}
}
# 配置
spring:
application:
name: consumer
dubbo:
application:
name: consumer
qos-enable: false
server:
port: 8999
# 可能出现问题
- 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以上版本
- 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