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

来源:互联网 发布:淘宝店usa商城是正品吗 编辑:程序博客网 时间:2024/06/13 22:23

在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;@RestControllerpublic 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=myclientserver.port=8086server.tomcat.accept-count=5000 server.tomcat.max-threads=5000server.tomcat.max-connections=5000

7、config.properties

myclient.ribbon.ReadTimeout=3000myclient.ribbon.ConnectTimeout=3000myclient.ribbon.ServerListRefreshInterval=2000myclient.ribbon.OkToRetryOnAllOperations=truemyclient.ribbon.MaxAutoRetriesNextServer=1myclient.ribbon.MaxAutoRetries=1#\u8868\u660E\u6709\u6548\u7684\u670D\u52A1\u5217\u8868myclient.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>

这里写图片描述

原创粉丝点击