服务注册发现
服务注册发现是微服务架构中的重要组件,实现服务的自动注册、发现和负载均衡。
📋 服务注册发现概述
🎯 一、服务注册发现对比
1. Eureka
Eureka 是Netflix开源的服务注册发现组件。
特点:
| 特性 | 说明 |
|---|---|
| CAP理论 | AP(可用性和分区容错性) |
| 服务注册 | 客户端主动注册 |
| 服务发现 | 客户端轮询获取服务列表 |
| 健康检查 | 客户端心跳机制 |
| 负载均衡 | 客户端负载均衡 |
| 性能 | 中等 |
适用场景:
- Spring Cloud微服务架构
- 对一致性要求不高的场景
- 中小型微服务系统
2. Nacos
Nacos 是阿里巴巴开源的服务注册发现和配置管理平台。
特点:
| 特性 | 说明 |
|---|---|
| CAP理论 | 支持CP和AP模式切换 |
| 服务注册 | 客户端主动注册 |
| 服务发现 | 支持推送和拉取模式 |
| 健康检查 | 服务端和客户端健康检查 |
| 配置管理 | 集成配置管理功能 |
| 性能 | 高性能 |
适用场景:
- 微服务架构
- 需要配置管理的场景
- 大型分布式系统
3. Consul
Consul 是HashiCorp开源的服务发现和配置管理工具。
特点:
| 特性 | 说明 |
|---|---|
| CAP理论 | CP(一致性和分区容错性) |
| 服务注册 | 支持服务注册和健康检查 |
| 服务发现 | HTTP/DNS服务发现 |
| 配置管理 | 键值存储 |
| 多数据中心 | 支持多数据中心 |
| 性能 | 中等 |
适用场景:
- 需要强一致性的场景
- 多数据中心场景
- 需要分布式锁的场景
4. Zookeeper
Zookeeper 是Apache开源分布式协调服务。
特点:
| 特性 | 说明 |
|---|---|
| CAP理论 | CP(一致性和分区容错性) |
| 服务注册 | 基于临时节点 |
| 服务发现 | 监听节点变化 |
| 配置管理 | 配置存储 |
| 分布式锁 | 支持分布式锁 |
| 性能 | 较高 |
适用场景:
- 需要强一致性的场景
- Dubbo服务注册发现
- 分布式协调场景
5. 服务注册发现对比表
| 特性 | Eureka | Nacos | Consul | Zookeeper |
|---|---|---|---|---|
| CAP理论 | AP | CP/AP | CP | CP |
| 服务注册 | ✅ | ✅ | ✅ | ✅ |
| 服务发现 | ✅ | ✅ | ✅ | ✅ |
| 配置管理 | ❌ | ✅ | ✅ | ✅ |
| 健康检查 | 客户端心跳 | 服务端+客户端 | 服务端+客户端 | 客户端心跳 |
| 负载均衡 | 客户端 | 客户端/服务端 | 客户端 | 客户端 |
| 多数据中心 | ❌ | ✅ | ✅ | ✅ |
| 性能 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
🎯 二、Nacos服务注册发现
1. Nacos服务注册
服务注册流程:
服务注册示例:
java
// Spring Cloud Alibaba Nacos
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 配置文件
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP2. Nacos服务发现
服务发现流程:
服务调用示例:
java
// Feign客户端
@FeignClient(name = "user-service")
public interface UserServiceClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable Long id);
}
// RestTemplate
@Autowired
private LoadBalancerClient loadBalancerClient;
public void callUserService() {
ServiceInstance instance = loadBalancerClient.choose("user-service");
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/users/1";
// 调用服务
}3. Nacos最佳实践
命名空间管理:
yaml
# 按环境划分命名空间
dev: 开发环境
test: 测试环境
prod: 生产环境
# 按业务划分命名空间
order: 订单业务
user: 用户业务
payment: 支付业务服务分组:
yaml
# 服务分组示例
group: DEFAULT_GROUP
group: ORDER_GROUP
group: USER_GROUP健康检查:
java
// 自定义健康检查
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查应用健康状态
if (isHealthy()) {
return Health.up().build();
}
return Health.down().build();
}
}🎯 三、Eureka服务注册发现
1. Eureka工作原理
Eureka架构:
Eureka特点:
- 客户端注册:服务启动时注册到Eureka Server
- 客户端发现:客户端从Eureka Server获取服务列表
- 客户端缓存:本地缓存服务列表
- 心跳机制:客户端定时发送心跳
2. Eureka最佳实践
Eureka配置:
yaml
# Eureka Server配置
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/
# Eureka Client配置
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 30
lease-expiration-duration-in-seconds: 90服务注册:
java
@SpringBootApplication
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}🎯 四、Consul服务注册发现
1. Consul工作原理
Consul架构:
2. Consul最佳实践
服务注册:
json
// Consul服务注册
{
"ID": "user-service-1",
"Name": "user-service",
"Tags": ["v1", "web"],
"Address": "192.168.1.100",
"Port": 8080,
"Check": {
"HTTP": "http://192.168.1.100:8080/health",
"Interval": "10s"
}
}服务发现:
java
// Consul服务发现
@Autowired
private DiscoveryClient discoveryClient;
public List<ServiceInstance> getInstances(String serviceId) {
return discoveryClient.getInstances(serviceId);
}🎯 五、服务注册发现最佳实践
1. 服务注册
注册时机:
- 服务启动时注册
- 健康检查通过后注册
- 优雅关闭时注销
注册信息:
- 服务名称
- 服务地址和端口
- 服务版本
- 服务标签
- 健康检查地址
2. 服务发现
发现策略:
- 拉取模式:客户端定时拉取服务列表
- 推送模式:服务端主动推送服务变更
- 混合模式:拉取+推送
缓存策略:
- 本地缓存服务列表
- 定时刷新缓存
- 监听服务变更事件
3. 负载均衡
负载均衡策略:
- 轮询(Round Robin)
- 随机(Random)
- 加权轮询(Weighted Round Robin)
- 一致性Hash(Consistent Hash)
- 最少连接(Least Connections)
4. 健康检查
健康检查方式:
- 心跳检查:客户端定时发送心跳
- HTTP检查:服务端主动检查健康端点
- TCP检查:TCP连接检查
- 脚本检查:自定义脚本检查
健康检查配置:
yaml
# Nacos健康检查配置
spring:
cloud:
nacos:
discovery:
heartbeat-interval: 5000
heart-beat-timeout: 15000
ip-delete-timeout: 300005. 故障处理
故障场景:
- 注册中心不可用
- 服务提供者不可用
- 网络分区
处理策略:
- 服务缓存:本地缓存服务列表
- 故障转移:切换备用注册中心
- 降级策略:服务降级处理
📖 学习资源
视频教程
书籍推荐
- 《微服务架构设计模式》 - Chris Richardson
- 《Spring Cloud微服务实战》 - 翟永超
网站资源
✅ 学习检查清单
- [ ] 已理解服务注册发现的原理
- [ ] 已掌握Nacos服务注册发现
- [ ] 已掌握Eureka服务注册发现
- [ ] 已了解Consul和Zookeeper的使用
- [ ] 已掌握服务注册发现的最佳实践
- [ ] 已学会故障处理和容错机制