# 《高性能Polaris网关》实战负载均衡-第01节:实战通过SPI加载负载均衡策略访问后端服务
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本节难度:★★★☆☆
- 本节重点:实战通过自定义SPI加载的各种负载均衡策略访问后端服务,深入理解高性能Polaris网关负载均衡策略的核心设计与实现。重点掌握整体调用链路的设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
截止到目前,我们已经实现了网关的最基础与最核心的功能,主要包括:需求设计、总体架构设计、环境搭建、通用模型设计与实现、基于自定义SPI设计与实现通用过滤器、高性能BatchEvent模式与MPMC模式缓冲队列通用处理器的设计与实现、HTTP核心处理器的设计与实现和网关核心启动容器的设计与实现,同时,也对注册中心、负载均衡策略和增强型负载均衡策略进行了设计与实现。
专栏已上线,点击学习:https://binghe.gitcode.host/md/project/gateway/start/2024-05-19-start.html (opens new window)
期间,也设计和实现了众多的网关组件。那如何检验我们自己手搓的高性能网关的各种负载均衡策略是否满足需求呢?最好的方式就是网关通过自定义SPI加载各种负载均衡策略访问后端服务的接口验证下网关的功能是否符合我们的预期。
# 一、背景
截止到目前,我们完成了《高性能Polaris网关》的十二大篇章的设计与实现,也对代码进行了深度的设计与封装实现,代码结构如下图所示。

