1. Dubbo概述与环境规划
Apache Dubbo是一款高性能的Java RPC框架,由阿里巴巴开源并贡献给Apache基金会。它提供了服务注册与发现、负载均衡、服务治理等功能,是微服务架构中的核心组件。更多学习教程www.fgedu.net.cn
1.1 Dubbo版本说明
Dubbo目前主要版本为3.3,本教程以Dubbo 3.3为例进行详细讲解。
$ cat /opt/dubbo/version.txt
Dubbo 3.3.0
# 查看服务状态
$ curl http://192.168.1.51:8080/dubbo/status
# 输出示例:
{“status”:”OK”,”version”:”3.3.0″}
1.2 环境规划
本次安装环境规划如下:
IP地址:192.168.1.51
Dubbo端口:20880
HTTP端口:8080
安装目录:/opt/dubbo
日志目录:/data/dubbo/logs
配置目录:/opt/dubbo/conf
Java环境:
JDK版本:OpenJDK 17
JAVA_HOME:/usr/lib/jvm/java-17
JVM堆大小:2GB
注册中心:
Nacos 2.4
地址:192.168.1.51:8848
1.3 Dubbo核心特性
1. 高性能RPC:基于Netty的高性能网络通信
2. 服务治理:服务注册、发现、路由、负载均衡
3. 多协议支持:支持Dubbo、REST、gRPC等协议
4. 多注册中心:支持Nacos、ZooKeeper、Redis等
5. 集群容错:支持Failover、Failfast、Failsafe等策略
6. 负载均衡:支持Random、RoundRobin、LeastActive等
7. 服务降级:支持Mock降级和熔断
8. 异步调用:支持异步和泛化调用
2. 硬件环境要求与检查
在安装Dubbo之前,需要对服务器硬件环境进行全面检查。学习交流加群风哥微信: itpux-com
2.1 最低硬件要求
CPU:2核心
内存:2GB
磁盘:10GB
推荐配置(生产环境):
CPU:4核心以上
内存:8GB以上
磁盘:50GB以上
高可用配置:
CPU:8核心以上
内存:16GB以上
磁盘:100GB以上
2.2 Java环境检查
$ java -version
openjdk version “17.0.9” 9.0.4
OpenJDK Runtime Environment (Temurin-17.0.9+9) (build 17.0.9+9)
OpenJDK 64-Bit Server VM (build 17.0.9+9, mixed mode, sharing)
# 检查JAVA_HOME
$ echo $JAVA_HOME
/usr/lib/jvm/java-17
# 查看Java安装路径
$ which java
/usr/bin/java
2.3 注册中心检查
$ curl http://192.168.1.51:8848/nacos/v1/console/health/readiness
# 输出示例:
{“status”:”UP”}
# 检查ZooKeeper状态(如使用ZooKeeper)
$ echo “stat” | nc 192.168.1.51 2181
# 输出示例:
Zookeeper version: 3.8.3
Clients: 1
2.4 系统环境检查
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.8 (Ootpa)
# 检查内存信息
# free -h
total used free shared buff/cache available
Mem: 15Gi 1.0Gi 13Gi 256Mi 1.0Gi 14Gi
Swap: 7Gi 0B 7Gi
# 检查磁盘空间
# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg_system-lv_root 100G 5.0G 95G 5% /
/dev/mapper/vg_data-lv_data 500G 50G 450G 10% /data
3. Dubbo安装步骤
本节详细介绍Dubbo 3.3的安装过程。学习交流加群风哥QQ113257174
3.1 创建用户和目录
# groupadd -g 1011 dubbo
# useradd -u 1011 -g dubbo -d /opt/dubbo -s /bin/bash dubbo
# passwd dubbo
# 创建目录
# mkdir -p /opt/dubbo
# mkdir -p /data/dubbo/{logs,data}
# 设置目录权限
# chown -R dubbo:dubbo /opt/dubbo
# chown -R dubbo:dubbo /data/dubbo
3.2 下载Dubbo Admin
# cd /usr/local/src
# 下载Dubbo Admin
# wget https://github.com/apache/dubbo-admin/releases/download/0.6.0/dubbo-admin-0.6.0.jar
# 复制到安装目录
# cp dubbo-admin-0.6.0.jar /opt/dubbo/
# 设置目录权限
# chown -R dubbo:dubbo /opt/dubbo
# 验证安装
$ ls -la /opt/dubbo/
总用量 51200
-rw-r–r–. 1 dubbo dubbo 52428800 4月 4 10:00 dubbo-admin-0.6.0.jar
3.3 配置环境变量
$ vi ~/.bash_profile
# 添加以下内容
export DUBBO_HOME=/opt/dubbo
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
$ source ~/.bash_profile
# 验证环境变量
$ echo $DUBBO_HOME
/opt/dubbo
3.4 配置Dubbo Admin
$ vi /opt/dubbo/application.properties
# 添加以下配置
# 服务端口
server.port=8080
# 注册中心配置
dubbo.registry.address=nacos://192.168.1.51:8848
dubbo.registry.parameters.namespace=fgedu-namespace
# 元数据中心配置
dubbo.metadata-report.address=nacos://192.168.1.51:8848
# 配置中心
dubbo.config-center.address=nacos://192.168.1.51:8848
# Admin配置
admin.check.authority=true
admin.root.user.name=admin
admin.root.user.password=fgedu123
# 日志配置
logging.level.root=INFO
logging.file.name=/data/dubbo/logs/dubbo-admin.log
3.5 启动Dubbo Admin
$ java -jar /opt/dubbo/dubbo-admin-0.6.0.jar –spring.config.location=/opt/dubbo/application.properties &
# 输出示例:
Starting Dubbo Admin…
Dubbo Admin started successfully.
# 检查端口
$ netstat -tlnp | grep java
tcp6 0 0 :::8080 :::* LISTEN 12345/java
# 检查服务状态
$ curl http://192.168.1.51:8080/dubbo/status
# 输出示例:
{“status”:”OK”,”version”:”3.3.0″}
3.6 配置防火墙
# firewall-cmd –permanent –add-port=8080/tcp
success
# firewall-cmd –permanent –add-port=20880/tcp
success
# firewall-cmd –reload
success
# 访问管理界面
# 浏览器访问: http://192.168.1.51:8080
# 默认用户名: admin
# 默认密码: fgedu123
4. Dubbo参数配置
Dubbo参数配置是性能优化的关键步骤,直接影响系统性能。更多学习教程公众号风哥教程itpux_com
4.1 服务提供者配置
# application.yml配置
dubbo:
application:
name: fgedu-provider
qos-enable: false
registry:
address: nacos://192.168.1.51:8848
parameters:
namespace: fgedu-namespace
protocol:
name: dubbo
port: 20880
threads: 200
iothreads: 4
dispatcher: all
provider:
timeout: 5000
retries: 2
loadbalance: roundrobin
async: false
metadata-report:
address: nacos://192.168.1.51:8848
config-center:
address: nacos://192.168.1.51:8848
# 服务实现
@DubboService(version = “1.0.0”, timeout = 5000, retries = 2)
public class FgeduServiceImpl implements FgeduService {
@Override
public String sayHello(String name) {
return “Hello, ” + name;
}
}
4.2 服务消费者配置
dubbo:
application:
name: fgedu-consumer
qos-enable: false
registry:
address: nacos://192.168.1.51:8848
parameters:
namespace: fgedu-namespace
consumer:
timeout: 5000
retries: 2
loadbalance: roundrobin
check: false
metadata-report:
address: nacos://192.168.1.51:8848
config-center:
address: nacos://192.168.1.51:8848
# 服务引用
@DubboReference(version = “1.0.0”, timeout = 5000, retries = 2)
private FgeduService fgeduService;
public String callService() {
return fgeduService.sayHello(“World”);
}
4.3 协议配置
dubbo:
protocol:
name: dubbo
port: 20880
host: 192.168.1.51
threads: 200
iothreads: 4
dispatcher: all
payload: 8388608
buffer: 8192
heartbeat: 60000
# REST协议配置
dubbo:
protocol:
name: rest
port: 8081
server: netty
# gRPC协议配置
dubbo:
protocol:
name: grpc
port: 50051
# 多协议配置
dubbo:
protocols:
– id: dubbo
name: dubbo
port: 20880
– id: rest
name: rest
port: 8081
5. 服务开发与部署
Dubbo提供了完善的服务开发框架,本节介绍常用的开发方法。from:www.itpux.com
5.1 服务接口定义
public interface FgeduService {
String sayHello(String name);
User getUser(Long id);
List
void updateUser(User user);
}
# 定义数据模型
@Data
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
private String email;
}
@Data
public class UserQuery implements Serializable {
private String name;
private Integer minAge;
private Integer maxAge;
}
5.2 服务实现
@DubboService(
version = “1.0.0”,
timeout = 5000,
retries = 2,
loadbalance = “roundrobin”,
cluster = “failover”,
mock = “return null”
)
public class FgeduServiceImpl implements FgeduService {
@Autowired
private UserRepository userRepository;
@Override
public String sayHello(String name) {
return “Hello, ” + name + “! Welcome to Dubbo.”;
}
@Override
public User getUser(Long id) {
return userRepository.findById(id);
}
@Override
public List
return userRepository.findByQuery(query);
}
@Override
public void updateUser(User user) {
userRepository.update(user);
}
}
# 启动类
@SpringBootApplication
@EnableDubbo
public class FgeduProviderApplication {
public static void main(String[] args) {
SpringApplication.run(FgeduProviderApplication.class, args);
}
}
5.3 服务消费
@RestController
@RequestMapping(“/api”)
public class FgeduController {
@DubboReference(
version = “1.0.0”,
timeout = 5000,
retries = 2,
loadbalance = “roundrobin”,
mock = “com.fgedu.service.mock.FgeduServiceMock”
)
private FgeduService fgeduService;
@GetMapping(“/hello”)
public String hello(@RequestParam String name) {
return fgeduService.sayHello(name);
}
@GetMapping(“/user/{id}”)
public User getUser(@PathVariable Long id) {
return fgeduService.getUser(id);
}
@GetMapping(“/users”)
public List
return fgeduService.listUsers(query);
}
}
# Mock降级实现
public class FgeduServiceMock implements FgeduService {
@Override
public String sayHello(String name) {
return “Mock: Hello, ” + name;
}
@Override
public User getUser(Long id) {
User user = new User();
user.setId(id);
user.setName(“Mock User”);
return user;
}
}
6. 集群配置
Dubbo支持多种集群容错策略,本节介绍常用的集群配置方法。更多学习教程www.fgedu.net.cn
6.1 集群容错策略
# 失败自动切换,重试其他服务器
@DubboService(cluster = “failover”, retries = 2)
# Failfast Cluster
# 快速失败,只发起一次调用
@DubboService(cluster = “failfast”)
# Failsafe Cluster
# 失败安全,出现异常直接忽略
@DubboService(cluster = “failsafe”)
# Failback Cluster
# 失败自动恢复,后台记录失败请求定时重发
@DubboService(cluster = “failback”)
# Forking Cluster
# 并行调用多个服务器,一个成功即返回
@DubboService(cluster = “forking”, forks = 3)
# Broadcast Cluster
# 广播调用所有提供者,逐个调用
@DubboService(cluster = “broadcast”)
6.2 负载均衡策略
# 随机,按权重设置随机概率
@DubboService(loadbalance = “random”, weight = 100)
# RoundRobin LoadBalance
# 轮询,按公约后的权重设置轮询比率
@DubboService(loadbalance = “roundrobin”)
# LeastActive LoadBalance
# 最少活跃调用数,使慢的提供者收到更少请求
@DubboService(loadbalance = “leastactive”)
# ConsistentHash LoadBalance
# 一致性Hash,相同参数的请求总是发到同一提供者
@DubboService(loadbalance = “consistenthash”, arguments = {0})
# 配置示例
@DubboService(
version = “1.0.0”,
cluster = “failover”,
loadbalance = “roundrobin”,
retries = 2,
timeout = 5000
)
public class FgeduServiceImpl implements FgeduService {
// …
}
6.3 多注册中心配置
dubbo:
registries:
nacos1:
address: nacos://192.168.1.51:8848
default: true
nacos2:
address: nacos://192.168.1.52:8848
zookeeper:
address: zookeeper://192.168.1.53:2181
# 服务注册到指定注册中心
@DubboService(registry = {“nacos1”, “nacos2”})
# 服务订阅指定注册中心
@DubboReference(registry = “nacos1”)
7. 安全配置
Dubbo提供了基本的安全框架,本节介绍常用的安全配置方法。学习交流加群风哥微信: itpux-com
7.1 配置认证
dubbo:
provider:
token: true
# 或指定token值
# token: fgedu-token-123
# 客户端认证配置
dubbo:
consumer:
token: fgedu-token-123
# 使用注解配置
@DubboService(token = “fgedu-token-123”)
# 配置TLS
dubbo:
protocol:
ssl-enabled: true
ssl:
enabled: true
key-store-path: /opt/dubbo/ssl/server.jks
key-store-password: fgedu123
trust-store-path: /opt/dubbo/ssl/truststore.jks
trust-store-password: fgedu123
7.2 访问控制
dubbo:
provider:
# 白名单
accepts: 192.168.1.0/24,10.0.0.0/8
# 黑名单
excludes: 192.168.1.100
# 使用路由规则
# 在Dubbo Admin中配置路由规则
# 条件路由:
# => host != 192.168.1.100
# 标签路由:
# => tag = gray
# 配置访问日志
dubbo:
protocol:
accesslog: /data/dubbo/logs/access.log
8. 监控与日志
Dubbo提供了完善的监控和日志功能,本节介绍常用的监控配置方法。更多学习教程公众号风哥教程itpux_com
8.1 Dubbo Admin控制台
# 浏览器访问: http://192.168.1.51:8080
# 主要功能:
# – 服务查询:查看服务提供者和消费者
# – 服务详情:查看服务元数据和方法
# – 路由规则:配置条件路由和标签路由
# – 动态配置:配置动态参数
# – 负载均衡:调整服务权重
# – 服务测试:在线测试服务
# 查看服务列表
$ curl http://192.168.1.51:8080/api/services
# 输出示例:
[
{
“service”: “com.fgedu.service.FgeduService:1.0.0”,
“appName”: “fgedu-provider”,
“providerCount”: 2,
“consumerCount”: 5
}
]
8.2 监控指标
dubbo:
metrics:
protocol: prometheus
port: 20882
enable: true
# 访问指标端点
$ curl http://192.168.1.51:20882/metrics
# 输出示例:
# HELP dubbo_provider_requests_total Total requests
# TYPE dubbo_provider_requests_total counter
dubbo_provider_requests_total{service=”FgeduService”,method=”sayHello”} 1000
# HELP dubbo_provider_requests_seconds Request duration
# TYPE dubbo_provider_requests_seconds summary
dubbo_provider_requests_seconds{service=”FgeduService”,method=”sayHello”,quantile=”0.5″} 0.005
# 配置Prometheus采集
# vi /etc/prometheus/prometheus.yml
scrape_configs:
– job_name: ‘dubbo’
static_configs:
– targets: [‘192.168.1.51:20882’, ‘192.168.1.52:20882’]
8.3 日志配置
dubbo:
application:
logger: slf4j
protocol:
accesslog: /data/dubbo/logs/access.log
# logback配置
$ vi /opt/dubbo/conf/logback.xml
# 查看日志
$ tail -f /data/dubbo/logs/dubbo.log
# 输出示例:
2026-04-04 10:00:00,000 [main] INFO o.a.d.c.s.DubboBootstrap – Dubbo Bootstrap is starting…
2026-04-04 10:00:01,000 [main] INFO o.a.d.c.s.DubboBootstrap – Dubbo Bootstrap started successfully
9. 升级与迁移
Dubbo升级和迁移是运维工作中的重要环节,需要仔细规划和执行。from:www.itpux.com
9.1 版本升级
$ cat /opt/dubbo/version.txt
Dubbo 3.3.0
# 备份配置
$ cp -r /opt/dubbo/conf /backup/dubbo/conf_$(date +%Y%m%d)
# 停止服务
$ pkill -f dubbo-admin
# 下载新版本
# wget https://github.com/apache/dubbo-admin/releases/download/0.7.0/dubbo-admin-0.7.0.jar
# 替换jar包
$ mv dubbo-admin-0.6.0.jar dubbo-admin-0.6.0.jar.bak
$ cp dubbo-admin-0.7.0.jar /opt/dubbo/
# 启动新版本
$ java -jar dubbo-admin-0.7.0.jar –spring.config.location=/opt/dubbo/application.properties &
# 验证版本
$ curl http://192.168.1.51:8080/dubbo/status
{“status”:”OK”,”version”:”3.4.0″}
9.2 服务迁移
# 1. 新服务注册到新注册中心
dubbo:
registry:
address: nacos://192.168.1.52:8848
# 2. 配置双注册
dubbo:
registries:
old:
address: nacos://192.168.1.51:8848
new:
address: nacos://192.168.1.52:8848
# 3. 服务双注册
@DubboService(registry = {“old”, “new”})
# 4. 消费者切换注册中心
@DubboReference(registry = “new”)
# 5. 下线旧服务
# 停止旧服务提供者
# 6. 清理旧注册中心
# 删除旧注册中心的服务注册信息
10. 生产环境实战案例
本节提供一个完整的生产环境配置案例,帮助读者更好地理解Dubbo的实际应用。更多学习教程www.fgedu.net.cn
10.1 生产环境完整配置
$ vi /opt/dubbo/application.yml
dubbo:
application:
name: fgedu-provider
logger: slf4j
qos-enable: false
shutwait: 10000
registry:
address: nacos://192.168.1.51:8848,192.168.1.52:8848,192.168.1.53:8848
parameters:
namespace: fgedu-namespace
check: false
protocol:
name: dubbo
port: 20880
host: 192.168.1.51
threads: 500
iothreads: 8
dispatcher: all
payload: 16777216
buffer: 32768
heartbeat: 60000
accesslog: /data/dubbo/logs/access.log
provider:
timeout: 5000
retries: 2
loadbalance: roundrobin
cluster: failover
async: false
executes: 500
actives: 100
metadata-report:
address: nacos://192.168.1.51:8848
config-center:
address: nacos://192.168.1.51:8848
metrics:
protocol: prometheus
port: 20882
enable: true
# JVM参数
JAVA_OPTS=”-server -Xms2g -Xmx2g -Xmn1g”
JAVA_OPTS=”${JAVA_OPTS} -XX:+UseG1GC -XX:MaxGCPauseMillis=200″
JAVA_OPTS=”${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError”
# 创建systemd服务
$ vi /etc/systemd/system/dubbo-provider.service
[Unit]
Description=Dubbo Provider
After=network.target
[Service]
Type=simple
User=dubbo
Group=dubbo
ExecStart=/usr/bin/java ${JAVA_OPTS} -jar /opt/dubbo/fgedu-provider.jar
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 启用服务
# systemctl enable dubbo-provider
# systemctl start dubbo-provider
10.2 高可用集群部署
# Provider节点
# 192.168.1.51:20880
# 192.168.1.52:20880
# 192.168.1.53:20880
# 注册中心(Nacos集群)
# 192.168.1.51:8848
# 192.168.1.52:8848
# 192.168.1.53:8848
# 配置多注册中心
dubbo:
registries:
nacos1:
address: nacos://192.168.1.51:8848
nacos2:
address: nacos://192.168.1.52:8848
nacos3:
address: nacos://192.168.1.53:8848
# 服务多注册
@DubboService(
registry = {“nacos1”, “nacos2”, “nacos3”},
version = “1.0.0”,
cluster = “failover”,
loadbalance = “roundrobin”
)
10.3 性能调优实战
# vi /etc/sysctl.d/99-dubbo.conf
# 网络优化
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 使配置生效
# sysctl -p /etc/sysctl.d/99-dubbo.conf
# JVM优化
JAVA_OPTS=”-server -Xms4g -Xmx4g -Xmn2g”
JAVA_OPTS=”${JAVA_OPTS} -XX:+UseG1GC -XX:MaxGCPauseMillis=200″
JAVA_OPTS=”${JAVA_OPTS} -XX:InitiatingHeapOccupancyPercent=35″
JAVA_OPTS=”${JAVA_OPTS} -XX:+ParallelRefProcEnabled”
# Dubbo协议优化
dubbo:
protocol:
threads: 500
iothreads: 8
dispatcher: all
payload: 16777216
buffer: 32768
heartbeat: 60000
serialization: hessian2
optimizer: com.fgedu.SerializationOptimizerImpl
# Netty优化
dubbo:
protocol:
transporter: netty4
server: netty4
client: netty4
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
