写在前面:最好的文档是官网和源码。
一般来说负载均衡,分俩种。一种属于集中式负载均衡,在服务器和客户端之间提供独立的代理实现负载,有硬件的(如F5),也有软件的(Nginx);一种属于客户端负载均衡,客户端自己根据请求做负载,其实Ribbon就是Netflix开源的一种客户端负载均衡的工具。
Ribbon主要模块
- ribbon-balancer:负载均衡模块,可独立使用。内置的负载均衡算法都在里面,其实也可以自己实现IRule,自定义负载均衡策略。
- ribbon-eureka:集成Eureka的包。
- ribbon-core:核心包。
- ribbon-httpclient: 基于 Apache HttpClient 封装的REST客户端,集成了 ribbon-balancer 模块。
- ribbon-transport:基于Netty实现多协议的支持,比如:Http,Tcp,Udp等。
- ribbon-example:Ribbon代码的使用示例。
Ribbon的单独使用
- maven依赖
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-core</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-loadbalancer</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>1.0.10</version>
</dependency>
- main函数
public class RibbonTest {
public static void main(String[] args) {
// 服务列表
List<Server> serverList = Arrays.asList(new Server("localhost", 8081), new Server("localhost", 8083));
// 构建负载实例
BaseLoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
// loadBalancer.setRule(new RoundRobinRule());
loadBalancer.setRule(new RandomRule());
// 调用5次来测试效果
for (int i = 0; i < 5; i++) {
String result = LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).build()
.submit(new ServerOperation<String>() {
public Observable<String> call(Server server) {
try {
String addr = "http://" + server.getHost() + ":" + server.getPort() + "/house/data?name=";
System.out.println("调用地址:" + addr);
URL url = new URL(addr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
InputStream in = conn.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
return Observable.just(new String(data));
} catch (Exception e) {
return Observable.error(e);
}
}
}).toBlocking().first();
System.out.println("调用结果:" + result);
}
}
}
- 直接运行就行啦。
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8083/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
Ribbon整合Spring Cloud
其实上一章 Eureka 注册中心已经整合了Ribbon了,此次不再赘述。
网友评论