您的位置:首页 > 编程语言 > Java开发

spring-cloud-ribbon负载均衡(一)

2017-08-21 10:36 666 查看
在dubbo项目中, zookeeper即注册中心帮我们实现了调度和负载均衡的能力, 这种方式被称为服务器端的负载均衡, springcloud中, 使用ribbon实现的客户端负载均衡



1、Eureka为所有Netflix服务提供服务注册。Ribbon客户端的创建和配置为每个目标服务执行。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:

(1) 简单轮询负载均衡

(2) 加权响应时间负载均衡

(3) 区域感知轮询负载均衡

(4) 随机负载均衡

2、ribbon用以实现负载均衡;实现软负载均衡,核心有三点:

服务发现,发现依赖服务的列表

服务选择规则,在多个服务中如何选择一个有效服务

服务监听,检测失效的服务,高效剔除失效服务



3、代码结构



使用@RibbonClients注解 ,在getServerList方法中,首先获取ZoneAwareLoadBalancer,然后获取serverList,获取到serverList以后即可选择一个有效服务进行调度(默认轮询)

4、application

package com.wei.qin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.ribbon.RibbonClients;

/**
* ribbon启动
*
* @auther dwx
*
* 2017年8月21日
*/
@SpringBootApplication
@RibbonClients
public class RibbonApplication {

public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}


5、controller

package com.wei.qin;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;

@RestController
public class ConfigController {

@Autowired
private SpringClientFactory clientFactory;

@SuppressWarnings("unchecked")
@RequestMapping("/ribbon")
@ResponseBody
public String getServerList() throws Exception {
ZoneAwareLoadBalancer<Server> lb = (ZoneAwareLoadBalancer<Server>) clientFactory.getLoadBalancer("myclient");
ServerList<Server> serverList = lb.getServerListImpl();
List<Server> serverDetailList = serverList.getInitialListOfServers();
StringBuilder sfd = new StringBuilder();
if (!CollectionUtils.isEmpty(serverDetailList)) {
for (Server s : serverDetailList) {
sfd.append(s.getHost()).append(",").append(s.getHost()).append("\n");
}
} else {
sfd.append("no message");
}
return sfd.toString();
}
}


6、application.properties

ribbon.client.name=myclient
server.port=8086

server.tomcat.accept-count=5000
server.tomcat.max-threads=5000
server.tomcat.max-connections=5000


7、config.properties

myclient.ribbon.ReadTimeout=3000
myclient.ribbon.ConnectTimeout=3000
myclient.ribbon.ServerListRefreshInterval=2000
myclient.ribbon.OkToRetryOnAllOperations=true
myclient.ribbon.MaxAutoRetriesNextServer=1
myclient.ribbon.MaxAutoRetries=1

#\u8868\u660E\u6709\u6548\u7684\u670D\u52A1\u5217\u8868
myclient.ribbon.listOfServers=www.baidu.com:80,www.163.com:80,www.csdn.net:80


8、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>com.wei.qin</groupId>
<artifactId>springcloudribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springcloudribbon</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix</artifactId>
<version>1.0.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
</project>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: