SpringCloud的Ribbon负载均衡

来源:互联网 发布:linux系统入门使用 编辑:程序博客网 时间:2024/05/24 05:16

SpringCloud的负载均衡

服务器端的负载均衡:在客户端向服务器端发送请求的时候,会先请求到负载均衡器,然后负载均衡器根据自身的算法来将请求转发给某台真正提供业务的服务器。然后该服务器将请求返回的数据给负载均衡器,再由负载均衡器将数据返回给客户端

客户端的负载均衡:在客户端的内部执行的一种算法,在向服务器端发送请求的时候,先执行自己的调度算法算出向哪台服务其发送请求,然后直接发送到该服务器。
特点:由客户端的内部程序实现,不需要额外的负载均衡器软硬件的投入。

springcloud的负载均衡有两种方式:

这篇先说Ribbon的负载均衡:

Ribbon实现客户端的负载均衡
Ribbon是一个基于Http和TCP客户端的负载均衡器。Ribbon可以通过客户端中配置的ribbonServerList服务端列表去轮训的访问以达到负载均衡的作用。当Ribbon和Eureka联合使用时,ribbonServerList会被DiscoveryEnableNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。

下面通过实例来使用Ribbon实现负载均衡。

首先需要有一个服务注册中心eureka-server,还需要两个服务提供方。然后建立一个新的springboot,叫做eureka-ribbon。

这里写图片描述

启动eureka-server,first-service,second-service 可以看到如下界面,两个服务提供方都叫COMPUTE-SERVICE已经被注册进去。

这里写图片描述

然后开始编写eureka-ribbon的项目

首先在pom.xml中加入如下代码:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.8.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在应用主类中加上@EnableDiscoveryClient注解来添加发现服务能力,然后创建RestTemplate实例,并通过@LoadBalanced注解来开启负载均衡的能力。

@EnableDiscoveryClient@SpringBootApplicationpublic class EurekaRibbonApplication {@Bean@LoadBalancedRestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(EurekaRibbonApplication.class, args);}}

创建ServiceController来消费service中的add服务,通过restTemplage对象来调用服务,计算10+20的值。

@RestControllerpublic class ServiceController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping(value = "/add",method = RequestMethod.GET)public String add(){return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20";,String.class).getBody();}}

在application.properties配置文件中配置eureka服务注册中心

spring.application.name=eureka-ribbonserver.port=3333eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

启动四个应该用,访问两次localhost:3333/add。
可以看到控制台的first-service和second-service各打印一行日志
打开服务端口为1111的可以看到:
这里写图片描述
打开服务端口为2222的可以看到:
这里写图片描述

可以看到,之前启动的两个first-service和second-service服务端分别被调用了一次。到这里,我们已经通过Ribbon在客户端已经实现了对服务调用的均衡负载

Ribbon的执行策略
1.RoundRobinRule(轮询模式) 轮询访问 如果有两个服务 那么就会先访问服务1然后再访问服务2 然后再是1和2 轮流访问。
2.RandomRule(随机策略) 随机调用服务来执行。
这里写图片描述

阅读全文
0 0
原创粉丝点击