服务发现
服务发现
服务发现原理
服务发现解决微服务动态伸缩环境下服务实例地址变化的问题,通过注册中心维护服务实例列表,客户端实时获取可用实例。
┌──────────┐ 注册 ┌──────────┐ 发现 ┌──────────┐
│ Service A │ ──────────► │ Registry │ ◄────────── │ Service B │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└───── 健康检查 ◄────────┘
Consul服务发现
Consul提供服务注册、健康检查、KV存储和多数据中心支持。
// Consul服务注册
config := consul.DefaultConfig()
config.Address = "consul.example.com:8500"
client, _ := consul.NewClient(config)
registration := &consul.AgentServiceRegistration{
ID: "user-service-1",
Name: "user-service",
Port: 8080,
Check: &consul.AgentServiceCheck{
HTTP: "http://localhost:8080/health",
Interval: "10s",
},
}
client.Agent().ServiceRegister(registration)
// 服务发现
services, _ := client.Health().Service("user-service", "", true, nil)
for _, s := range services {
fmt.Printf("Instance: %s:%d\n", s.Service.Address, s.Service.Port)
}
Nacos服务发现
Nacos支持AP和CP两种模式,集成配置中心功能,适合需要动态配置的微服务架构。
// Nacos服务注册
@NacosDiscoveryProperties(serverAddr = "nacos:8848")
public class DiscoveryConfig {
@Bean
public NacosDiscovery nacosDiscovery() {
return new NacosDiscovery();
}
}
// 服务消费
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("/users/{id}")
public User getUser(@PathVariable String id) {
return restTemplate.getForObject(
"http://user-service/api/users/" + id, User.class);
}
Eureka服务发现
Eureka采用AP模型,支持自我保护机制,适用于对可用性要求高的场景。
// Eureka服务端
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
// Eureka客户端
@SpringBootApplication
@EnableDiscoveryClient
public class UserService {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
注册中心对比
| 特性 | Consul | Nacos | Eureka |
|---|---|---|---|
| 一致性 | CP | AP/CP | AP |
| 健康检查 | HTTP/TCP/gRPC | HTTP/TCP | 心跳 |
| 多数据中心 | 支持 | 支持 | 不支持 |
| 配置管理 | KV存储 | 内置 | 无 |