Eureka、Nacos、LoadBalance、OpenFeign之间的区别联系和协作 (附代码讲解)
这篇文章聊聊微服务里的这几个老伙计:Eureka、Nacos、LoadBalance、OpenFeign。
咱们做微服务开发,总会跟这几个组件打交道:Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它们各司其职又互相配合,今天就把它们的关系、用法捋清楚,再上点代码示例,保证看完就明白。不然很久不用就忘了。
先从注册中心说起,这俩货是服务的 "通讯录"
不管是 Eureka 还是 Nacos,核心作用都一样:让各个微服务能互相找到对方。服务启动时会把自己的地址报到注册中心,调用的时候再从注册中心查对方的地址。但用法上差别不小。
Eureka 得自己搭服务器,咱们用 Eureka 的话,得单独起一个 Eureka Server 服务。步骤大概是这样:
- 加依赖,server 端用 spring-cloud-starter-netflix-eureka-server,client 端用 spring-cloud-starter-netflix-eureka-client。
- 启动类上得加 @EnableEurekaServer(服务器端),client 端不用加特殊注解但得配置。
- 配置文件里,server 要指定自己的地址,client 要指定 server 的地址。
举个例子,Eureka Server 的配置:
# application.yml
server:port: 8761
eureka:client:register-with-eureka: false # 自己不注册自己fetch-registry: false # 不用拉取服务列表serviceUrl:defaultZone: http://localhost:8761/eureka/
启动类:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {public static void main(String[] args) {SpringApplication.run(EurekaServerApp.class, args);}
}
客户端的配置就简单点,加个依赖,然后配置文件里指定 server 地址:
spring:application:name: user-service # 服务名很重要,后面调用要用
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
而 Nacos 就省事儿多了,它本身是个现成的服务器,咱们不用自己搭。直接用人家提供的 Nacos Server(可以下载安装包启动),咱们的服务作为 client 连上去就行。
用法上:
- 只需要加一个依赖:spring-cloud-starter-alibaba-nacos-discovery。
- 配置文件里指定 Nacos Server 的地址,不用管服务器端的事儿。
代码示例:
# application.yml
spring:application:name: order-servicecloud:nacos:discovery:server-addr: localhost:8848 # Nacos Server的地址
启动类不用加特殊注解,直接启动就行,服务会自动注册到 Nacos。
所以 Nacos 比 Eureka 省事儿,不用自己维护注册中心服务器,这是最大的区别。
再看服务调用,RestTemplate 加 LoadBalance 是基础操作
微服务之间调用,本质上就是发 HTTP 请求。RestTemplate 是 Spring 提供的工具,能帮咱们发请求。但直接用 RestTemplate 的话,得知道对方的 IP 和端口,这显然不现实 —— 服务可能多实例部署,IP 端口会变。
这时候就需要 Spring Cloud LoadBalancer 了,它能做两件事:从注册中心拿到服务的所有实例地址,然后根据策略(比如轮询、随机)选一个出来,也就是负载均衡。
咱们用 RestTemplate+LoadBalance 的组合,就能直接用服务名调用,不用管具体 IP 了。
步骤如下:
- 加依赖,spring-cloud-starter-loadbalancer(Nacos 的依赖里可能已经包含,保险起见还是加上)。
- 配置 RestTemplate 的时候,加个 @LoadBalanced 注解,告诉它要用负载均衡。
代码示例:
@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced // 关键,加上这个才能用服务名调用public RestTemplate restTemplate() {return new RestTemplate();}
}
调用的时候,直接用服务名代替 IP: 端口:
@Service
public class OrderService {@Autowiredprivate RestTemplate restTemplate;public User getUser(Long userId) {// 直接写 "http://服务名/接口路径",这里的user-service就是注册的服务名return restTemplate.getForObject("http://user-service/user/" + userId, User.class);}
}
LoadBalance 默认是轮询策略,就是挨个调用服务实例。想改随机的话,写个配置类就行:
@Configuration
public class LoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
要是想搞更自定义的策略,比如按服务实例的负载情况分配,有两种办法:要么自己实现 ReactorLoadBalancer 接口,要么给 RestTemplate 加个拦截器,在拦截器里写选择逻辑,甚至直接在业务代码里查服务列表再手动选。不过一般默认的或者简单自定义就够了。
再说说 OpenFeign,这货是 RestTemplate 的 "升级版"
用 RestTemplate 调用虽然比写死 IP 强,但还是得拼接 URL、处理响应,不够优雅。OpenFeign 就方便多了,它是声明式的调用工具,自带了 LoadBalance,不用额外配置,写起来像调本地接口一样。
用法步骤:
- 加依赖,spring-cloud-starter-openfeign。
- 启动类上得加 @EnableFeignClients,告诉程序要扫描 Feign 接口。
- 写个接口,用 @FeignClient ("服务名") 标注,里面定义要调用的接口方法,路径、参数跟服务端的接口对应上。
- 直接注入这个接口,像用本地方法一样调用。
代码示例:
先写 Feign 接口:
// 声明要调用的服务名是user-service
@FeignClient(value = "user-service")
public interface UserFeignClient {// 这里的路径、参数要跟user-service里的接口完全一致@GetMapping("/user/{userId}")User getUser(@PathVariable("userId") Long userId);
}
启动类加注解:
@SpringBootApplication
@EnableFeignClients // 关键,开启Feign
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class, args);}
}
调用的时候直接用:
@Service
public class OrderService {@Autowiredprivate UserFeignClient userFeignClient; // 注入Feign接口public User getUser(Long userId) {// 像调本地方法一样,直接调用接口的方法return userFeignClient.getUser(userId);}
}
是不是比 RestTemplate 清爽多了?而且它自带负载均衡,不用再操心 @LoadBalanced 的事儿,内部已经集成了。
最后总结下它们的联系和区别
联系很简单:注册中心是基础,没有它服务之间找不到对方;LoadBalance 是 "调度员",负责把请求合理分配给多个服务实例;RestTemplate 和 OpenFeign 是 "信使",负责发请求,其中 OpenFeign 封装了 RestTemplate 和 LoadBalance,用起来更方便。
区别主要在这几点:
- 注册中心:Eureka 需要自己搭服务器,Nacos 直接用现成的,配置更简单;Nacos 除了注册中心还有配置中心功能,Eureka 只做注册发现。
- 负载均衡:LoadBalance 是单独的负载均衡工具,RestTemplate 必须配合它才能用服务名调用;OpenFeign 自带 LoadBalance,不用额外配置。
- 服务调用:RestTemplate 是基础工具,需要手动写调用代码;OpenFeign 是声明式的,更简洁,适合复杂场景。
咱们实际开发中,现在用 Nacos+OpenFeign 的组合比较多,Nacos 省事,OpenFeign 写起来方便。当然 RestTemplate 也得会,简单场景下用着也挺快。
大概就是这些了,这几个组件配合起来,就能让微服务之间的调用既灵活又可靠。代码示例都给了,照着试一遍,肯定能掌握。