服务发现与调用
约 388 字大约 1 分钟
布欧-Lewyon
2026-05-15
首页 › Spring Cloud › 服务注册与发现
服务注册到 Nacos 后,消费者如何找到服务提供者的地址?
DiscoveryClient
@Service
public class DiscoveryService {
@Autowired
private DiscoveryClient discoveryClient;
public List<String> getServiceUrls(String serviceName) {
// 获取指定服务的所有实例
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
return instances.stream()
.map(instance -> "http://" + instance.getHost() + ":" + instance.getPort())
.toList();
}
public List<String> getAllServices() {
return discoveryClient.getServices();
}
}// GET /api/services/user-service
[
"http://192.168.1.10:8081",
"http://192.168.1.11:8081"
]RestTemplate + LoadBalancer
配置
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced // 开启负载均衡(拦截请求,替换服务名为真实 IP)
public RestTemplate restTemplate() {
return new RestTemplate();
}
}使用
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public User getUser(Long userId) {
// 直接用服务名调用,LoadBalancer 自动替换为真实地址
String url = "http://user-service/api/users/" + userId;
return restTemplate.getForObject(url, User.class);
}
}负载均衡策略
# application.yml
spring:
cloud:
loadbalancer:
retry:
enabled: true@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment env, LoadBalancerClientFactory factory) {
String name = env.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(
factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}| 策略 | 类 | 说明 |
|---|---|---|
| 轮询 | RoundRobinLoadBalancer | 默认 |
| 随机 | RandomLoadBalancer | 随机选一个 |
| 权重 | WeightedLoadBalancer | Nacos 权重 |
Nacos 权重负载均衡
spring:
cloud:
nacos:
discovery:
metadata:
weight: 0.5 # 权重(0-1,越大流量越多)小结
DiscoveryClient.getInstances()获取服务的所有实例列表。RestTemplate + @LoadBalanced:直接用服务名替代 IP,LoadBalancer 自动做负载均衡。- 默认策略是轮询,可改为随机或权重。
- Nacos 支持元数据配置权重,实现精细化的流量分发。
- 生产推荐用 OpenFeign(下一节)替代 RestTemplate。
上一节:Nacos 安装与服务注册 下一节:OpenFeign 声明式调用
