Skip to content

服务注册发现 ​

服务注册发现是微服务架构中的重要组件,实现服务的自动注册、发现和负载均衡。

📋 服务注册发现概述 ​

🎯 一、服务注册发现对比 ​

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. 服务注册发现对比表 ​

特性EurekaNacosConsulZookeeper
CAP理论APCP/APCPCP
服务注册✅✅✅✅
服务发现✅✅✅✅
配置管理❌✅✅✅
健康检查客户端心跳服务端+客户端服务端+客户端客户端心跳
负载均衡客户端客户端/服务端客户端客户端
多数据中心❌✅✅✅
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

🎯 二、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_GROUP

2. 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: 30000

5. 故障处理 ​

故障场景:

  • 注册中心不可用
  • 服务提供者不可用
  • 网络分区

处理策略:

  • 服务缓存:本地缓存服务列表
  • 故障转移:切换备用注册中心
  • 降级策略:服务降级处理

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《微服务架构设计模式》 - Chris Richardson
  • 《Spring Cloud微服务实战》 - 翟永超

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已理解服务注册发现的原理
  • [ ] 已掌握Nacos服务注册发现
  • [ ] 已掌握Eureka服务注册发现
  • [ ] 已了解Consul和Zookeeper的使用
  • [ ] 已掌握服务注册发现的最佳实践
  • [ ] 已学会故障处理和容错机制

上一章节:配置中心
返回目录:中间件