SpringCloud的负载均衡Ribbon和Feign(客户端的负载均衡)

这篇先说Ribbon的负载均衡:

Ribbon实现客户端的负载均衡

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

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

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

SpringCloud的负载均衡Ribbon和Feign(客户端的负载均衡)_第1张图片
image.png

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

SpringCloud的负载均衡Ribbon和Feign(客户端的负载均衡)_第2张图片
image.png

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

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

org.springframework.boot

spring-boot-starter-parent

1.5.8.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-test

test

org.springframework.cloud

spring-cloud-starter-hystrix

org.springframework.cloud

spring-cloud-starter-eureka

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-ribbon

org.springframework.boot

spring-boot-maven-plugin

org.springframework.cloud

spring-cloud-dependencies

Dalston.SR1

pom

import

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

@EnableDiscoveryClient

@SpringBootApplication

public class EurekaRibbonApplication {

@Bean

@LoadBalanced

RestTemplate restTemplate(){

return new RestTemplate();

}

public static void main(String[] args) {

SpringApplication.run(EurekaRibbonApplication.class, args);

}

}

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

@RestController

public class ServiceController {

@Autowired

private 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-ribbon

server.port=3333

eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

启动四个应该用,访问两次localhost:3333/add。

可以看到控制台的first-service和second-service各打印一行日志

打开服务端口为1111的可以看到:

image.png

打开服务端口为2222的可以看到:

image.png

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

Ribbon的执行策略

1.RoundRobinRule(轮询模式) 轮询访问 如果有两个服务 那么就会先访问服务1然后再访问服务2 然后再是1和2 轮流访问。

2.RandomRule(随机策略) 随机调用服务来执行。

SpringCloud的负载均衡Ribbon和Feign(客户端的负载均衡)_第3张图片
image.png

3.BestAvailableRule(并发量)

Feign负载均衡

原理:在启动时,Feign会扫描带有注解@FeignClient的接口,生成代理,并注册到spring容器,生成代理时会给每个接口方法创建一个RequestTemplate对象,这个对象封装了http请求的所有信息,请求参数名、请求方法等信息都是在这个过程中确定的。

Feign是一种声明式、模板化的HTTP客户端,

 在启动类上需要加上注解,首先是@EnableDiscoveryClient注解,然后再加上@EnableFeignClients注解来开启Feign功能。

 在使用feign做负载均衡的时候 需要创建一个接口,不需要编写这个接口的实现类,然后再在接口上加上@FeignClient注解,里面的name属性对应的为需要调用的服务的名字。

 然后需要编写接口内的方法,可以在这个方法上添加@RequestMapping的注解value指定方法的名字,method指定请求的方式,get,post等、restful风格

 在web层中使用@Autowired注解来注入那个接口的实例,在方法上使用@RequestMapping注解来注解名字和发送方式,然后调用接口里的方法即可。

 在application.properites的配置文件里,只需要指定注册中心的url,服务的名字,以及端口号即可。

你可能感兴趣的:(SpringCloud的负载均衡Ribbon和Feign(客户端的负载均衡))