Netflix之后,如何用Spring Cloud 新组件构建微服务架构?

作者|PiotrMińkowsk
译者|张卫滨
策划|万佳
不久前 , Spring正式发布新版本 , 该版本最大的变化是移除了多个之前处于维护模式的Netflix组件 , 如Ribbon、Hystrix和Zuul 。 本文基于SpringCloud新组件 , 阐述了如何构建微服务架构 。2020年12月22日 , Spring在官方博客正式发布2020.0.0版本(即Ilford) , 这是一个采用新命名规范的版本 , 但是 , 更引人关注的是该版本移除了多个之前处于维护模式的Netflix组件 , 如Ribbon、Hystrix和Zuul 。 唯一剩余的模块是Eureka 。 这些变化对SpringCloud来说是很重要的 , 因为从诞生之初 , SpringCloud就因为与Netflix组件的集成得到广泛认可 。 此外 , SpringCloudNetflix仍然是GitHub上最受欢迎的SpringCloud项目(约有4200star) 。
在将Netflix组件转入维护模式的同时 , Spring团队已经开始着手准备替代方案了 。 因此 , Ribbon将被SpringCloudLoadBalancer取代 , Hystrix将被建立在Resilience4J库之上的SpringCloudCircuitBreaker取代 。 SpringCloudGateway是Zuul的竞争解决方案 , 目前已是一个很受欢迎的项目 , 在Ilford版本后 , 它将是API网关方面的唯一方案 。
本文的主要目的是指导你使用新的SpringCloud组件构建微服务架构 , 替换废弃的Netflix项目 。 示例应用的源码可以在GitHub上的仓库中找到 。
1架构【Netflix之后,如何用Spring Cloud 新组件构建微服务架构?】下图展现了我们样例系统的架构 。 在这里 , 我们包含了微服务的特征元素 , 如API网关、服务发现server以及配置server 。 接下来 , 我会展示如何使用提供了这些模式的SpringCloud组件 。 目前 , 向系统中添加API网关的主要组件是SpringCloudGateway 。

Netflix之后,如何用Spring Cloud 新组件构建微服务架构?
文章图片
SpringCloud提供了与多个可用作服务发现服务器的方案的集成 , 包括NetflixEureka、HashiCorpConsul、AlibabaNacos和ApacheZooKeeper 。 其中 , 最流行的是前两者 。 SpringCloudNetflixEureka专门用于服务发现 , 而SpringCloudConsul可同时通过ConsulServices实现服务发现 , 通过ConsulKey/Value引擎实现分布式跟踪特性 。
SpringCloudConfig只负责提供一个配置管理的机制 。 但是 , 它也可以与第三方工具集成 , 如来自HashiCorp的Vault 。 以两个简单的SpringBoot应用callme-service和caller-service为例 , 我们阐述如何将应用与服务发现和配置服务器进行集成 。 我们还会在caller-service上使用SpringCloudLoadBalancer启用客户端负载均衡 , 并使用基于Resilience4J构建的SpringCloudCircuitBreaker启用断路器功能 。
2服务发现借助SpringCloud的DiscoveryClient抽象 , 在客户端切换不同的服务发现服务器非常容易 。 这种切换只需要替换Mavenpom.xml文件中的一个依赖项 。 如果你想要使用Eureka的话 , 只需要添加如下的starter到微服务中 。 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>而如果你想要使用Consul的话 , 那么需要添加如下的starter到微服务中 。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>如果你想要为服务发现的客户端定义一些非默认的配置的话 , 那情况就有点复杂了 。 在这种情况下 , 你需要使用特定于Eureka或Consul的属性 。 例如 , 如果你想要在同一个主机上运行同一个应用的多个实例 , 并启用动态HTTP服务器端口(选项server.port=0) , 那么你需要为每个实例设置一个唯一的id 。 如下是Eureka客户端中所使用的属性 。 instance:instanceId:${spring.cloud.client.hostname}:${spring.application.name}:${random.value}对Consul客户端来说 , 相同的配置如下所示 。
在微服务架构中 , 我们可以很容易地通过SpringCloudNetflixEurekaServer模块配置和运行Eureka服务发现 。 只需要创建包含该模块的SpringBoot应用即可 。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>我们还需要为应用启用Eureka , 只需在主类上添加@EnableEurekaServer注解 。
@SpringBootApplication@EnableEurekaServerclassDiscoveryServerApplicationfunmain(args:Array<String>){runApplication<DiscoveryServerApplication>(*args)}在本地机器上运行Consul的最简便方式是使用它的Docker镜像 。 我们可以通过执行如下命令以开发模式在Docker容器中运行Consul:
$dockerrun-d--name=consul-eCONSUL_BIND_INTERFACE=eth0-p8500:8500consul:1.7.23使用Springcloud进行分布式配置在我们的架构中 , 下一个重要的元素就是配置服务器 。 在SpringCloud中 , 能提供分布式配置机制的最流行方案就是SpringCloudConfig 。 SpringCloudConfig为分布式系统中的外部化配置提供了服务器端和客户端的支持 。