一、Ribbon简介
是Netfix发布的负载均衡,Eureka一般配合Ribbon进行使用,基于HTTP和TCP的客户端负载均衡工具。
只有负载均衡的能力,不具有发送请求的能力,要配合服务通信组件。
RestTemplate 针对各种类型的 HTTP 请求都提供了相应的方法进行处理,例如 HEAD、GET、POST、PUT、DELETE 等类型的 HTTP 请求,
分别对应 RestTemplate 中的 headForHeaders()、getForObject()、postForObject()、put() 以及 delete() 方法。
Feign组件已使用Ribbon。Ribbon 客户端组件提供连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。
1、工作流程
1.获取拦截到的请求路径;
2.获取主机名(服务名称);
3.根据服务名称找Eureka获取服务列表;
4.使用负载均衡算法选择服务实例;
5.发送请求并获取返回值。
服务器端负载均衡:如Nginx、F5,请求达到服务器后由负载均衡根据算法将请求转发到目标服务器进行处理。
客户端负载均衡:如Ribbon,服务消费者会获取一个服务器地址列表,调用前根据负载均衡的算法进行选择某个服务器,然后进行调用。
2、通信的三种方式
1.DiscoveryClient + 自己实现负载均衡 + RestTemplate;
2.LoadBalanceClient + RestTemplate;
3.@LoadBalanced + RestTemplate。
3、负载均衡策略
简单轮询负载均衡、加权响应时间负载均衡、区域感知轮询负载均衡、随机负载均衡;
二、使用
1、客户端引入依赖
<!--Spring Cloud Ribbon 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2、配置负载均衡策略
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RetryRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean {
@Bean //将 RestTemplate 注入到容器中
@LoadBalanced //在客户端使用 RestTemplate 请求服务端时,开启负载均衡(Ribbon)
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
3、启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MicroServiceCloudConsumerDept80Application {
public static void main(String[] args) {
SpringApplication.run(MicroServiceCloudConsumerDept80Application.class, args);
}
}
4、代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class MyTestController {
//面向微服务编程,即通过微服务的名称来获取调用地址。使用注册到 Spring Cloud Eureka 服务注册中心中的服务,即 application.name。
private static final String REST_URL_PROVIDER_PREFIX = "http://MICROSERVICECLOUDPROVIDERDEPT";
//RestTemplate 是一种简单便捷的访问 restful 服务模板类,是 Spring 提供的用于访问 Rest 服务的客户端模板工具集,提供了多种便捷访问远程 HTTP 服务的方法
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/get/{id}")
public String get(@PathVariable("id") Integer id) {
return restTemplate.getForObject(REST_URL_PROVIDER_PREFIX + "/dept/get/" + id, Dept.class);
}
}