1 微服务架构
1.1 微服务架构概述
微服务架构(Microservice Architecture, MSA)是一种新型的服务端架构设计方案,通过将应用程序拆分成多个小型、自治的服务,实现了服务的松耦合和快速迭代。
微服务架构特征主要包括以下几个方面:
1、基于服务的分布式架构:微服务架构将应用程序拆分成多个服务,每个服务负责一个小部分功能,服务之间通过轻量级的通信机制进行交互。
2、可独立部署:每个微服务都是一个独立的部署单元,可以独立构建、测试和部署,避免了整个应用程序的重构和重新部署。
3、强调自治性:微服务应该是自治的,也就是说,每个服务应该可以独立运行、管理和维护,不需要依赖其他服务或中央控制器。
4、强调容错性:微服务架构通过重试、容错和回滚等机制来应对故障和异常,提高服务的稳定性和健壮性。
1.2 微服务架构的历史
2014年,Martin Fowler和James Lewis在一篇名为《Microservices: a definition of this new architectural term》的博客中,正式提出了微服务架构的概念,阐述了微服务架构的定义、特点和优劣。
在2014年至今的这一段时间里,微服务架构的发展经历了以下几个阶段:
1、探索阶段(2014年-2015年):微服务架构在最初的阶段是一种新的概念,许多企业和组织都在尝试采用该架构。在这个阶段,微服务架构并没有成为主流的软件开发风格。
2、推广阶段(2015年-2017年):随着对微服务架构的认识和经验的积累,越来越多的企业和组织开始采用微服务架构。在这个阶段,开源项目、云计算平台和微服务工具的出现为微服务架构的推广提供了有力的技术支持。
3、普及阶段(2017年-至今):微服务架构在最近几年成为了软件开发的主流,越来越多的企业和组织开始探索和使用微服务架构。同时,微服务管理平台、API网关、服务网格等工具的发展也为微服务架构提供了更多的技术支持。
另外,近年来,微服务架构有以下发展趋势:
1、微前端:微前端是一种将前端应用程序拆分成多个小型服务来开发和维护的方式,类似于微服务架构中的服务拆分。微前端与微服务架构相结合,可以实现更加灵活的应用程序开发和部署。
2、服务网格:服务网格是一种新兴的服务架构,它可以解决微服务架构中的服务通信和治理问题,为微服务架构提供了更加健全的技术支持。
3、云原生:云原生是一种新的应用程序架构,它将微服务架构、容器化和DevOps文化相结合,实现了快速交付、高度可扩展以及基础设施自动化的目标,是未来软件开发的重要趋势。
总的来说,微服务架构从探索到现在已经发展成为现代化企业软件架构的主流之一,未来对技术的创新、落地以及普及,都是微服务发展的重点。
1.3 微服务架构入门
通过一个简单的案例来演示微服务架构的基本思想:将应用程序拆分为小的、独立的服务,每个服务负责特定的功能,并通过网络通信来协同工作。
本案例中将开发2个微服务。用户微服务对外提供一个用户注册的接口,积分微服务提供对外提供一个为用户添加积分的接口。当用户注册时,先实现用户注册,再实现为用户赠送积分。
本案例仅关注服务间的通信,完善的业务功能将在后续逐步实现。
注意:为了兼容其他框架的版本,本阶段开始使用的JDK版本为1.8,Spring Boot版本为2.3.12.RELEASE。
本案例实现步骤如下:
1、创建管理项目。
2、创建积分微服务项目,并开发增加积分接口。
3、创建用户微服务项目,并开发注册接口。
4、实现用户微服务对积分微服务的访问。
5、综合测试。
以下是具体实现。
1、创建管理项目
为便于项目代码的管理,首先新建一个父项目,项目类型为Maven项目,命名为PointSystemParent,项目的打包方式为pom。
2、创建积分微服务项目,并开发增加积分接口
首先,在PointSystemParent项目下新建一个Module,类型为Spring Boot项目,命名为PointService。然后,在application.yml中配置项目的基本信息。
spring:
application:
name: point-service
server:
servlet:
context-path: /point-service
port: 8091
接下来,新建controller包,并在controller包下新建PointController类,模拟为用户增加积分的接口。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/points")
public class PointController {
@Value("${server.port}")
private String port;
@RequestMapping("/add")
public String addPoint(Long userId) {
System.out.println("为用户" + userId + "增加积分成功");
return "add point success: " + port;
}
}
启动PointService项目,使用浏览器测试该接口是否正常生效。
3、创建用户微服务项目,并开发注册接口
首先,在PointSystemParent项目下新建一个Module,类型为Spring Boot项目,命名为UserService。然后,在application.yml中配置项目的基本信息。
spring:
application:
name: user-service
server:
servlet:
context-path: /user-service
port: 9001
接下来,新建controller包,并在controller包下新建UserController类,模拟用户注册的接口。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/users")
public class UserController {
@RequestMapping("/register")
public String register(String username) {
System.out.println("用户" + username + "注册成功");
return "register success";
}
}
启动UserService项目,使用浏览器测试该接口是否正常生效。
4、实现用户微服务对积分微服务的访问
本案例中使用Spring Boot提供的RestTemplate实现用户微服务对积分微服务的访问。
首先,在UserService中新增config包,并在config包下新增RestTemplateConfig类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
然后,修改UserController中的代码。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/register")
public String register(String username) {
System.out.println("用户" + username + "注册成功");
String url = "http://localhost:8091/point-service/points/add?userId=1";
String result = restTemplate.getForObject(url, String.class);
return "register success and "+result;
}
}
5、综合测试
首先,启动PointService项目。
然后,启动UserService项目。
通过浏览器访问用户注册接口,查看运行效果。
6、案例总结
本案例将传统的单体应用中的两个模块(用户和积分)拆分成了两个独立的项目,并通过HTTP访问实现了协作。本案例存在以下问题:
1、直接使用硬编码的URL调用服务,这种方式显得不够优雅和灵活。
2、使用硬编码的地址调用服务,这样无法实现服务调用的动态调整和负载均衡。
微服务架构为上述问题提供了标准的解决方案。这套解决方案的基础是服务的注册与发现。
1.4 服务注册与发现
服务注册与发现是一种在分布式系统和微服务架构中广泛使用的关键概念,它有助于管理和维护大规模的服务群体。这个机制的核心思想是允许服务在启动时自动注册并在需要与其他服务通信时发现它们。
1、服务注册:
- 当一个服务启动时,它会将自己的关键信息(例如服务名称、IP地址、端口号、健康状态等)注册到服务注册中心
- 服务注册中心通常是一个专门的服务器或服务,它负责存储和管理所有已注册的服务信息
2、服务发现:
- 当一个服务需要与其他服务通信时,它会向服务发现组件发送请求,请求包含目标服务的名称或标识
- 服务发现组件会根据请求中的信息,在服务注册中心中查找并返回目标服务的详细信息
采用注册和发现机制是一种智能而优雅的方式,可以消除硬编码 URL 带来的问题。但是,开发这一套解决方案对普通开发者来说难度较大。好在主流的微服务框架(如Spring Cloud),均提供了开箱即用的解决方案。
2 Spring Cloud
2.1 Spring Cloud概述
Spring Cloud是基于Spring Boot开发的一组开源框架和工具,提供了微服务架构中开发分布式系统所需的各种组件和工具。该框架的出现使得在微服务架构中开发分布式系统变得更加简单和高效。
Spring Cloud的主要特点包括:
1、简化开发:Spring Cloud提供了一系列开箱即用的组件和工具,可以帮助开发者快速实现服务注册、发现、配置、熔断、负载均衡、分布式消息等功能,大大简化了微服务架构系统的开发和部署工作。
2、易于集成:Spring Cloud完全兼容Spring Boot,可以方便地与其他Spring组件一起使用,同时也可以与多种第三方工具和服务集成。
3、可扩展性:Spring Cloud支持多种云计算平台,如AWS、Azure、Oracle、Google Cloud等,可以轻松在云上部署、扩展和维护微服务。
4、易于维护:Spring Cloud内置了多个组件和工具,可以帮助企业监控和管理微服务系统,诊断和调试系统故障。
5、社区支持:Spring Cloud拥有活跃的社区,提供了丰富的文档资料、教程和周边工具,可以帮助开发者更快地上手和使用。
2.2 Spring Cloud的分支
Spring Cloud的分支是指在Spring Cloud基础上进行了特定功能深度开发或集成其他技术栈(如阿里巴巴、Kubernetes、AWS等)的变种。目前比较主流的Spring Cloud分支有:
1、Spring Cloud Netflix:Netflix是Spring Cloud最早的支持者之一,提供了一系列的分布式微服务组件,包括服务注册和发现、客户端负载均衡、断路器、智能路由、API网关等。
2、Spring Cloud Alibaba:阿里巴巴是Spring Cloud的另一个重要贡献者,提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息总线、链路追踪等,能够与阿里云上的云服务集成。
3、Spring Cloud AWS:AWS是Amazon云计算平台,Spring Cloud AWS提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息队列等,能够与Amazon Web Services集成。
4、Spring Cloud GCP:GCP是Google的云计算平台,Spring Cloud GCP提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息总线等,能够与Google云服务集成。
5、Spring Cloud Azure:Azure是微软的云计算平台,Spring Cloud Azure提供了一系列的分布式微服务组件,能够与Azure上的众多云原生服务(如CosmosDB、Storage、Service Bus等)无缝集成,以实现更方便的部署、管理和扩展微服务。