微服务架构之均衡组件 Ribbon解析:应用进阶之Ribbon API
【摘要】 前面介绍了 Ribbon 的实现原理,本文将会主要介绍有关Ribbon的高级应用,主要有Ribbon的API使用,底层网络请求层的实现,和为已有spring系统集成Ribbon功能。 Ribbon APIRibbon除了与RestTemplate和Fegin一同使用之外,还可以依靠自己独立的API接口来实现一定的代码逻辑。比如下面的代码中,使用LoadBalancerBuilder的buil...
前面介绍了 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发送网络请求。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)