SpringCloud(五)——Ribbon负载均衡器
2018-07-27 22:26
561 查看
SpringCloud(五)——Ribbon负载均衡器
实现一个简单的自定义规则负载均衡器
新建一个项目user-ribbon,源代码如下pom.xml
<?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.java
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.java
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方法,运行结果如图
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.java
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方法,运行结果如图
实现一个能正常发送请求的负载均衡器
创建一个项目ribbon-service,源代码如下pom.xml
<?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方法,得到如图所示的结果
由控制台打印的信息,我们可以看出我们自己定义的负载均衡规则已经生效,并且能正常访问服务
Ribbon内置的几个负载均衡规则
以上的规则,可以百度一下
Ribbon的其他配置
以上的配置,可以百度一下
相关文章推荐
- Spring-Cloud-Ribbon -- 客户端负载均衡器
- Spring Cloud Ribbon的原理-负载均衡器
- Spring Cloud Ribbon负载均衡器处理方法
- 疯狂Spring Cloud连载(7)——Ribbon负载均衡器
- 为Spring Cloud Ribbon配置请求重试(Camden.SR2+)
- Spring Cloud Ribbon实现客户端负载均衡
- springcloud实战之5 服务消费者(ribbon)
- springcloud使用ribbon实现客户端负载均衡
- spring cloud ribbon 服务发现(三)
- springcloud(第六篇)springcloud ribbon
- SpringCloud+Ribbon(负载均衡)
- 【Spring Cloud】Ribbon负载均衡
- [bigdata-109] spring-cloud-05 分布式服务的ribbon消费者
- Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡
- Spring Cloud(三):服务消费Ribbon
- SpringCloud(四)服务发现与消费:以ribbon为例
- Spring Cloud构建微服务架构:服务消费(Ribbon)【Dalston版】
- Spring Cloud(三)服务提供者 Eureka + 服务消费者(rest + Ribbon)
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
- 【Spring Cloud】Ribbon负载均衡