前言
Spring Cloud 基于 Spring Boot,因此在前几篇,我们系统地学习了 Spring Boot 的基础知识,为深入研究 Spring Cloud 打下扎实的基础。
从本章开始,我们将正式进入探索 Spring Cloud 秘密的旅程中。学习完本课程后,读者将从中学习到如何搭建一个完整的分布式架构,从而向架构师方向靠近。
微服务架构概述
微服务架构它是一种软件架构风格,它提倡将一个单体应用安装业务进行比较细粒度的拆分成一个个微小的可以独立运行、部署、维护的即独立自治的子系统,这个子系统我们称之为微服务。多个微服务聚合起来就是一个庞大的系统,这个系统的架构就是微服务架构。
微服务的核心是 API,在一个大型系统中,我们可以将其拆分为一个个的子模块,每一个模块就可以是一个服务,各服务之间通过 API 进行通信,而在服务领域中,常见的通信机制就是rpc,和基于restful 风格的Http + JSON进行通信。
服务架构的系统开发一般,具有微服务架构理念和分布式开发方式,通常会遇到以下问题
1、服务如何创建 => 由SpringBoot 进行快速构建
2、服务之间如何发现彼此? => 注册中心,每个服务都将自己注册到注册中心,在注册中心上发现彼此即可
3、服务之间如何通信? => 通过rpc远程调用(Dubbo),基于RESTful风格的http协议进行调用(Ribbon+restTemplate、Feign)
4、服务之间通常出现障碍如何处理? => 容错机制 :Hystrix
6、服务之间消费如何追踪呢?=> zipkin
7、服务的生命周期怎么监控 ? => SpringBoot Admin
8、服务之间的请求如何统一处理?=> 网关: Zuul,Spring GateWay
什么是 Spring Cloud
Spring Cloud 是微服务架构思想的一个具体实现,它为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发、断路器,智能路由、微代理、控制总线等)。
Spring Cloud 基于 Spring Boot 框架,它不重复造轮子,而是将第三方实现的微服务应用的一些模块集成进去。准确的说,Spring Cloud 是一个容器,将市面上常用的服务治理框架都整合到了一起,方便开发者开箱即用。
最简单的 Spring Cloud 项目
学习任何一门语言和框架,从 Hello World 入门是最合适的,Spring Cloud 也不例外,接下来,我们就来实现一个最简单的 Spring Cloud 项目。
最简单的 Spring Cloud 微服务架构包括服务发现和服务提供者(即一个大型系统拆分出来的子模块),最极端的微服务可以做到一个方法就是一个服务,一个方法就是一个项目。在一个系统中,服务怎么拆分,要具体问题具体分析,也取决于系统的并发性、高可用性等因素。
接下来,我们就先创建一个最简单的 Spring Cloud 项目。
1. 创建统一父级依赖项目
hello-spring-cloud-parent
pom 依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>hello-spring-cloud-eureka</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>hello-spring-cloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>hello-spring-cloud</name>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<!-- SpringBoot start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- SpringBoot end -->
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.创建服务的注册与发现服务端
hello-spring-cloud-eureka
项目结构如下
pom 依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>hello-spring-cloud-parent</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-spring-cloud-eureka</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动类如下
package hello.spring.cloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
application.yml 配置如下
server:
port: 8761
spring:
application:
name: eurekaserver
profiles:
active: dev
cloud:
inetutils:
preferred-networks: 127.0.0.1
client:
ip-address: 127.0.0.1
eureka:
server:
peer-node-read-timeout-ms: 3000
enable-self-preservation: true
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
client:
registerWithEureka: true
fetchRegistry: false
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
运行启动类,浏览器访问:
http://127.0.0.1:8761/
以上只是 Spring Cloud 的入门实例,是为了给大家展示什么是 Spring Cloud,本文暂不对上述代码做任何解释,在后面的学习中,将依次介绍Spring Cloud的各个组件,如果要深入研究它,可以关注我后边的教程。在后面的教程中,我将各个模块逐步拆解,一个一个给大家详细讲解。