当前位置: 首页 > news >正文

Eureka、Nacos、LoadBalance、OpenFeign​之间的区别联系和协作 (附代码讲解)

这篇文章聊聊微服务里的这几个老伙计:Eureka、Nacos、LoadBalance、OpenFeign。

咱们做微服务开发,总会跟这几个组件打交道:Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它们各司其职又互相配合,今天就把它们的关系、用法捋清楚,再上点代码示例,保证看完就明白。​不然很久不用就忘了。

先从注册中心说起,这俩货是服务的 "通讯录"​

不管是 Eureka 还是 Nacos,核心作用都一样:让各个微服务能互相找到对方。服务启动时会把自己的地址报到注册中心,调用的时候再从注册中心查对方的地址。但用法上差别不小。​

Eureka 得自己搭服务器,咱们用 Eureka 的话,得单独起一个 Eureka Server 服务。步骤大概是这样:​

  1. 加依赖,server 端用 spring-cloud-starter-netflix-eureka-server,client 端用 spring-cloud-starter-netflix-eureka-client。​
  2. 启动类上得加 @EnableEurekaServer(服务器端),client 端不用加特殊注解但得配置。​
  3. 配置文件里,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 连上去就行。​

用法上:​

  1. 只需要加一个依赖:spring-cloud-starter-alibaba-nacos-discovery。​
  1. 配置文件里指定 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 了。​

步骤如下:​

  1. 加依赖,spring-cloud-starter-loadbalancer(Nacos 的依赖里可能已经包含,保险起见还是加上)。​
  2. 配置 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,不用额外配置,写起来像调本地接口一样。​

用法步骤:​

  1. 加依赖,spring-cloud-starter-openfeign。​
  2. 启动类上得加 @EnableFeignClients,告诉程序要扫描 Feign 接口。​
  3. 写个接口,用 @FeignClient ("服务名") 标注,里面定义要调用的接口方法,路径、参数跟服务端的接口对应上。​
  4. 直接注入这个接口,像用本地方法一样调用。​

代码示例:​

先写 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,用起来更方便。​

区别主要在这几点:​

  1. 注册中心:Eureka 需要自己搭服务器,Nacos 直接用现成的,配置更简单;Nacos 除了注册中心还有配置中心功能,Eureka 只做注册发现。​
  2. 负载均衡:LoadBalance 是单独的负载均衡工具,RestTemplate 必须配合它才能用服务名调用;OpenFeign 自带 LoadBalance,不用额外配置。​
  3. 服务调用:RestTemplate 是基础工具,需要手动写调用代码;OpenFeign 是声明式的,更简洁,适合复杂场景。​

咱们实际开发中,现在用 Nacos+OpenFeign 的组合比较多,Nacos 省事,OpenFeign 写起来方便。当然 RestTemplate 也得会,简单场景下用着也挺快。​

大概就是这些了,这几个组件配合起来,就能让微服务之间的调用既灵活又可靠。代码示例都给了,照着试一遍,肯定能掌握。

http://www.dtcms.com/a/267064.html

相关文章:

  • 深入理解Qt的SetWindowsFlags函数
  • Kafka消费者分区分配机制与生产环境配置指南
  • LabVIEW 3D 场景中 Voronoi 图(基站覆盖模拟)功能
  • 03每日简报20250705
  • 国产MCU学习Day7——CW32F030C8T6 SPI主从通信详解
  • Django中关于templates目录和static目录存放位置的总结
  • 基于开源AI智能名片链动2+1模式的S2B2C商城小程序:门店私域流量与视频号直播融合的生态创新研究
  • 【51单片机】51单片机学习笔记-课程简介
  • 权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
  • 共射级放大电路的频率响应Multisim电路仿真——硬件工程师笔记
  • 程序计数器(PC)是什么?
  • 一个简单的分布式追踪系统
  • 【AI大模型面试八股文】大模型训练中如何应对灾难性遗忘问题?
  • 快速掌握Python编程基础
  • 【Qt】事件处理、事件分发器、事件过滤器
  • Ionic 安装使用教程
  • CPU指令集权限
  • mysql基础(一)快速上手篇
  • Swift 安装使用教程
  • 百度AI文心大模型4.5系列开源模型评测,从安装部署到应用体验
  • Python区块链服务及API实现
  • 物联网软件层面的核心技术体系
  • Day51 复习日-模型改进
  • Python 的内置函数 reversed
  • 系统移植基础部分
  • Resource punkt_tab not found. NLTK
  • Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化
  • JxBrowser 7.43.3 版本发布啦!
  • 数据结构---线性表理解(一)
  • 【unitrix】 4.16 类型级别左移运算实现解析(shl.rs)