Netflix时代后的SpringCloud微服务的未来
服务发现
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-consul-discovery/artifactId
/dependency
默认情况下,Spring尝试在地址localhost:上与Consul连接。如果您需要覆盖此地址,则应在其中设置适当的属性application.yml:
spring:
cloud:
consul:
host:..99.
port:
您可以使用从Docker容器启动的Consul本地实例轻松测试此解决方案:
dockerrun-d--nameconsul-p:consul
如您所见,使用SpringCloud实施Consul发现非常容易–与Eureka一样。领事比尤里卡无疑具有一个优势-它由HashiCorp不断维护和开发。它的受欢迎程度正在迅速增长。它是最大的HashiCorp生态系统的一部分,该生态系统包括Vault,Nomad和Terraform。与Eureka相比,Consul不仅可以用于服务发现,还可以用作基于微服务的体系结构中的配置服务器。
分布式配置
NetflixArchaius是一个有趣的解决方案,用于管理微服务体系结构中的外部化配置。尽管SpringCloud提供了一些有趣的功能(例如动态和类型化属性)或对动态数据源(例如URL,JDBC或AWSDynamoDB)的支持,但SpringCloud还决定将其移至维护模式。但是,由于存在由Pivotal团队和社区完全创建的类似项目–SpringCloudConfig,SpringCloudArchaius的普及受到了限制。SpringCloudConfig支持多个源存储库,包括Git,JDBC,Vault或简单文件。在我以前的文章中,您可以找到许多使用此项目为微服务提供分布式配置的示例。今天,我不再谈论它。我们将讨论另一种解决方案,该解决方案也受SpringCloud支持。正如我在上一节末尾提到的那样,Consul也可以用作配置服务器。如果将Eureka用作发现服务器,则自然选择SpringCloudConfig作为配置服务器,因为Eureka根本不提供此类功能。如果您决定使用Consul,则不是这种情况。现在,可以在两种解决方案之间进行选择:SpringCloudConsulConfig和SpringCloudConfig。当然,它们两者都有其优点和缺点。例如,您可以轻松地使用Consul节点构建集群,而使用SpringCloudConfig则必须依靠外部发现。现在,让我们看看如何使用SpringCloudConsul在应用程序中管理外部配置。要在应用程序端启用它,您只需要对Maven包括以下依赖项pom.xml:
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-consul-config/artifactId
/dependency
与服务发现相同,如果要覆盖某些默认客户端设置,则需要设置属性spring.cloud.consul.*。但是,必须在内部提供这种配置bootstrap.yml。
spring:
application:
name:callme-service
cloud:
consul:
host:..99.
port:
在Consul上创建的属性源的名称应与bootstrap.ymlconfig文件夹中提供的应用程序名称相同。您应该server.port使用value创建密钥0,以强制SpringBoot随机生成监听端口号。假设您需要设置应用程序默认监听端口,则应进行以下配置。
启用动态端口号生成时,您还需要覆盖应用程序实例ID,以使其在一台计算机上唯一。如果您在同一台计算机上运行单个服务的多个实例,则需要这些功能。我们将针对进行此操作callme-service,因此我们需要spring.cloud.consul.discovery.instance-id使用我们的值覆盖属性,如下所示。
然后,您应该在应用程序启动时看到以下日志。
API网关
SpringCloudNetflixZuul的后继者是SpringCloudGateway。这个项目大约在两年前开始,现在是第二个最受欢迎的SpringCloud项目,在GitHub上有1.4k个星。它提供了一个在Spring生态系统之上构建的API网关,包括:Spring5,SpringBoot2和ProjectReactor。它运行在Netty上,不适用于Tomcat或Jetty等传统servlet容器。它允许定义路由,谓词和过滤器。与每个SpringCloud微服务相同的API网关可以轻松地与基于Consul的服务发现集成。我们只需要在其中包含适当的依赖项即可pom.xml。我们将使用SpringCloud库的最新开发版本–2.2.0.BUILD-SNAPSHOT。以下是所需依赖项的列表:
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-consul-discovery/artifactId
version2.2.0.BUILD-SNAPSHOT/version
/dependency
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-consul-config/artifactId
version2.2.0.BUILD-SNAPSHOT/version
/dependency
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-gateway/artifactId
version2.2.0.BUILD-SNAPSHOT/version
/dependency
网关配置也将由Consul提供。因为与示例微服务相比,我们拥有更多的配置设置,所以我们将其存储为YAML文件。为此,我们应该/config/gateway-service/data在领事键/值的路径下创建可用的YAML文件。下面可见的配置启用服务发现集成并定义到下游服务的路由。每个路由都包含目标服务的名称,在服务发现中注册该目标服务时使用的名称,匹配路径和用于下游服务公开的呼叫终结点的重写路径。API网关在启动时会加载以下配置:
spring:
cloud:
gateway:
discovery:
locator:
enabled:true
routes:
-id:caller-service
uri:lb://caller-service
predicates:
-Path=/caller/**
filters:
-RewritePath=/caller/(?path.*),/\{path}
-id:callme-service
uri:lb://callme-service
predicates:
-Path=/callme/**
filters:
-RewritePath=/callme/(?path.*),/\{path}
这是领事上可见的相同配置。
最后一步是强制gateway-service读取存储为YAML的配置。为此,我们需要将属性设置spring.cloud.consul.config.format为YAML。这是内部提供的完整配置bootstrap.yml。
spring:
application:
name:gateway-service
cloud:
consul:
host:..99.
config:
format:YAML
客户端负载均衡器
在2.2.0.BUILD-SNAPSHOTSpringCloudCommons版本中,Ribbon仍然是HTTP客户端的主要自动配置负载平衡器。尽管SpringCloud团队宣布SpringCloudLoadBalancer将成为Ribbon的继任者,但我们目前在文档和网络上找不到有关该项目的许多信息。我们可能希望与NetflixRibbon一样,任何配置对我们来说都是透明的,特别是如果我们使用发现客户端。当前,spring-cloud-loadbalancer模块是SpringCloudCommons项目的一部分。通过在中声明以下依赖关系,可以将其直接包含到应用程序中pom.xml:
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-loadbalancer/artifactId
version2.2.0.BUILD-SNAPSHOT/version
/dependency
出于测试目的,值得排除与codespring-cloud-starter-consul-discovery/code入门程序一起提供的某些Netflix模块。现在,我们确定功能区未在后台用作负载均衡器。这是我为示例应用程序设置的排除项列表:
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-consul-discovery/artifactId
version2.2.0.BUILD-SNAPSHOT/version
exclusions
exclusion
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-netflix-core/artifactId
/exclusion
exclusion
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-netflix-archaius/artifactId
/exclusion
exclusion
groupId