微服务之一:Eureka、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负载均衡项目。
主要包括三个子模块:
  1. ribbon-core:核心,主要负责均衡器接口定义、客户端接口定义、内置的负载均衡实现等API
  2. ribbon-eureka:为Eureka客户端提供的负载均衡实现类
  3. ribbon-httpclient:对Apache的HttpClient进行封装,提供含有负载均衡功能的REST客户端

1.1负载均衡器组件

负载均衡器需要提供以下的功能:
  1. 维护服务器的IP、DNS名称等信息
  2. 根据特定的逻辑在服务列表中循环

为了实现以上的基本功能,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自带的负载规则

  1. RoundRobinRule:系统默认的规则,通过简单的轮询服务列表来选择服务器,其他规则在很多情况下仍使用RoundRobinRule
  2. 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实例就具有了负载均衡能力

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值