微服务架构之均衡组件 Ribbon解析:应用进阶之Ribbon API
前面介绍了 Ribbon 的实现原理,本文将会主要介绍有关Ribbon
的高级应用,主要有Ribbon
的API使用,底层网络请求层的实现,和为已有spring系统集成Ribbon
功能。
Ribbon API
Ribbon
除了与RestTemplate
和Fegin
一同使用之外,还可以依靠自己独立的API接口来实现一定的代码逻辑。
比如下面的代码中,使用LoadBalancerBuilder
的buildFixedServerListLoadBalancer
创建出ILoadBalancer
实例,然后使用LoadBalancerCommand.Builder
的接口生成LoadBalancerCommand
实例来发送网络请求。通过调用LoadBalancerCommand
的submit
函数传入匿名的ServerOperation
来完成网络请求的发送。LoadBalancerCommand
的submit
函数中会使用你配置的负载均衡策略来选出一个服务器,然后调用匿名的ServerOperation
的call
函数,将选出的服务器传入,来进行网络传输的处理和操作。
FeignLoadBalancer
就是使用Ribbon
的LoadBalancerCommand
来实现的有关Feign
的网络请求的,只不过FeignLoadBalancer
将网络请求交给其Client
实例处理,而例子中的代码是交给HttpURLConnection
。
public class URLConnectionLoadBalancer {
private final ILoadBalancer loadBalancer;
private final RetryHandler retryHandler = new DefaultLoadBalancerRetryHandler(0, 1, true);
public URLConnectionLoadBalancer(List<Server> serverList) {
//使用LoadBalancerBuilder的接口来创建ILoadBalancer实例
loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
}
public String call(final String path) throws Exception {
//使用LoadBalancerCommand.Builder接口来配置Command实例,然后在回调函数中使用选中的服务器信息发送HTTP请求
return LoadBalancerCommand.<String>builder()
.withLoadBalancer(loadBalancer)
.withRetryHandler(retryHandler)
.build()
.submit(new ServerOperation<String>() {
@Override
public Observable<String> call(Server server) {
URL url;
try {
url = new URL("http://" + server.getHost() + ":" + server.getPort() + path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
return Observable.just(conn.getResponseMessage());
} catch (Exception e) {
return Observable.error(e);
}
}
}).toBlocking().first();
}
public LoadBalancerStats getLoadBalancerStats() {
return ((BaseLoadBalancer) loadBalancer).getLoadBalancerStats();
}
public static void main(String[] args) throws Exception {
URLConnectionLoadBalancer urlLoadBalancer = new URLConnectionLoadBalancer(Lists.newArrayList(
new Server("www.google.com", 80),
new Server("www.linkedin.com", 80),
new Server("www.yahoo.com", 80)));
for (int i = 0; i < 6; i++) {
System.out.println(urlLoadBalancer.call("/"));
}
System.out.println("=== Load balancer stats ===");
System.out.println(urlLoadBalancer.getLoadBalancerStats());
}
}
读者使用Ribbon
独立的API可以在任何项目中使用Ribbon
所提供的负载均衡机制。
除此之外,Ribbon
除了可以和RestTemplate
,Feign
一起使用之外,还可以与Netty
进行集成,也就是说,Ribbon
使用负载均衡策略选择完服务器之后,然后再交给Netty
进行网络请求。
下一篇文章将会介绍使用Netty发送网络请求。
- 点赞
- 收藏
- 关注作者
评论(0)