08.1 — 服务注册发现与调用
核心: 服务注册中心选型对比、声明式远程调用 OpenFeign 面试高频度: ⭐⭐⭐⭐
← 返回 **返回 Spring Cloud 索引**
1. 服务注册发现
架构对比
| 组件 | 说明 | CAP | 健康检查 | 适用场景 |
|---|---|---|---|---|
| Nacos | 阿里开源,注册中心+配置中心 | CP+AP 可切换 | 心跳+健康检查 | 国内首选 |
| Eureka | Netflix,已维护模式 | AP | 心跳 | 旧项目维护 |
| Consul | HashiCorp | CP | 健康检查+RPC | 多数据中心 |
| Zookeeper | Apache | CP | 会话超时 | Kafka 等集成 |
Nacos 注册中心
yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUPjava
@SpringBootApplication
@EnableDiscoveryClient // 实际可省略,Nacos 自动配置
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}Eureka 注册中心
yaml
# 服务端
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
# 客户端
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/2. 远程调用 — OpenFeign
java
// 1. 启用 Feign
@SpringBootApplication
@EnableFeignClients
public class Application {}
// 2. 声明式 HTTP 客户端
@FeignClient(name = "user-service", url = "${user-service.url}",
fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@GetMapping("/users/{id}")
Result<User> getUser(@PathVariable Long id);
@PostMapping("/users")
Result<User> createUser(@RequestBody UserCreateRequest request);
@GetMapping("/users/batch")
Result<List<User>> getUsers(@RequestParam("ids") List<Long> ids);
}
// 3. 熔断降级处理
@Component
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable cause) {
return new UserClient() {
@Override
public Result<User> getUser(Long id) {
log.error("getUser fallback: id={}", id, cause);
return Result.error(503, "用户服务不可用");
}
};
}
}核心面试题
- Nacos 和 Eureka 在 CAP 理论上的区别?
- OpenFeign 如何集成负载均衡和服务熔断?