一、微服务架构概述
1.1、单体应用架构存在的问题
一个归档包(例如war格式)包含所有功能的应用程序,通常称为单体应用。
存在问题:
- 复杂性高
- 技术债务
- 部署频率低
- 可靠性差
- 扩展能力受限
- 阻碍技术创新
1.2、如何解决单体应用架构存在的问题
单体应用架构 --> 分布式架构 --> SOA架构 --> 微服务架构。
1.3、什么是微服务
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务公用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
微服务架构应具备的特性:
- 每个微服务可独立运行在自己的进程里
- 一系列独立运行的微服务共同构建起整个系统
- 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等
- 微服务之间通过一些轻量的通信机制进行通信,例如通过RESTful API进行调用
- 可以使用不同的语言与数据存储技术
- 全自动的部署机制
1.4、微服务的优点与挑战
1.4.1、微服务架构的优点
- 易于开发和维护
- 单个微服务启动较快
- 局部修改容易部署
- 技术栈不受限
- 按需伸缩
1.4.2、微服务架构面临的挑战
- 运维要求较高
- 分布式固有的复杂性:使用微服务构建的是分布式系统
- 接口调整成本高
- 重复劳动:多个服务具有相同的功能,造成代码重复。
1.5、微服务设计原则
- 单一职责原则:一个单元(类、方法或者服务等)只应关注整个系统功能中单独、有界限的一部分。
- 服务自治原则:每个微服务应具备独立的业务能力、依赖与运行环境。
- 轻量级通信机制:微服务之间应该通过轻量级的通信机制进行交互。常有的协议有REST、AMQP、STOMP、MQTT等。
- 微服务粒度:领域驱动设计(DDD)中的“界限上下文”可作为划分微服务边界、确定微服务粒度的重要依据。
1.6、如何实现微服务架构
1.6.1、技术选型
开发框架的选择:Spring Cloud(开箱即用、文档丰富、社区活跃、提供了完整的解决方案)。
运行平台:微服务并不绑定运行平台。
1.6.2、架构图及常用组件
二、微服务开发框架——Spring Cloud
2.1、Spring Cloud简介
Spring Cloud是在Spring Boot基础上构建的,用于快速构建分布式系统的通用模式的工具集。
使用Spring Cloud开发的应用程序非常适合在Docker或者PaaS上部署,所以又叫作云原生应用。云原生(Cloud Native)可简单理解为面向云环境的软件架构。
2.2、Spring Cloud特点
- 约定优于配置
- 适用于各种环境
- 隐藏了组件的复杂性,并提供声明式、无xml的配置方式
- 开箱即用,快速启动
- 轻量级的组件
- 组件丰富、功能齐全
- 选型中立、丰富
- 灵活
2.3、Spring Cloud版本
大多数Spring项目都是以“主版本号.次版本号.增量版本号.里程碑版本号”的形式命名版本号的。
2.3.1、版本简介
Spring Cloud是以英文单词SRX(X为数字)的形式命名版本号的。
2.3.2、子项目一览
- spring-cloud-aws
- spring-cloud-bus
- spring-cloud-cli
- spring-cloud-commons
- spring-cloud-contract
- spring-cloud-config
- spring-cloud-netflix
- spring-cloud-security
- spring-cloud-starters
- spring-cloud-cloudfoundry
- spring-cloud-cluster
- spring-cloud-consul
- spring-cloud-sleuth
- spring-cloud-stream
- spring-cloud-zookeeper
- spring-boot
- spring-cloud-task
三、开始使用Spring Cloud实战微服务
3.1、Spring Cloud实战前提
3.1.1、技术储备
- 语言基础:Java
- Spring Boot
3.1.2、工具及软件
- JDK
- Spring Boot
- Spring Cloud
- IDE
- Maven
3.2、服务提供者与服务消费者
使用微服务构建的是分布式系统,微服务之间通过网络进行通信。
- 服务提供者:服务的被调用方(即:为其他服务提供服务的服务)
- 服务消费者:服务的调用方(即:依赖其他服务的服务)
3.3、编写服务提供者
编写一个服务提供者(用户微服务),该服务可通过主键查询用户信息。使用Spring Data JPA作为持久层框架,使用H2所谓数据库。
3.3.1、手动编写项目
1、创建Maven项目,引入依赖
2、准备建表语句schema.sql,放在classpath下面(src/main/resources根目录)
3、准备几条数据data.sql, 放在classpath下面(src/main/resources根目录)
4、创建用户实体类
5、创建DAO
6、创建Controller
7、编写启动类
8、编写配置文件application.yml
9、测试。到此服务提供者编写完成了
3.4、编写服务消费者
1、创建Maven项目
2、引入Spring Boot和Spring Cloud依赖管理(同服务提供者代码)
3、创建用户实体类(同服务提供者代码)
4、创建启动类,@Bean表示创建一个对象交给Ioc容器管理(默认name为方法名)
5、创建Controller,在其中使用了RestTemplate请求用户微服务的API
6、 编写配置文件
7、测试
说明电影微服务可以正常使用RestTemplate调用用户微服务的API。
3.5、为项目整合Spring Boot Actuator
Spring Boot Actuator提供了很多监控端点。可使用http://{ip}:{port}/{endpoint}的形式访问这些端点,从而了解应用程序的运行情况。
- autoconfig:显示自动配置的信息。GET方式
- beans:显示应用程序上下文所有的Spring bean。GET方式
- configprops:显示所有@ConfigurationProperties的配置属性列表。GET方式
- dump:显示线程活动的快照。GET方式
- env:显示应用的环境变量。GET方式
- health:显示应用程序的健康指标,这些值有HealthIndicator的实现类提供。GET方式
- info:显示应用的信息,可使用info.*属性自定义info端点公开的数据。GET方式
- mappings:显示所有的URL路径。GET方式
- metrics:显示应用的度量标准信息。GET方式
- shutdown:关闭应用(默认情况下不启用,如需启用,需设置endpoints.shutdown.enabled=true)。POST方式
- trace:显示跟踪信息(默认情况下为最近100个HTTP请求)。GET方式
需要引入依赖:
3.6、硬编码有哪些问题
- 适用场景有局限:
- 无法动态伸缩
文章内容来自《Spring Cloud与Docker微服务架构实战》---周立。