
image.png
服务注册与发现
Dubbo + Zookeeper:
Zookeeper 作为注册中心,存储服务提供者的地址、端口、服务版本等元数据
Dubbo 客户端直连服务端,通过长连接减少连接开销
支持服务分组、版本控制、负载均衡(随机、轮询、一致性哈希等)
Spring Cloud:
主流使用 Nacos/Eureka/Consul 作为注册中心
基于 HTTP 短连接,通过服务名调用(客户端负载均衡 Ribbon/LoadBalancer)
天然支持服务健康检查、自动扩缩容
性能对比
Dubbo:
二进制协议(Dubbo 协议)序列化效率高,网络传输体积小
长连接复用,减少 TCP 握手开销
单机可支撑数万 QPS,适合高并发、低延迟场景
Spring Cloud:
HTTP 协议文本传输,序列化和网络开销大
短连接每次调用都要建立 TCP 连接
性能相对较低,但足够支撑大部分业务场景
适用场景
Dubbo + Zookeeper:
性能要求高的内部系统(如交易、支付)
服务节点数不多,微服务需求相对简单的场景
已有 Zookeeper 集群,希望快速接入微服务的项目
Spring Cloud:
互联网分布式系统,需要完整微服务能力
跨语言调用(HTTP/REST 天然支持)
服务规模大,需要完善的监控、熔断、链路追踪的场景
dubbo使用
// 1. 定义服务接口
public interface UserService {
User getUserById(Long id);
}
// 2. 实现接口
@DubboService(version = "1.0.0") // Dubbo注解暴露服务
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Long id) {
return new User(id, "张三");
}
}
// 3. 配置文件(application.yml)
dubbo:
application:
name: user-service
registry:
address: zookeeper://127.0.0.1:2181 # 注册中心地址
protocol:
name: dubbo
port: 20880 # Dubbo协议端口
//消费者
@RestController
public class OrderController {
// 注入远程服务
@DubboReference(version = "1.0.0")
private UserService userService;
@GetMapping("/order/{userId}")
public String getOrder(@PathVariable Long userId) {
// 直接调用远程服务(像调用本地方法)
User user = userService.getUserById(userId);
return "订单所属用户:" + user.getName();
}
}
springcloud
// 1. 提供REST接口
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return new User(id, "张三");
}
}
// 2. 配置文件(application.yml)
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 注册中心地址
server:
port: 8081
// 1. 定义Feign客户端(声明式HTTP客户端)
@FeignClient(name = "user-service") // 对应服务名
public interface UserFeignClient {
@GetMapping("/user/{id}")
User getUserById(@PathVariable("id") Long id);
}
// 2. 调用服务
@RestController
public class OrderController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/order/{userId}")
public String getOrder(@PathVariable Long userId) {
// 通过Feign调用HTTP接口
User user = userFeignClient.getUserById(userId);
return "订单所属用户:" + user.getName();
}
}
// 3. 配置文件
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8082