Ribbon :负载均衡
负载均衡
分布式系统中,客户端需要调用提供者,提供者在多态注册中心中存在,客户端任意调用一个服务器均可以完成;为了使每一台注册中心不用太忙也不要太闲,可以负载均衡调用每一台注册中心,可以提升网站的健壮性。
常见的负载均衡的算法
- 轮询:为第一个请求选择正常运行中的注册中心的第一台服务(注册中心),然后按顺序依次往后选择,直到最后一个,然后循环
- 最小连接:优先选择连接数最小的,即压力最小的后端服务器;在会话较长情况下可以考虑此方法。
- 散列:根据请求源的ip的散列(hash)来选择要转发的服务器;这种方法可以在一定程度上保证特定用户能连接到相同的服务器。
集成ribbon(以客户端的形式)
1)导入依赖,之后还要从服务中心获取信息,所以Eureka的依赖也需要(客户端的Eureka)
<!--Ribbon-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Eureka-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2)编写配置
server:
port: 80
#Eureka配置
eureka:
client:
register-with-eureka: false #不向eureka注册自己(我们是去拿信息)
service-url: #可以从这三个注册中心拿
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/
3)让Eureka生效
/**
* Ribbon 和 Eureka 整合以后,客户端可以直接调用,不用关心IP地址和端口号
*/
@SpringBootApplication
@EnableEurekaClient //Eureka客户端
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
4)配置负载均衡实现restTemplate
@Configuration //@Configuration 相当于spring里面的 applicationContext.xml
public class ConfigBean {
//配置负载均衡实现RestTemplate
@Bean
@LoadBalanced //Ribbon
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
通过Ribbon去实现负载均衡的时候,controller里的跳转地址应该是一个变量(即服务提供者的id),之后启动就可以了
//Ribbon,我们这里的地址,应该是一个变量,通过服务名来访问
//private static final String REST_URL_PERFIx="http://localhost:8001";
private static final String REST_URL_PERFIx="http://SPRINGCLOUD-PRIVIDER-DEPT";
以上是只用了一个数据库,我们也可使用多个数据试一下,有多个数据库的情况下,Ribbon会使用算法负载均衡,以便算出要访问那个数据库。如下图