【spring cloud hoxton】Ribbon 真的能被 spring-cloud-loadbalancer 替代吗
背景
-
早上刷圈看到 Spring Cloud Hoxton.M2 Released 的消息,随手发布到了我的知识星球,过了会有个朋友过来如下问题。 抽取半天时间学习spring-cloud-loadbalancer 的源码,整理出此文总结
-
Spring Cloud Hoxton.M2 是第一个整合新的loadbalancer实现来替代Ribbon的版本
Spring Cloud Hoxton.M2 is the first release containing both blocking and non-blocking load balancer client implementations as an alternative to Netflix Ribbon which has entered maintenance mode.
- spring-cloud-loadbalancer 的渊源
- 2017年spring 开始尝试开发新的项目
spring-cloud-loadbalancer
替代ribbon,项目托管在 spring-cloud-incubator 孵化器 (多提一嘴,spring cloud alibaba 等顶级的项目大多从此孵化出来的,代表着 spring cloud 的发展方向) - 经过N个月的不维护,还以为spring 放弃此项目时,突然把此项目标记成归档迁移到spring-cloud-commons
- 发布2.2.0.M2 版本
如何使用
- 这里基于 最新的hoxton.m2 版本才可以使用,所以要配置spring的代理maven库
<dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-dependencies</artifactid> <version>Hoxton.M2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencymanagement>
- 加入nacos-client ,使用 2.1.0版本,特别注意排除 ribbon依赖,不然loadbalancer 无效
<dependency> <groupid>com.alibaba.cloud</groupid> <artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid> <exclusions> <exclusion> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-netflix-ribbon</artifactid> </exclusion> </exclusions> </dependency>
- 加入 loadbalancer pom坐标
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-loadbalancer</artifactid> </dependency>
- 配置使用还是和 ribbon 一样配置
@Configuration public class LbConfiguration { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } @GetMapping("/demo") public String doOtherStuff() { return restTemplate.getForObject("http://big-provider-server/demo", String.class); }
源码解析
LoadBalancerClient 实现
- 目前版本只提供了 BlockingLoadBalancerClient 的实现, 注意看中文注释
// 删除只保留了核心代码注意 public class BlockingLoadBalancerClient implements LoadBalancerClient { @Override public <t> T execute(String serviceId, LoadBalancerRequest<t> request) throws IOException { // 根据 服务名称去查询可用实例 ServiceInstance serviceInstance = choose(serviceId); return execute(serviceId, serviceInstance, request); } @Override public ServiceInstance choose(String serviceId) { // 获取负载均衡策略 ReactiveLoadBalancer<serviceinstance> loadBalancer = loadBalancerClientFactory .getInstance(serviceId); // 执行负载均衡策略获取可以实例 Response<serviceinstance> loadBalancerResponse = Mono.from(loadBalancer.choose()) .block(); return loadBalancerResponse.getServer(); } }
loadBalancer 负载均衡策略实现
- 目前只有一个RoundRobinLoadBalancer 轮询选择server的方式
public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { public Mono<response<serviceinstance>> choose(Request request) { ServiceInstanceSupplier supplier = this.serviceInstanceSupplier.getIfAvailable(); return supplier.get().collectList().map(instances -> { if (instances.isEmpty()) { log.warn("No servers available for service: " + this.serviceId); return new EmptyResponse(); } // TODO: enforce order? int pos = Math.abs(this.position.incrementAndGet()); ServiceInstance instance = instances.get(pos % instances.size()); return new DefaultResponse(instance); }); } }
和ribbon 比较
默认负载均衡比较
- ribbon 提供7中默认的负载均衡策略,常见的常见都有覆盖,一般我们都是使用
ZoneAvoidanceRule
复合判断server所在区域的性能和server的可用性选择server
配置方面丰富性
- 目前
spring-cloud-loadbalancer
仅支持 重试操作的配置 - ribbon 支持超时、懒加载处理、重试及其和 hystrix整合高级属性等
结论
-
老老实实用 ribbon
-
欢迎关注 基于Spring Boot 2.1.7、 Spring Cloud Greenwich.SR2、 OAuth2 的RBAC 权限管理系统
-
欢迎关注我们获得更多的好玩JavaEE 实践
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
企业使用数据库的12种姿势
数据库,作为IT系统的基础类软件,发挥着非常巨大的作用。那么企业在使用数据库时,有什么样的方式可以选择?不同方式又各有其什么特点呢?本文将从使用方式、适用场景、未来发展、成本因素(人力、财务、时间)及风险点等多角度分析十二种情况(前六种为本地方式,后六种为云端方式)。 方式1:商业数据库 + 商业服务 这是比较传统的一种方式。企业购买大型商业数据库软件,并对应购买服务支持工作。在过去三、四十年里,这是主流的一种使用方式。可以说也很好地满足了各类企业的快速发展。只是随着近二十年来,互联网化的变革,对此种方式产生了不小的冲击。 这种方式适合传统企业,对数据库要求较高,自有技术能力有限,未来发展相对固定的情况,未来发展随着商业数据库的发展而变化,从总体来看,未来云化的需求对其冲击较大。此外,在国产化、自主可控化等要求下,也会对这个模式影响较大。 成本因素 从人力成本角度来看,整体投入不大,主要是由厂商提供。自有人员主要是完成审核、评估等工作。从财务成本分析,是几个方案中,相对最高的一种。经常见到“某国有银行,年度数据库采购xxxx万元的新闻”见诸报端。 正因为财力投入较大,这种方式也一般仅限...
- 下一篇
Cassandra Java堆外内存排查经历全记录
背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆外内存使用超出预期,导致RES增加,才可能触发OOM。 调查过程 0.初步怀疑是哪里有DirectBuffer泄漏,或者JNI库的问题。 1.按惯例通过google perftools追踪堆外内存开销,但是并未发现明显的异常。 2.然后用Java NMT 看了一下,也没有发现什么异常。 3.查到这里思路似乎断了,因为跟DirectBuffer似乎没啥关系。这时候我注意到进程虚拟内存非常高,已经超过ECS内存了。怀疑这里有些问题。 4.进一步通过/proc/pid/smaps 查看进程内存地址空间分布,发现有大量mmap的文件。这些文件是cassandra的数据文件。 此时这些mmap file 虚拟内存是2G,但是物理内存是0(因为我之前重启过,调低过内存防止进程挂掉影响问题排查)。 显然mmap的内存开销是不受JVM ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Red5直播服务器,属于Java语言的直播服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作