【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️

Spring Cloud的注册发现机制是为了解决微服务架构中服务实例的动态变化和通信的问题。以下是使用Spring Cloud注册发现机制  本文重点讲解其使用方法及原理


Spring Cloud的注册发现机制


Eureka的架构设计


Eureka是Spring Cloud中的一个服务注册和发现组件,它采用了客户端-服务器的架构设计。


Eureka的核心概念


  1. Eureka Server(注册中心):它是服务注册中心,负责接收和存储服务实例的注册信息,并提供服务发现的功能。
  2. Eureka Client(服务实例):它是一个运行在各个服务实例中的客户端,用于将自身的服务注册到Eureka Server,并定期向Eureka Server发送心跳信息以保持注册状态。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

Eureka Server的角色和功能


  • 注册表:Eureka Server维护一个注册表,用于存储所有已注册的服务实例的信息,包括服务名称、主机地址、端口号等。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • 服务注册:当服务实例启动时,它会向Eureka Server发送注册请求,将自己的信息注册到注册表中。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}
 
@RestController
class UserController {
 
    @GetMapping("/users")
    public String getUsers() {
        return "User list";
    }
}
  • 服务续约:服务实例会定期发送心跳信息给Eureka Server,以更新自身的注册状态,并防止被Eureka Server从注册表中注销。
# 心跳间隔(单位:秒)
eureka.instance.lease-renewal-interval-in-seconds=30
# 心跳超时时间(单位:秒)
eureka.instance.lease-expiration-duration-in-seconds=90
  • 服务剔除:如果Eureka Server在一定时间内没有收到服务实例的心跳信息,它会将该服务实例从注册表中剔除。
# 剔除策略启用
eureka.server.eviction.enabled=true
# 剔除策略的时间间隔(单位:秒)
eureka.server.eviction.interval-time-in-ms=60000


eviction.enabled设置为true表示启用剔除策略,eviction.interval-time-in-ms表示剔除策略的时间间隔。如果在该时间间隔内没有收到服务实例的心跳信息,Eureka Server将自动将其从注册表中剔除。


通过以上示例代码和配置,可以实现服务注册、续约和剔除的功能,确保服务实例在Eureka Server上的动态注册和注销。


Eureka Client的角色和功能


  1. 服务注册:服务实例在启动时,会向Eureka Server发送注册请求,将自身的信息注册到Eureka Server的注册表中。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}
 
@RestController
class UserController {
 
    private final RestTemplate restTemplate;
 
    public UserController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
 
    @GetMapping("/users")
    public String getUsers() {
        // 通过服务名进行服务发现和调用
        String url = "http://service-provider/users";
        return restTemplate.getForObject(url, String.class);
    }
}

在上述代码中,使用@EnableDiscoveryClient注解启用服务发现功能,并通过RestTemplate发起服务调用。


  1. 服务发现:服务实例通过向Eureka Server发送查询请求,获取其他服务实例的信息,以实现服务之间的通信。

Eureka Server可以以集群的方式部署,实现高可用性和负载均衡。在集群中,各个Eureka Server之间通过复制注册表信息来保持一致性。


  1. 服务调用:服务实例根据获取到的服务实例信息,利用负载均衡等技术选择合适的服务进行调用。


Eureka集群架构的设计和部署


  1. Eureka Server可以以集群的方式部署,实现高可用性和负载均衡。在集群中,各个Eureka Server之间通过复制注册表信息来保持一致性。
  2. 在Eureka集群中,每个Eureka Server既是服务注册中心,又是服务发现的客户端,它们彼此相互注册,以实现相互的服务发现功能。
# Eureka Server 1
eureka.client.serviceUrl.defaultZone=http://server1:8761/eureka/
 
# Eureka Server 2
eureka.client.serviceUrl.defaultZone=http://server2:8762/eureka/


Ribbon的用法


Ribbon是Spring Cloud中的一个客户端负载均衡组件,它与Eureka结合使用可以实现服务间的负载均衡。以下是Ribbon的用法:


  1. Ribbon的作用和特点:


  • Ribbon主要用于在客户端进行负载均衡,将请求分发到多个服务实例上,以提高系统的可用性和性能。
  • Ribbon支持多种负载均衡策略,如轮询、随机、加权等,可以根据需求选择合适的策略。
  • Ribbon与Eureka整合使用时,可以自动从Eureka Server获取可用的服务实例列表。


  1. Ribbon的配置方式:


  • Ribbon可以通过配置文件或编程方式进行配置。
