近年来,凭借着其架构中的各项优势,微服务体系架构已经成为了应用程序开发的首选项。但是不可否认的是,每一种架构都有自身的短板,微服务架构也不例外。例如:在微服务架构中,我们可以部署许多被独立开发出来的服务,以提供在某些特定场景下的功能。不过,它们需要通过不同的API或事件,来实现彼此之间的通信。有时,它们甚至需要与某些外部系统进行通信,以实现完整的系统功能。
虽然我们在开发的过程中,需要最小化某个微服务对于其他微服务的直接依赖性。但是在某些情况下,这是不可避免的。因此,我们需要在开发和部署微服务时,全面考虑并管理好诸如:服务发现(Service Discovery)、断路器(Circuit Breaker)、分布式跟踪(Distributed Tracing)、路由、连接器(Connector),配置(Configurations)等关系。
首先,我为您准备了如下关系图。它向您展示了如何使用Spring Boot去构建微服务,以及如何使用Spring Cloud去部署和管理微服务。
如上图所示,我用到了Spring Cloud所提供的各种产品。下面我将解释每个组件能够解决的实际问题。
- 配置服务器(Config Server) – 如下图所示,微服务往往自带有许多配置,而这些配置对于系统整合测试(System Integrate Test,SIT)、用户验收测试(User Acceptance Test,UAT)、以及生产环境(PROD)都有所不同。因此,无论是在应用的外部,还是在其内部中心位置,这些配置都应该可以被直接管理和维护。此外,如果配置中有任何需要更改的地方,其应用代码也不应被迫做相应的修改。Spring Cloud Config就能够为分布式系统中的各种外部配置,提供服务器端和客户端的支持。使用Config Server,您可以在中心位置管理所有当前环境中应用程序的外部属性。如果您想了解更多有关如何使用Spring Cloud,来轻松创建Config Server的详细内容,请参见--https://spring.io/projects/spring-cloud-config。
- 服务注册表(Service Registry) - 各类用户或服务需要使用不同类型的客户端或服务器端发现,来确定向它们发送请求的服务实例的具体位置。可是,问题在于:这些服务的客户该如何知道那些对于每个环境都不尽相同的,可用的服务实例呢?业界常用的解决方案是实施Service Registry。它是针对各种可用服务、及其实例与位置的数据库。毕竟各类服务实例在启动的时候,都已经在服务注册表中注册过了。在此,Eureka Server能够帮助我们创建对应的Service Registry服务器,并将所有其他的服务都注册上去。如果您想创建并启用自己的注册表服务器,请使用spring-cloud-starter-netflix-eureka-server依赖项,以及@EnableEurekaServer。
- Eureka Discovery Client – 不同的服务之间需要互相调用。如今,大多数微服务都是部署在虚拟机或容器化的环境之中,而且服务实例的数量、及其位置也是经常动态变化的。因此,我们需要实现一种机制,以使得服务客户端能够对那些动态更改的服务实例集发出请求。在此,Eureka Discovery Client正好派上用场。它可以帮助我们从Eureka服务注册表中获取已注册的相关服务。据此,Spring Cloud能够很容易地实现服务发现。如下图所示,只要Spring Cloud Netflix和Eureka Core在类路径(classpath)上,任何使用@EnableEurekaClient的Spring Boot应用,都会尝试着用http://localhost:8761(其默认值为eureka.client.serviceUrl.defaultZone)与Eureka服务器联系。
Spring Feign Client - 在微服务架构中,服务与服务之间的通信可谓“家常便饭”,而您往往需要使用某种机制来调用(invoke)另一个服务。作为一种声明性的Rest Client,Spring Feign Client能够创建一个用JAX-RS或Spring MVC注释所修饰的接口。如下图所示,此类的动态实现非常容易被使用。
至此,想必您已经能够通过上述介绍,了解了如何使用Spring Boot和Cloud来实现微服务的相关知识与流程。如果您感兴趣的话,可以自己动手尝试着编写一套简单的服务例子。
Microservices Implementation using (Spring Boot and Cloud) (作者: Nitesh Gupta )