Spring Cloud 了解

Spring Cloud 是啥

Spring Cloud 是一个微服务框架,提供分布式系统操作的开发工具。

那啥是微服务呢?

比如在学习 Web 时会接触到三层架构:控制层、服务层、数据层。我们把这种抽象当作一个项目的纵向分层,那么微服务就相当于对项目进行横向分割。

比如在一开始我们将项目分为控制层、服务层、数据层来开发。随着项目的演进、复杂度的提高,将它横向以功能拆分为多个模块——每个模块再纵向分层开发。

以开发一个购书网站来看,我们可以先将项目划分为用户模块、书籍模块……甚至更细一点,一些优惠活动一个模块……而单独的每一个模块,都可以用 Spring boot 等方式来开发。

每个模块都可以独立部署。而「分布式」就可以先简单地理解为把模块部署到不同的环境上——你可以用传统方式如 Tomcat、命令脚本来部署,也可以用 Docker、云原生技术来部署。最后依然会有一个大家长(服务中心)来管理不同的模块,在这个大家庭里,每个模块就作为一个「服务」存在。

这就是微服务的概念(大概)。

以前后端分离的模式来开发,就会有这种感觉:前端无需关心数据、操作的来源,后端给前端提供 api 就行了。用微服务就相当于对 api 进行模块化,每个服务提供相应的 api 便于组织,也便于复用。事实上 Spring Cloud 也建议服务间通过 RESTful API 这样的方式调用。

Spring Cloud 基于 Spring Boot,用 Spring Cloud 搭建的微服务应用中的各个模块(服务)用 Spring Boot 开发。(用其它方式开发的模块只要遵循 Spring Cloud 的协议也可以被接入,例如:Python写的微服务如何融入Spring Cloud体系? - 无敌的码农 - 博客园

Spring Cloud 基本组织

把应用拆分为多个服务后,如何组织服务间的调度呢?这个概念被称作服务治理。我们可以通过手动的方式来组织服务间的调度——但各个服务将会产生一个由调度与被调度而产生的复杂网状结构,如何优化呢?可以引入一个管理调度这些服务的中心组织,这样每个服务就只需要与这个服务中心交互。

这个中心被称为服务注册中心,它实现了各个微服务实例的自动注册与发现。

Spring Cloud 为服务治理做了一层抽象接口,支持多种不同的服务治理框架,如 ZooKeeper、Netflix Eureka……

而各种微服务呢,被分为服务提供者(提供接口供别人使用)和服务消费者(是用别人的接口)。但同时,一个服务既可以作为提供者也可以作为消费者使用。联系一下实际项目很好理解,一个模块既能使用别人的接口,同时也能提供接口给别人使用——这种场景很常见。

这也是抽象层面的说法,在 Spring Cloud 的各种教程中,都选用 Eureka 作为服务注册中心,我们以 Eureka 来具体谈谈……

Eureka 简单使用

参考

这篇写的很详细了……

SpringCloud2.0 入门指南

正文

Eureka 分为 Eureka Server、Eureka Client。

可以用 Idea 快速创建,见:Spring Cloud Eureka 快速创建 Client 和 Server

  • Eureka Server : Spring Initializr -> Cloud Discovery -> Eureka Server
  • Eureka Client : Spring Initializr -> Cloud Discovery -> Eureka Discovery clien

用 Gradle 可以这样创建:

  1. 创建一个 Gradle 项目(SpringCloud-demo),然后把里面内容删光光。
  2. 在这个项目引入 Module(idea 上右键项目名,new -> Module),Spring Initializr -> Cloud Discovery -> Eureka Server。Module 命名为 eurekaserver。这样,创建一个 Eureka Server。
  3. 在这个项目引入 Module(idea 上右键项目名,new -> Module),Spring Initializr -> Cloud Discovery -> Eureka Discovery Client。Module 命名为 eurekaclient。这样,创建了一个 Eureka Client。

执行 Gradle 导入包,启动这两个 Module,最后在网页打开 Eureka Server,成功发现了 Eureka Client。

代码仓库

hqweay/learn-spring-cloud at basic-demo

Eureka Server 和 Eureka Client 到底啥区别

Eureka Server 是注册服务中心的服务端,有界面。

Eureka Client 是注册服务中心的客户端。

一个微服务项目包含这三者。:

  • 服务注册中心
  • 服务提供者
  • 服务消费者

Eureka Server 就是服务注册中心。

Eureka Client 既可以做服务提供者,又可以做服务消费者。

在前文的项目里将 Eureka Client 模块作为服务提供者来使用,那么 Eureka Client 如何消费服务呢?

比方说我有个用户模块,需要调用数据维护服务的接口来获取用户的信息。在上面已经提到过,我可以直接调用数据维护服务的接口,也可以通过服务注册中心调用数据维护服务的接口。但若是考虑一些更复杂的情况,比方说做负载均衡,就需要在服务的消费者与提供者之间再提供一个抽象层次。

Spring Cloud 提供了 Ribbon 来达到这一点。

高可用注册中心

在生产环境应该对每个节点做备用节点以应对主节点异常的情况,服务注册中心当然也可能异常,那也应该做备用。

实际上 Eureka 中的所有节点都既是服务提供方又是服务消费方,包括 Eureka Server。可以把 Eureka Server 作为一个服务,向其它的 Eureka Server 注册形成一个服务注册中心集群。Eureka 提供了配置达到这点,多个互相注册的 Eureka Server 会互相同步服务的注册信息。

具体到某个模块举例,可以将一个 Eureka Client 配置上多个 Eureka Server(多个 Server 会互相同步数据)的地址,当其中某个 Eureka Server 无法使用时,便尝试调用下一个。

[update on 2022-02-12]