Ribbon
一:Eureka
- Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。
- Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有
接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。 - Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
1.1 依赖项
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaserver</artifactId>
</dependency>
</dependencies>
1.2 配置文件
server:
port: 6868 #服务端口
eureka:
client:
registerWithEureka: false #是否将自己注册到Eureka服务中,本身就是所有无需
注册
fetchRegistry: false #是否从Eureka中获取注册信息
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka/
1.3 启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
启动运行启动类,然后在浏览器地址栏输入 http://localhost:6868/ 运行效果
1.4 服务注册
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaclient</
artifactId>
</dependency>
eureka:
client:
service‐url:
defaultZone: http://localhost:6868/eureka
@EnableEurekaClient
修改每个服务类的启动类,添加注解@EnableEurekaClient
二:简介
Ribbon负载均衡项目。
主要包括三个子模块:
- ribbon-core:核心,主要负责均衡器接口定义、客户端接口定义、内置的负载均衡实现等API
- ribbon-eureka:为Eureka客户端提供的负载均衡实现类
- ribbon-httpclient:对Apache的HttpClient进行封装,提供含有负载均衡功能的REST客户端
1.1负载均衡器组件
负载均衡器需要提供以下的功能:
- 维护服务器的IP、DNS名称等信息
- 根据特定的逻辑在服务列表中循环
为了实现以上的基本功能,Ribbon的负载均衡器有以下三个大子模块
3. Rule:一个逻辑组件,这些逻辑将会决定从服务器列表中返回哪个服务器实实例
4. Ping: 该组件主要使用定时器来确保服务器网络可以连接
5. ServerList:服务器列表,可以通过静态的配置确定负载的服务器,也可以动态制定服务器列表。
1.2 Ribbon负载均衡机制
Ribbon提供了几个负载均衡的组件,为了让请求转给合适的服务器处理
1.2.1 负载均衡器
Ribbon的负载均衡器借口定义了服务器的操作,主要的目的用于进行服务器选择
eg:BaseLoadBalancer
1.2.2 自定义负载规则
如果想自定义负载均衡规定,需要编写一个IRule接口的实现类
public class MyRule implements IRule{
}
1.2.3 Ribbon自带的负载规则
- RoundRobinRule:系统默认的规则,通过简单的轮询服务列表来选择服务器,其他规则在很多情况下仍使用RoundRobinRule
- AvailabilityFilteringRule: 该规则会忽略以下的服务器
- 无法连接的服务器
- 并发数过高的服务器
1.2.4ping机制
在负载均衡器中,提供了 Ping 机制,每隔一段时间,会去 Ping 服务器,判断服务器是否存活,该工作由 com.netflix.loadbalancer.IPing 接口的实现类负责,如果单独使用 Ribbon 默认情况下不会激活 Ping 机制,默认的实现类为 DummyPing(不验证)
package org.lixue.ribbon.client;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.Server;
public class MyPing implements IPing{
public boolean isAlive(Serverserver){
System.out.println("isAlive"+server.getHostPort());
return true;
}
}
修改 src/main/resources 目录下的 ribbon-client.properties 配置如下:
#配置服务器列表
MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002
#配置负载均衡规则IRule的实现类
MyRibbonClient.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.WeightedResponseTimeRule
#配置负载均衡实现类
MyRibbonClient.ribbon.NFLoadBalancerClassName=com.netflix.loadbalancer.ZoneAwareLoadBalancer
#配置IPing的实现类
MyRibbonClient.ribbon.NFLoadBalancerPingClassName=org.lixue.ribbon.client.MyPing
#配置Ping操作的间隔
MyRibbonClient.ribbon.NFLoadBalancerPingInterval=2
加入@LoadBalanced注解口,一个RestTemplate实例就具有了负载均衡能力