SpringCloud(五)——Ribbon负载均衡器

SpringCloud(五)——Ribbon负载均衡器

实现一个简单的自定义规则负载均衡器

新建一个项目user-ribbon,源代码以下java

pom.xmlweb

<?xml version="1.0" encoding="UTF-8"?>
<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.zgy.cloud</groupId>
	<artifactId>user-ribbon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>user-ribbon</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.14.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

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

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

		<dependency>
			<groupId>com.netflix.ribbon</groupId>
			<artifactId>ribbon-core</artifactId>
			<version>2.2.2</version>
		</dependency>

		<dependency>
			<groupId>com.netflix.ribbon</groupId>
			<artifactId>ribbon-httpclient</artifactId>
			<version>2.2.2</version>
		</dependency>

		<dependency>
			<groupId>com.netflix.ribbon</groupId>
			<artifactId>ribbon-loadbalancer</artifactId>
			<version>2.2.2</version>
		</dependency>

		<dependency>
			<groupId>com.netflix.archaius</groupId>
			<artifactId>archaius-core</artifactId>
			<version>0.7.4</version>
		</dependency>

		<dependency>
			<groupId>commons-configuration</groupId>
			<artifactId>commons-configuration</artifactId>
			<version>1.10</version>
		</dependency>

		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>18.0</version>
		</dependency>

		<dependency>
			<groupId>com.netflix.archaius</groupId>
			<artifactId>archaius-core</artifactId>
			<version>0.7.4</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

UserRibbonApplication.javaspring

package com.zgy.cloud.userribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UserRibbonApplication {

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

LBMain.javaapache

package com.zgy.cloud.userribbon;

import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.ArrayList;
import java.util.List;

public class LBMain {

    public static void main(String[] args) {

        //建立一个负载均衡器的对象
        ILoadBalancer lb = new BaseLoadBalancer();
        //定义一个服务器列表
        List<Server> servers = new ArrayList<>();
        servers.add(new Server("localhost",8080));
        servers.add(new Server("localhost",8081));
        //将服务器列表加入负载均衡器中
        lb.addServers(servers);
        //测试
        for(int i=0; i<10; i++){
            //根据指定规则来获取服务器
            Server server = lb.chooseServer(null);
            System.out.println("server:"+server);
        }
    }
}

运行main方法,运行结果如图json

1532699780027

MyRule.java 自定义负载均衡规则服务器

package com.zgy.cloud.userribbon;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.Random;

public class MyRule implements IRule{

    private ILoadBalancer lb;

    @Override
    public Server choose(Object o) {
        //自定义负载均衡规则
        Random r = new Random();
        int i = r.nextInt(10);

        //获取到所有的服务器
        List<Server> servers = lb.getAllServers();

        if(i > 7){
            return getServerByPort(servers,8080);
        }else{
          return getServerByPort(servers,8081);
        }
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.lb = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return this.lb;
    }

    private Server getServerByPort(List<Server> servers, int port){
        for(Server server : servers){
            if(server.getPort() == port){
                return server;
            }
        }
        return null;
    }
}

TestMyRule.javaapp

package com.zgy.cloud.userribbon;

import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.ArrayList;
import java.util.List;

public class TestMyRule {

    public static void main(String[] args) {

        //建立一个负载均衡器的对象
        BaseLoadBalancer lb = new BaseLoadBalancer();
        //建立一个MyRule对象
        MyRule myRule = new MyRule();
        myRule.setLoadBalancer(lb);

        //设置负载均衡规则
        lb.setRule(myRule);

        //定义一个服务器列表
        List<Server> servers = new ArrayList<>();
        servers.add(new Server("localhost",8080));
        servers.add(new Server("localhost",8081));

        //将服务器列表加入负载均衡器中
        lb.addServers(servers);

        //测试
        for(int i=0; i<10; i++){
            //根据指定规则来获取服务器
            Server server = lb.chooseServer(null);
            System.out.println("server:"+server);
        }
    }
}

运行main方法,运行结果如图负载均衡

1532699924284

实现一个能正常发送请求的负载均衡器

建立一个项目ribbon-service,源代码以下dom

pom.xmlmaven

<?xml version="1.0" encoding="UTF-8"?>
<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.zgy.cloud</groupId>
	<artifactId>ribbon-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>ribbon-service</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.14.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

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

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

RibbonServiceApplication.java

package com.zgy.cloud.ribbonservice;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

import java.util.Scanner;

@SpringBootApplication
public class RibbonServiceApplication {

	public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String port = scanner.next();
        new SpringApplicationBuilder(RibbonServiceApplication.class).properties("server.port="+port).run(args);
	}
}

Person.java

package com.zgy.cloud.ribbonservice;

public class Person {

    private Integer id;
    private String name;
    private String message;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

MyController.java

package com.zgy.cloud.ribbonservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class MyController {

    @GetMapping("/person")
    public Person getPerson(HttpServletRequest request){
        Person person = new Person();
        person.setId(1);
        person.setName("ZGY");
        person.setMessage(request.getRequestURL().toString());

        return person;
    }
}

在项目user-ribbon中添加TestRibbon.java,源代码以下

TestRibbon.java

package com.zgy.cloud.userribbon;

import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.niws.client.http.RestClient;

import java.net.URI;

public class TestRibbon {

    public static void main(String[] args) throws Exception{

        //设置负载均衡器服务列表
        ConfigurationManager.getConfigInstance().setProperty(
                "person-client.ribbon.listOfServers", "localhost:8080,localhost:8081");
        //设置负载均衡器规则
        ConfigurationManager.getConfigInstance().setProperty(
                "person-client.ribbon.NFLoadBalancerRuleClassName", MyRule.class.getName());
        RestClient client = (RestClient) ClientFactory.getNamedClient("person-client");
        HttpRequest request = HttpRequest.newBuilder().uri(new URI("/person")).build();
        for (int i = 0; i < 10; i++)  {
            HttpResponse response = client.executeWithLoadBalancer(request);
            String json = response.getEntity(String.class);
            System.out.println(json);
        }
    }
}

运行mian方法,获得如图所示的结果

1532700858105

1532700877006

1532700900734

由控制台打印的信息,咱们能够看出咱们本身定义的负载均衡规则已经生效,而且能正常访问服务

Ribbon内置的几个负载均衡规则

1532701174793

以上的规则,能够百度一下

Ribbon的其余配置

1532701284861

以上的配置,能够百度一下

相关文章
相关标签/搜索