使用 Feign、SSL 和负载平衡器创建 Spring 个客户端

Creating Spring client with Feign, SSL and Load Balancer

是否有可能:

Spring 使用 SSL 和负载均衡器伪装

我无法找到有关创建基于接口的现代 Spring 客户端的综合知识来源,而无需编写大量样板代码。现在,我学到了很多东西,我想与我的小项目分享如何创建这样的东西,而不是让你的头撞到墙上,但让我们从头开始。

先决条件

我们需要一些功能,例如:

  • Java 11 或更高。
  • Maven(3.6.3就够了)
  • Spring(2.6.5是我的入门版)
  • 对 SSL 的了解很少。

TL;DR 给我一些代码

您可以从 this 存储库下载整个项目。所有依赖项、文件、配置都包含在内,并且可以按原样启动。您只需要指定客户端、一种类型的两个实例和另一种类型的两个实例 API 即可查看工作负载平衡的证明。只需按照说明操作即可。

简介

如今,我们期望在许多实例上使用高可用性、非常高效和复杂的基础架构。此外,所有内容都应通过 HTTPS 协议加密,以提高安全级别。从数百个不同的库中,我决定用 Feign Client 做一些事情并检查可能性。

为什么要假装?

在我的示例中,我使用了 Client 的两个实现来显示配置差异,例如我们可以将信任库添加到 API 客户端的方式。事实上,最大的优点可能是我们可以配置我们的客户完全依赖于他们自己。在我们自己的组件之间的内部流量中,我们有可能关闭 SSL 并设置更少的超时,这与使用 TLS 和更长的超时的外部流量完全相反。

配置优于实现

正如我所说,我们有许多开箱即用的实现,只需一点魔法就可以使用。默认配置为我们提供了在任何端点因任何原因未能响应时尝试最多 5 次的可能性。以一种简单的方式,我们可以通过在 EndpointConfiguration.class 中创建 @Bean 来更改它。最重要的是将我们的配置绑定到合适的@LoadBalancerClient@FeignClient,因为它不是bean,所以我们手动指向配置。

SSL

重要的是提供信任库并使用 TrustManager 构建 SSLContext/SSLFactory 以使用 SSL。我们必须用我们的 Bean 提议覆盖默认客户端,当然我们可以通过构造函数注入任何其他 bean。或者,我们可以使用默认客户端并在 JDK 信任库中安装证书或覆盖 javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword。非常有用的是在连接测试期间使用 JVM 参数 -Djavax.net.debug=all 来检查我们的证书是否正确加载以及连接是否成功结束。 当然你不应该在你的生产环境中以明文格式保存密码。这是一种更好的方式来保留我们的秘密的加密格式并在应用程序启动时对其进行解密。

负载均衡器

我所做的最重要的事情是负载均衡器配置,其中包含指向服务和配置的指针。 We can decide current load balancing strategy定义ReactorLoadBalancer<ServiceInstance> @Bean,默认是round robin,也可以选择随机方式。另一个挑战是将我们的节点实例提供给负载均衡器。每个客户端都应该实现自己的 ServiceInstanceListSupplierserviceId 绑定到服务名称和实际实例列表,指定主机、端口或协议 (HTTP/HTTPS)。

闪光的不一定是金子

耐心是成功的关键。 Spring,Feign 和 Load Balancer 规范非常好,但目前我还没有看到好的 working 示例将所有这些东西联系在一起。很多bean被标记为@ConditionalOnMissingBean甚至组合属性。看当前bean有点乱,尤其是client,还得配合debugger才行。