Dubbo 全面解析:从 RPC 核心到服务治理实践
一、分布式系统与 RPC 框架概述
在当今互联网时代,随着业务规模的不断扩大,单体架构已经无法满足高并发、高可用的需求,分布式系统架构成为主流选择。而在分布式系统中,远程服务调用(Remote Procedure Call,RPC)是实现服务间通信的关键技术。
1.1 RPC 框架的核心价值
RPC 框架的核心价值在于它让开发者能够像调用本地方法一样调用远程服务,隐藏了底层网络通信的复杂性。一个成熟的 RPC 框架通常需要解决以下关键问题:
- 服务发现:消费者如何发现提供者的地址
- 负载均衡:如何在多个提供者之间分配请求
- 容错机制:调用失败时如何处理
- 序列化协议:如何高效地进行数据传输
- 网络通信:如何建立高效的网络连接
1.2 Dubbo 的发展历程
Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,其发展历程可谓一波三折:
- 2011年:阿里巴巴开源 Dubbo
- 2014年:停止维护,进入"休眠期"
- 2017年:阿里巴巴重启维护并捐献给 Apache 基金会
- 2018年:成为 Apache 顶级项目
- 2019年至今:持续迭代,融入云原生生态
目前 Dubbo 已经发展到 3.x 版本,全面拥抱云原生,支持 Triple 协议(基于 HTTP/2)、应用级服务发现等新特性。
二、Dubbo 核心架构与快速入门
2.1 Dubbo 架构解析
Dubbo 的核心架构采用了分层设计,各层之间松耦合,可以灵活替换实现:
+-------------------+ +-------------------+
| Consumer | | Provider |
+-------------------+ +-------------------+
| Stub | | Stub |
+-------------------+ +-------------------+
| Cluster Layer | | Protocol Layer |
+-------------------+ +-------------------+
| Registry | | Registry |
+-------------------+ +-------------------+
| Monitor | | Monitor |
+-------------------+ +-------------------+
| Config Layer | | Config Layer |
+-------------------+ +-------------------+
各层核心职责:
- Config 层:配置管理,支持 API、XML、注解等多种方式
- Proxy 层:服务代理,生成客户端存根(Stub)和服务端骨架(Skeleton)
- Registry 层:服务注册与发现
- Cluster 层:集群容错、负载均衡、路由等
- Monitor 层:监控调用次数和调用时间
- Protocol 层:远程调用协议,如 Dubbo、HTTP、Triple 等
- Transport 层:网络传输,如 Netty、Mina 等
- Serialize 层:数据序列化,如 Hessian、JSON、Kryo 等
2.2 快速搭建 Dubbo 服务
下面我们通过一个完整的示例演示如何快速搭建 Dubbo 服务。
2.2.1 环境准备
- JDK 1.8+
- Maven 3.5+
- Zookeeper(作为注册中心)
2.2.2 项目结构
dubbo-demo
├── dubbo-demo-api -- 接口定义
├── dubbo-demo-provider -- 服务提供者
└── dubbo-demo-consumer -- 服务消费者
2.2.3 定义服务接口
// 在 dubbo-demo-api 模块中
public interface GreetingService {String sayHello(String name);CompletableFuture<String> sayHelloAsync(String name);
}
2.2.4 服务提供者实现
// 在 dubbo-demo-provider 模块中
@Service
public class GreetingServiceImpl implements GreetingService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}@Overridepublic CompletableFuture<String> sayHelloAsync(String name) {return CompletableFuture.supplyAsync(() -> "Hello, " + name);}
}
2.2.5 提供者配置
<!-- application.yml -->
dubbo:application:name: dubbo-demo-providerprotocol:name: dubboport: 20880registry:address: zookeeper://127.0.0.1:2181scan:base-packages: com.example.service.impl
2.2.6 消费者配置
<!-- application.yml -->
dubbo:application:name: dubbo-demo-consumerregistry:address: zookeeper://127.0.0.1:2181consumer:check: false
2.2.7 消费者调用
@RestController
public class GreetingController {@DubboReferenceprivate GreetingService greetingService;@GetMapping("/greet")public String greet(String name) {return greetingService.sayHello(name);}@GetMapping("/greetAsync")public CompletableFuture<String> greetAsync(String name) {return greetingService.sayHelloAsync(name);}
}
2.3 Dubbo 的核心配置
Dubbo 支持多种配置方式,包括 XML、注解、API 和 Spring Boot 配置。以下是常见的配置项:
-
服务提供者配置
dubbo.application.name:应用名称dubbo.protocol.name:协议名称dubbo.protocol.port:服务端口dubbo.registry.address:注册中心地址dubbo.provider.timeout:默认超时时间
-
服务消费者配置
dubbo.consumer.check:启动时检查提供者是否可用dubbo.consumer.timeout:调用超时时间dubbo.consumer.retries:失败重试次数
三、Dubbo 高级特性与原理
3.1 Dubbo 的线程模型
Dubbo 的线程模型对性能有重要影响,主要包括两种线程:
- IO 线程:处理网络请求,默认使用 Netty 的 EventLoopGroup
- 业务线程:执行服务逻辑,可配置线程池
配置示例:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="200"/>
线程模型选项:
-
dispatcher:消息分发策略all:所有消息都派发到线程池direct:所有消息都不派发到线程池message:只有请求消息派发到线程池execution:只有普通请求派发到线程池connection:在IO线程上执行连接断开事件
-
threadpool:线程池类型fixed:固定大小线程池cached:缓存线程池limited:可伸缩线程池eager:优先创建线程
3.2 Dubbo 的序列化机制
Dubbo 支持多种序列化协议,可以通过 serialization 参数配置:
- hessian2(默认):性能较好,兼容性佳
- fastjson:文本协议,可读性好
- kryo:高性能二进制协议
- fst:比 kryo 更高效的序列化
- protobuf:跨语言,高效二进制协议
性能对比(数据来自 Dubbo 官方测试):
| 序列化方式 | 序列化大小 | 序列化时间 | 反序列化时间 |
|---|---|---|---|
| kryo | 217 | 1364 | 1157 |
| fst | 217 | 1476 | 1561 |
| hessian2 | 313 | 2441 | 2547 |
| fastjson | 433 | 2441 | 2547 |
3.3 Dubbo 的通信协议
Dubbo 支持多种通信协议,可以通过 protocol 配置:
- dubbo(默认):基于 Netty 的二进制协议,性能最佳
- tri:Dubbo 3 新增的基于 HTTP/2 的协议,兼容 gRPC
- http:基于 HTTP 的文本协议
- rest:RESTful 风格协议
- grpc:gRPC 协议
协议选择建议:
- 内部服务调用:优先使用 dubbo 协议
- 需要跨语言或云原生环境:考虑 tri 或 grpc 协议
- 需要 RESTful 接口:使用 rest 协议
3.4 Dubbo 的异步调用
Dubbo 提供了多种异步编程方式:
3.4.1 使用 CompletableFuture
// 接口定义
public interface UserService {CompletableFuture<User> getUserAsync(Long id);
}// 调用方式
userService.getUserAsync(1L).whenComplete((user, throwable) -> {if (throwable != null) {// 处理异常} else {// 处理结果}
});
3.4.2 使用 AsyncContext
// 服务提供者
public class UserServiceImpl implements UserService {public User getUser(Long id) {AsyncContext asyncContext = RpcContext.startAsync();new Thread(() -> {asyncContext.signalContextSwitch();// 执行耗时操作User user = loadFromDatabase(id);asyncContext.write(user);}).start();return null;}
}
3.4.3 消费者端异步调用
// 配置异步
@DubboReference(async = true)
private UserService userService;// 调用方式
UserService userService = ...;
Future<User> future = RpcContext.getContext().asyncCall(() -> userService.getUser(1L));
User user = future.get();
四、Dubbo 服务治理
服务治理是 Dubbo 的核心能力之一,主要包括负载均衡、集群容错、服务降级等功能。
4.1 负载均衡策略
Dubbo 提供了丰富的负载均衡策略,可以通过 loadbalance 参数配置:
-
Random LoadBalance(默认):随机访问
- 优点:简单高效
- 缺点:可能不均匀
-
RoundRobin LoadBalance:轮询
- 优点:请求均匀分配
- 缺点:慢提供者会堆积请求
-
LeastActive LoadBalance:最少活跃调用
- 优点:使慢提供者收到更少请求
- 缺点:需要统计活跃数
-
ConsistentHash LoadBalance:一致性哈希
- 优点:相同参数总是发到同一提供者
- 缺点:节点变化时可能不均匀
配置示例:
@DubboReference(loadbalance = "leastactive")
private UserService userService;
4.2 集群容错机制
Dubbo 的集群容错机制可以通过 cluster 参数配置:
-
Failover Cluster(默认):失败自动切换
- 特点:失败后重试其他服务器
- 适用场景:读操作或幂等写操作
-
Failfast Cluster:快速失败
- 特点:失败立即报错
- 适用场景:非幂等写操作
-
Failsafe Cluster:失败安全
- 特点:失败直接忽略
- 适用场景:写入日志等不关键操作
-
Failback Cluster:失败自动恢复
- 特点:失败后定时重发
- 适用场景:消息通知等
-
Forking Cluster:并行调用
- 特点:同时调用多个服务器,只要一个成功即返回
- 适用场景:实时性要求高的读操作
-
Broadcast Cluster:广播调用
- 特点:广播调用所有提供者,任意一台报错则报错
- 适用场景:通知所有提供者更新缓存或日志等
配置示例:
@DubboReference(cluster = "failfast")
private OrderService orderService;
4.3 服务降级与熔断
Dubbo 提供了多种服务降级方式:
4.3.1 Mock 机制
@DubboReference(mock = "force:return null")
private UserService userService;// 或者实现 Mock 类
@DubboReference(mock = "com.example.UserServiceMock")
private UserService userService;public class UserServiceMock implements UserService {public User getUser(Long id) {return new User(-1L, "mock user");}
}
4.3.2 熔断策略
Dubbo 可以与 Sentinel 或 Hystrix 集成实现熔断:
<!-- 使用 Sentinel -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-apache-dubbo-adapter</artifactId>
</dependency>
配置示例:
// 资源定义
@SentinelResource(value = "UserService:getUser", fallback = "getUserFallback")
public User getUser(Long id) {// ...
}// fallback 方法
public User getUserFallback(Long id, Throwable ex) {return new User(-1L, "fallback user");
}
4.4 动态配置中心
Dubbo 2.7+ 支持从配置中心(如 Nacos、Apollo、Zookeeper)动态获取配置:
dubbo:config-center:address: nacos://127.0.0.1:8848app-name: dubbo-demo
动态配置示例:
# 在 Nacos 中配置
configVersion: v1.0
configs:
- side: consumeraddresses: ["0.0.0.0"]parameters:timeout: 3000loadbalance: random
五、Dubbo 3 新特性
Dubbo 3 是 Dubbo 的重大升级版本,引入了许多创新特性:
5.1 应用级服务发现
传统 Dubbo 使用接口级服务发现,而 Dubbo 3 引入了应用级服务发现:
- 接口级服务发现:每个接口独立注册,消费者按接口订阅
- 应用级服务发现:整个应用注册一次,消费者订阅应用
优势:
- 注册中心压力降低 90%
- 服务发现效率提升
- 更适合 Kubernetes 等现代基础设施
配置方式:
dubbo:registry:address: nacos://127.0.0.1:8848parameters:registry-type: service
5.2 Triple 协议
Triple 是 Dubbo 3 引入的基于 HTTP/2 的协议,具有以下特点:
- 完全兼容 gRPC
- 支持 Streaming 通信
- 更好的网关穿透性
- 支持多语言生态
配置示例:
dubbo:protocols:triple:name: triport: 50051
5.3 服务网格支持
Dubbo 3 提供了对服务网格的更好支持:
- 可以运行在 Istio 等 Service Mesh 中
- 支持 xDS 协议
- 支持与 Sidecar 模式共存
5.4 统一路由规则
Dubbo 3 重构了路由规则系统:
# 条件路由示例
configVersion: v3.0
scope: application
key: demo-provider
enabled: true
configs:
- addresses: ["127.0.0.1"]side: consumerparameters:timeout: 1000
六、Dubbo 最佳实践
6.1 性能优化建议
-
序列化优化
- 使用 kryo 或 fst 序列化
- 注册需要序列化的类:
dubbo.protocol.serialization.optimizer
-
线程池调优
- 合理设置线程数:
dubbo.protocol.threads - 使用
eager线程池:dubbo.protocol.threadpool=eager
- 合理设置线程数:
-
网络连接优化
- 启用连接共享:
dubbo.consumer.shareconnections=true - 合理设置连接数:
dubbo.consumer.connections
- 启用连接共享:
-
合理设置超时
- 避免过长或过短的超时时间
- 区分重要操作和非重要操作
6.2 常见问题排查
-
服务找不到问题
- 检查注册中心是否正常
- 检查服务版本和分组是否匹配
- 使用
telnet测试服务提供者
-
调用超时问题
- 检查网络是否通畅
- 检查服务提供者性能
- 合理设置超时时间
-
序列化问题
- 检查是否所有参数都可序列化
- 检查消费者和提供者是否有相同的类
6.3 监控与运维
- 集成 Prometheus
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metrics-prometheus</artifactId>
</dependency>
配置:
dubbo:metrics:protocol: prometheusport: 9090enable: true
- 使用 Dubbo Admin
Dubbo Admin 是官方提供的管理控制台,可以:
- 查看服务列表
- 管理配置
- 执行测试
- 查看依赖关系
七、总结
Dubbo 作为一款成熟的 RPC 框架,在阿里巴巴和众多企业的生产环境中得到了充分验证。通过本文的全面介绍,我们了解了:
- Dubbo 的核心架构和基本用法
- 高级特性和实现原理
- 服务治理的各种策略
- Dubbo 3 的创新特性
- 生产环境的最佳实践
随着云原生时代的到来,Dubbo 3 通过应用级服务发现、Triple 协议等创新,正在焕发新的活力。无论是传统的微服务架构,还是新兴的服务网格,Dubbo 都能提供优秀的解决方案。
对于开发者来说,深入理解 Dubbo 的原理和最佳实践,将有助于构建高性能、高可用的分布式系统。希望本文能成为你 Dubbo 学习之旅的有力参考。
PS:如果你在学习过程中遇到问题,别担心!欢迎在评论区留言,我会尽力帮你解决!😄
相关文章:
Dubbo 全面解析:从 RPC 核心到服务治理实践
一、分布式系统与 RPC 框架概述 在当今互联网时代,随着业务规模的不断扩大,单体架构已经无法满足高并发、高可用的需求,分布式系统架构成为主流选择。而在分布式系统中,远程服务调用(Remote Procedure Call࿰…...
路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!
路由选型终极对决:直连/静态/动态三大类型华为华三思科配置差异,一张表彻底讲透! 一、路由:互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为(Huawei)华三&a…...
[微信小程序]对接sse接口
[微信小程序]对接sse接口 在uni开发中,在微信小程序中实现sse接口请求 相关连接 微信小程序对接SSE接口记录 uni中实现sse代码 注意的坑点 接收的并不是字符串,而是ArrayBuffer模拟流推送并不是流推送,会有data:字符扰乱推送并不是完全按照…...
01 相机标定与相机模型介绍
学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...
【商城实战(72)】解锁用户评价与晒单功能开发秘籍
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
2025.03.27【基因分析新工具】| MAST:解锁基因表达差异分析与网络构建
文章目录 1. MAST工具简介:探索生物信息分析的新利器1.1 什么是MAST工具?1.2 MAST工具的优势1.3 MAST工具的应用场景 2. MAST的安装方法:轻松入门的第一步2.1 安装R语言环境2.2 安装MAST包2.3 安装依赖库 3. MAST常用命令:掌握数据…...
浅谈WebSocket-FLV
FLV是一种视频数据封装格式,这种封装被标准通信协议HTTP-FLV和RTMP协议应用。 而WebSocket-FLV是一种非标的FLV封装数据从后端发送到前端的一种方式。 在WebSocket的url请求中,包含了需要请求设备的视频相关信息,在视频数据到达时,…...
SICAR标准 汽车焊装生产线触摸屏操作说明
目录 SIMATIC HMI 是西门子工业自动化解决方案的核心组件,支持实时设备监控与交互,文档中展示了其在焊装生产线中以SICAR标准为基础的具体应用,包括车型切换(如 AY2/A26)、KMC 夹具配置及能源效率分析,适用…...
CentOS 7 磁盘及分区管理笔记
一、查看磁盘信息 1. lsblk 命令 作用:列出系统中所有的块设备(包括磁盘、分区等)及其相关信息,如设备名称、大小、类型等。 命令格式:lsblk 示例: lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sd…...
Unity Standard Shader 解析(一)之ForwardBase(标准版)
一、ForwardBase // Base forward pass (directional light, emission, lightmaps, ...)Pass{Name "FORWARD"Tags { "LightMode" "ForwardBase" }Blend [_SrcBlend] [_DstBlend]ZWrite [_ZWrite]CGPROGRAM#pragma target 3.0// --------------…...
关于bug总结记录
1、vs中出现bug error C1083:无法打开文件 链接:vs中出现bug error C1083:无法打开文件_vs20151083错误解决方法-CSDN博客 2、 VS小技巧:系统却提示:示msvcp120.dll丢失 链接:VS小技巧:系统却提示:示msvc…...
go - grpc入门
前期准备 工具安装及使用 grpc开发 编写proto文件 proto文件是符合Protocol Buffers语言规范的数据交换协议文件,就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了,这里创建一个名为 hello.proto 的文件,放到项目的pr…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
鸿蒙-全屏播放页面(使用相对布局)---持续更新中
最终实现效果图: 实现步骤 创建FullScreenPlay.ets全品播放页面 并将其修改为启动页面。 全屏播放,屏幕必然横过来,所以要将窗口横过来。 编辑 src/main/ets/entryability/EntryAbility.ets 若写在/EntryAbility.ets中,则所有…...
全面讲解python的uiautomation包
在常规的模拟鼠标和键盘操作,我们一般使用pyautogui,uiautomation模块不仅能直接支持这些操作,还能通过控件定位方式直接定位到目标控件的位置,而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…...
CentOS 7 源码安装libjsoncpp-1.9.5库
安装依赖工具 sudo yum install cmake make gcc cmake 需要升级至 3.8.0 以上可参考:CentOS安装CMakegcc 需要升级至9.0 以上可参考:CentOS 7升级gcc版本 下载源码 wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.5.…...
备赛蓝桥杯之第十六届模拟赛第1期职业院校组第五题:回忆画廊
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
闭包、装饰器学习笔记(第二次学习)
以下是整理后的笔记格式: --- # 闭包与装饰器 ## 一、闭包的概念,作用,条件### 作用: 1. **保存外部函数的变量**:可以让一个变量常驻于内存。 python def func():a 10def inner():print(a)return areturn inne…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
Java项目生成接口文档的方案
文章目录 问题:Java项目生成接口文档的方案方案一:Swagger3.0方案二:Apipost两者对比 问题:Java项目生成接口文档的方案 需求 1、需要生成生成时间,作者名称,项目名称,接口名称,请…...
Android第七次面试总结(Java和kotlin源码级区别 )
Java 和 Kotlin 作为用于软件开发尤其是 Android 和后端开发的编程语言,在源码层面存在诸多区别,下面从多个方面进行深入讲解: 1. 基础语法与变量声明 变量声明方式 Java:变量声明时必须明确指定数据类型,并且若要声…...
北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…...
案例实践 | 招商局集团以长安链构建“基于DID的航运贸易数据资产目录链”
概览 案例名称 基于DID的航运贸易数据资产目录链 业主单位 招商局集团 上线时间 2024年10月 用户群体 供数用数企业和个人 用户规模 集团内20企业 案例背景 招商局集团深入落实“促进数据高效流通使用、赋能实体经济”精神,深化集团数字化水平,…...
【C++】httplib:轻量级的 HTTP 服务器和客户端
本教程采用渐进式讲解方式,适用于 MinGW 环境。我们将从 httplib 的基本概念入手,通过一个小型 Demo 展示其核心用法,最后深入探讨高级功能与实际应用场景。 1. 简介 1.1 httplib 基本概念 httplib 是一个轻量级的 C HTTP 库,设…...
【算法工程】RAG:针对linux下文档解析出现乱码问题的解决
RAG服务中,非常关键的模块是文档解析。但将解析服务部署到linux平台,解析word、ppt等文档时可能就会出现乱码,核心原因是系统未能识别出对应的字体。因为word、ppt在windows下是最适配的,如果将解析服务部署到linux上,…...
亚马逊云科技全面托管DeepSeek-R1模型现已上线
文章目录 亚马逊云科技全面托管DeepSeek-R1模型现已上线在Amazon Bedrock中开始使用DeepSeek-R1模型DeepSeek-R1现已可用 亚马逊云科技全面托管DeepSeek-R1模型现已上线 亚马逊云科技提供众多免费云产品,可以访问:亚马逊云科技 截至1月30日,D…...
2025年移动端开发性能优化实践与趋势分析
启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...
Docker Compose介绍
基本概念 Docker-Compose是Docker官方的开源项目,负责实现对docker容器集群的快速编排。 可以这么理解,docker compose是docker提出的一个工具软件,可以管理多个docker容器组成一个应用,只需要编写一个YAML格式的配置文件docker…...
openGauss关联列数据类型不一致引起谓词传递失败
今天分享一个比较有意思的案例 注意:因为原始SQL很长,为了方便排版,简化了SQL 下面SQL跑60秒才出结果,客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…...
头歌实践教学平台--【数据库概论】--SQL
一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1:删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2:添加列unitPrice alter t…...