在需求设计篇章: 详细设计了高性能Polaris网关的需求,对网关要实现的功能和性能进行了明确的定义和设计。
在总体架构设计篇章: 详细设计了网关的总体方案目标、架构设计和网关的数据模型。
在环境搭建篇章: 详细搭建了网关的基础环境与研发环境、搭建了项目总体框架与工程结构并详细搭建了Maven私服仓库用来开发高性能Polaris网关。
在通用模型设计篇章: 完成了整个通用模型的设计,为整个Polaris网关后续的设计和研发奠定了坚实的基础。相信小伙伴们对网关已经并不陌生,一个网关本质上最基础和最核心的功能就是接收客户端请求,根据一定的策略将请求转发至后端服务,随后接收后端服务的响应结果,再将结果响应给客户端。在此基础上,网关可以实现各种策略功能,例如:限流、熔断、降级、重试、负载均衡、流控、灰度、蓝绿发布等等一系列的功能。
在通用过滤器设计篇章: 对网关的顶级核心过滤器接口进行了设计和实现,也进一步封装了请求和响应的模型,对网关过滤器的两大顶级抽象类和整体过滤器链进行了设计和实现。基于自定义SPI实现了负载均衡过滤器、超时配置过滤器、HTTP过滤器、RPC过滤器、指标分析过滤器、Mock过滤器、灰度过滤器、错误处理过滤器。
注意:网关通过SPI内置了各种过滤器的实现,如果网关内置的过滤器不满足需求,大家也可以通过SPI扩展自己特定场景的过滤器。
在通用处理器篇章: 在网关的处理器设计中,我们重点设计和实现了通用处理器接口,基于Netty实现了核心处理器的功能,并且基于BatchEvent和MPMC两种模式实现了缓冲队列。在此基础上,基于自定义SPI扩展实现了BatchEvent模式处理器和MPMC模式处理器。在实现缓冲队列时,重点参考了JDK的队列实现,并且在JDK队列实现的基础上,做了进一步优化。所以,各位小伙伴们在学习自定义缓冲队列时,可以结合JDK的Queue接口及其实现类等深入学习和理解。
在HTTP处理器篇章: 对HTTP处理器的核心接口、服务端核心处理器与连接管理器进行了设计与实现,并且基于Netty对网关的服务端和客户端进行了设计与实现。其他服务或者客户端可以通过HTTP协议、RPC协议和WebSocket协议访问网关。
在核心启动流程篇章: 对网关的核心启动容器与核心启动加载流程进行了设计与实现。
在牛刀小试篇章: 实战通过高性能Polaris网关成功访问后端服务。
在注册中心篇章: 基于自定义SPI实现了Nacos注册中心、Zookeeper注册中心,并且为了提升小伙们对网关项目的参与感,搭建代码框架交由小伙伴们实现Etcd注册中心和Consul注册中心。同时,对网关整合注册中心实现服务注册与发现进行了详细的设计与实现。
在负载均衡篇章: 基于自定义SPI实现了随机算法、加权随机算法、轮询算法、加权轮询算法、哈希算法、加权哈希算法、源IP地址哈希算法、加权源IP地址哈希算法、一致性哈希算法等多种负载均衡策略。
在增强型负载均衡篇章: 基于自定义SPI实现了增强型随机算法、增强型轮询算法、增强型哈希算法、增强型源IP地址哈希算法和增强型一致性哈希算法等多种负载均衡策略。
# 二、本节重点
整合负载均衡策略实战访问后端服务,深入理解高性能Polaris网关负载均衡策略的核心设计与实现。重点掌握整体调用链路的设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
# 三、实战场景
本节,主要验证通过自定义SPI加载各种负载均衡策略实现访问后端服务接口。
- 基于自定义SPI加载轮询算法负载均衡策略实现访问后端服务接口。
- 只启动后端服务,直接访问后端服务接口,正确返回hello polaris。
- 启动网关和后端服务,通过网关访问后端服务接口,正确返回hello polaris。
- 停止后端服务,通过网关访问后端服务接口,返回503:后端服务暂时不可用,请稍后再试。
# 四、服务规划
实战通过高性能Polaris网关访问后端服务的规划如下所示。
服务名 | 服务说明 | 端口 | 接口 |
---|---|---|---|
polaris-examples-http | 后端服务 | 8080 | /http_test |
polaris-examples-http-gateway | 网关服务 | 10000 | 访问polaris-examples-http的接口用来测试 |
# 五、路由实现
这里,需要修改下负载均衡路由的代码,在负载均衡路由中通过自定义SPI加载各种负载均衡策略,实现通过负载均衡的方式访问后端服务。
源码详见:polaris-filter-pre-loadbalancer工程下的io.binghe.polaris.filter.pre.loadbalancer.LoadBalancerFilter。
(1)新增serviceLoadBalancerMap成员变量
serviceLoadBalancerMap主要用来缓存通过自定义SPI加载的负载均衡实例,如下所示。
private final Map<String, ServiceLoadBalancer<ServiceInstance>> serviceLoadBalancerMap = new ConcurrentHashMap<>();
(2)修改executeHttpLoadBalance()方法
executeHttpLoadBalance()方法主要是通过负载均衡的方式访问后端HTTP接口的方法,修改后的方法如下所示。
private void executeHttpLoadBalance(RequestResponseContext requestResponseContext, String balanceType) {
HttpPolarisRequest request = requestResponseContext.getRequest();
String uniqueId = request.getUniqueId();
Set<ServiceInstance> serviceInstances = ConfigCacheFactory.getInstance().getServiceInstanceByUniqueId(uniqueId, requestResponseContext.isGray());
requestResponseContext.putAttribute(AttributeKeyFactory.getMatchInstances(), serviceInstances);
ServiceLoadBalancer<ServiceInstance> serviceLoadBalancer = serviceLoadBalancerMap.get(balanceType);
if (serviceLoadBalancer == null){
serviceLoadBalancer = serviceLoadBalancerMap.computeIfAbsent(balanceType, (t) -> ExtensionLoader.getExtension(ServiceLoadBalancer.class, balanceType));
}
ServiceInstance serviceInstance = serviceLoadBalancer.select(new ArrayList<>(serviceInstances), request.hashCode(), request.getClientIp());
String targetAddress = serviceInstance.getAddress().concat(":").concat(String.valueOf(serviceInstance.getPort()));
requestResponseContext.getMudifyRequest().setRequestHost(targetAddress);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
可以看到,在executeHttpLoadBalance()方法中已经实现了通过自定义SPI加载负载均衡策略,在服务实例列表中,通过负载均衡策略选择其中一个服务实例。
# 六、测试场景验证
接下来,对网关的测试场景进行验证。
场景一: 基于自定义SPI加载轮询算法负载均衡策略实现访问后端服务接口。
分别启动后端服务和网关,在轮询算法负载均衡策略的实现方法上打上断点。也就在polaris-loadbalancer-round-robin工程的io.binghe.polaris.loadbalancer.round.robin.RobinServiceLoadBalancer#select方法打上断点,如下所示。

通过Apifox访问http://localhost:10000/http_test,如下所示。

点击发生按钮,可以看到访问会正确进入代码断点,如下所示。

可以看到,已经正确执行到自定义SPI加载的轮询负载均衡策略。
放过断点,可以看到,正确返回了hello polaris。

场景二: 只启动后端服务,直接访问后端服务接口,正确返回hello polaris。
只启动后端服务后,通过Apifox访问http://localhost:8080/http_test,如下所示。

测试结果符合预期,正确返回了hello polaris字符串。
场景三: 启动网关和后端服务,通过网关访问后端服务接口,正确返回hello polaris。
启动网关和后端服务后,通过Apifox访问http://localhost:10000/http_test,如下所示。

测试结果符合预期,正确返回了hello polaris字符串。
场景四: 停止后端服务,通过网关访问后端服务接口,返回503:后端服务暂时不可用,请稍后再试。
停止后端服务后,通过Apifox访问http://localhost:10000/http_test,如下所示。

测试结果符合预期,正确返回了503:后端服务暂时不可用,请稍后再试。
# 七、本节总结
本节,主要实战的形式通过自定义SPI加载的各种负载均衡策略访问后端服务,对典型的正常和异常场景都进行了验证,结果都符合预期效果。
希望这节内容能够为大家带来实质性的收获,最后,可以在评论区写下你学完本章节的收获,祝大家都能学有所成,我们一起搞定高性能Polaris网关。
# 八、写在最后
在冰河的知识星球除了目前正在热更的高性能网关和RPC视频外,还有其他9个项目,像DeepSeek大模型、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、分布式IM即时通讯系统、Sekill分布式秒杀系统、手写RPC、简易商城系统等等,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。
值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。 你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。

目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件项目》、《手写简易商城脚手架项目》、《手写高性能RPC项目》和《Spring6核心技术与源码解析》、《实战高并发设计模式》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》和《手写高性能Polaris网关》,从零开始介绍原理、设计架构、手撸代码。
花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!
加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。
另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!
# 九、其他方式加入星球
- 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
- 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。
特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。
好了,今天就到这儿吧,我是冰河,我们下期见~~