# application.yml
my-service:
  ribbon:
    eureka:
      enabled: true # 启用Eureka集成
    listOfServers: localhost:8081,localhost:8082 # 服务实例列表
    # 可选:设置负载均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 配置文件方式:可以在应用的配置文件中设置负载均衡策略和相关属性,如服务名、连接超时、重试次数等。
  • 编程方式:可以通过编写代码来配置Ribbon的负载均衡策略和其他属性,以实现更灵活的配置。


  1. 自定义Ribbon配置:


  • 可以通过自定义配置类来实现Ribbon的个性化配置,如定义特定的负载均衡策略和规则。
  • 自定义配置类需要使用@Configuration注解,并实现IRule接口和其他相关接口,以对Ribbon进行定制化配置。


Feign的用法


Feign是Spring Cloud中的一个声明式的REST客户端,它简化了服务间的HTTP通信,并与Eureka集成实现了服务发现和负载均衡。以下是Feign的用法:


Feign的作用和特点:


  1. Feign用于定义和实现对服务的接口调用,它将接口方法映射到HTTP请求,并通过服务发现和负载均衡来选择合适的服务实例进行调用。
  2. Feign支持声明式的接口定义和注解配置,使得服务间的调用代码更加简洁和易于维护。


声明式REST客户端的使用:


  1. 首先需要定义一个接口,其中声明需要调用的服务方法,并使用@FeignClient注解指定服务名称。
  2. 在接口方法上使用@RequestMapping等注解来配置请求路径、参数等信息。
  3. 使用定义的接口方法进行服务调用时,Feign会自动根据注解配置生成相应的HTTP请求。


Feign的请求参数和路径变量处理:


  1. Feign支持将请求参数通过@RequestParam注解传递,可以配置参数名称、默认值等属性。
  2. 路径变量可以通过@PathVariable注解传递,将参数动态地替换到请求路径中。


Feign的错误处理和重试机制:


  1. Feign提供了对不同HTTP状态码的错误处理机制,可以通过定义ErrorDecoder来处理特定的错误响应。
  2. 可以配置Feign的重试机制,以提高请求的可靠性。可以设置重试次数、重试间隔等属性。


实际用法


  1. 添加依赖:

在Maven项目中,需要添加Spring Cloud Feign的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


  1. 创建Feign客户端接口:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
 
@FeignClient(name = "service-provider")
public interface UserServiceClient {
 
    @GetMapping("/users")
    String getUsers();
}

在上述代码中,使用@FeignClient注解指定了服务提供者的名称,这里是service-provider


  1. 创建使用Feign客户端的服务消费者
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@SpringBootApplication
@EnableFeignClients
public class FeignConsumerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApplication.class, args);
    }
}
 
@RestController
class UserController {
 
    private final UserServiceClient userServiceClient;
 
    public UserController(UserServiceClient userServiceClient) {
        this.userServiceClient = userServiceClient;
    }
 
    @GetMapping("/users")
    public String getUsers() {
        return userServiceClient.getUsers();
    }
}

在上述代码中,使用@EnableFeignClients注解启用Feign客户端,并通过自动注入的方式使用UserServiceClient进行服务调用。


  1. 配置Feign客户端:

在application.properties或application.yml文件中,配置Feign客户端的相关属性,例如:

# Feign客户端的服务地址
service-provider.ribbon.listOfServers=http://localhost:8080
相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
771 36
微服务架构解析:跨越传统架构的技术革命
|
3月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
94 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
2月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
132 17
|
2月前
|
人工智能 安全 Java
微服务引擎 MSE:打造通用的企业级微服务架构
微服务引擎MSE致力于打造通用的企业级微服务架构,涵盖四大核心内容:微服务技术趋势与挑战、MSE应对方案、拥抱开源及最佳实践。MSE通过流量入口、内部流量管理、服务治理等模块,提供高可用、跨语言支持和性能优化。此外,MSE坚持开放,推动云原生与AI融合,助力企业实现无缝迁移和高效运维。
103 1
|
1月前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
|
2月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
119 7
|
2天前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
98 79
|
24天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
75 12
|
27天前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
44 8
|
2月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
563 17
Spring Boot 两种部署到服务器的方式

热门文章

最新文章