文章目录
一.Eureka概述
Eureka是Netflix开发的一种服务发现工具,用于在分布式系统中定位服务实例。它是Netflix开源的一部分,用于构建基于微服务架构的应用程序。Eureka的主要目标是简化在云中运行的服务的发现和负载均衡。
在微服务架构中,一个应用程序被拆分成小的独立服务,这些服务可能会运行在不同的主机、容器或虚拟机上。服务之间需要进行通信,但服务的位置和数量可能会动态变化。这就是服务发现的作用,它允许服务找到并与其他服务通信。
Eureka的主要组件有两个:
-
Eureka Server: Eureka Server是服务注册中心,负责维护服务实例的信息。每个服务实例都会在Eureka Server上注册,包括它的主机名、IP地址、端口号等信息。
-
Eureka Client: Eureka Client是服务的消费者,它用于从Eureka Server获取服务实例的信息。服务在启动时会向Eureka Server注册自己,同时定期向Eureka Server发送心跳以表明自己的存活状态。客户端通过查询Eureka Server上的服务注册表来确定服务实例的位置。
Eureka还支持一种概念叫做"自我保护模式",在该模式下,如果Eureka Server在一定时间内没有收到某个服务实例的心跳,它仍然会将该实例保留在注册表中,以防止因为网络问题导致的误判。
总的来说,Eureka简化了微服务架构中服务的注册和发现过程,使得在动态环境中构建和维护服务更加容易。然而,需要注意的是,尽管Eureka是一个流行的工具,但在一些场景中,现代的云原生环境也使用其他服务发现工具,例如Consul或etcd。
二.Eureka的作用
- 消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
三.Eureka案例
1.搭建EurekaServer
搭建EurekaServer服务步骤如下:
1.创建项目,引入spring-cloud-starter-netflix-eureka-server的依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
2.编写启动类,添加@EnableEurekaServer注解
3.添加application.yml文件,编写下面的配置:
启动服务后,点击图中连接,跳转到Eureka注册中心
发现eurekaserver已经注册成功
2.注册不同的服务
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.编写配置
模块全部启动后,进入Eureka注册中心发现服务全部注册成功
四.Eureka服务发现
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
步骤:
1.给RestTemplate添加@LoadBalanced注解
2.用服务提供者的服务名称远程调用(不使用完整ip地址,端口)
对于集群userservice,采用了负载均衡轮询访问两个不同端口的userservice服务器
五.Ribbon负载均衡
给RestTemplate添加@LoadBalanced注解后就实现了负载均衡,那么是谁在帮我们做这件事呢?答案就是Ribbon
1.Ribbon概述
NetflixRibbon 是一个开源的负载均衡项目,它属于 Netflix 的开源项目之一,用于在分布式系统中提供负载均衡的功能。Ribbon 主要用于客户端负载均衡,它可以在服务消费方的客户端上实现负载均衡,而不是集中在服务提供方。
以下是 Ribbon 的一些关键特性和工作原理:
-
负载均衡算法: Ribbon 提供了多种负载均衡算法,例如轮询、随机、权重轮询等,以确保请求能够均匀地分布到不同的服务实例上。
-
服务列表的动态获取: Ribbon 可以动态地从服务注册中心(如Eureka)获取服务实例列表,并实时更新这个列表,以确保负载均衡的精确性。
-
容错机制: Ribbon 具有容错机制,可以在一些服务实例不可用的情况下自动剔除故障节点,并将请求转发到其他可用的节点。
-
自定义规则: 用户可以根据自己的需求定制负载均衡的规则,以满足特定的业务场景。
-
集成其他 Netflix 组件: Ribbon 通常与 Netflix 的其他组件(如 Eureka、Hystrix)一起使用,以构建完整的分布式系统解决方案。
2.负载均衡流程
3.负载均衡策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:
- 代码方式(可以用于整个微服务项目):在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 配置文件方式(只能作用于配置的服务者上):在order-service的application.yml文件中,添加新的配置也可以修改规则:
4.饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载(order-service里的application.yml中):