一个为基础的业务编写的单体应用(jar包,wap包)。对于这样的设计一般适合企业的内部应用,访问量不大,体积比较小,5人以内的团队即可开发和维护。但对于一些大型互联网项目,假如需要10人以上的开发和维护团队,仅频繁的创建代码分支,编写业务功能,然后合并分支,就会出现很多代码冲突。每次解决这些大量的代码冲突,可能就会耗费好几天的时间。
基于这样的背景微服务诞生了.,在微服务架构设计中,建议将超出10人开发维护的项目进行拆分,将大系统分割为小系统,几个人负责一个单独服务的开发,测试,上线,冲突减少了每次测试只需要回归自己的一个服务即可,测试速度快了,上限是独立的,只需要向后兼容接口就行了,不需要和其他部分进行等待和协调,技术架构和技术的升级几个人就行了,成本降低,更加灵活,耦合性降低。
微服务架构(MSA)将单个应用开发为以小组独立服务,这些独立服务在自己的进程中运行,独立开发和部署,
将整个服务拆分为多个独立的子服务。实现了解耦,保证了系统的稳定性,即使某个功能挂了,也不会影响整体服务的运行。
这些服务使用轻量级API通过明确定义的接口进行通信。这些服务是围绕业务功能勾线的,没想服务执行一个功能,由于他们是对立的,英雌可以针对各个服务进行更新,部署和扩展以满足对应用程序特定功能的需求
程序中的微服务
就是将各个业务系统的共性再进行抽取,做成独立的服务,如图所示:
微服务是分布式系统中的一种流行的架构模型
但不要寄希望于微服务构架能够解决所有的问题。
微服务架构主要解决的是如何快速地开发和部署我们的服务,这对于一个能够适应快速开发和成长的公司是非常必要的。同时,微服务设计中有很多很不错的想法和理念,通过学习微服务架构我们可以更快的迈向卓越。
SpringCloud Alibaba微服务解决方案
概述
Spring Cloud Alibaba 是Spring Cloud的一个子项目,致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Spring Cloud Alibaba的默认核心功能:
服务限流,降级,熔断:
默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
限流:限制服务的数量,
降级:降低某个服务的可使用数量,释放资源到其他的服务中
熔断:彻底关闭某个服务的功能,释放资源到其他的服务中
服务的注册与发现:
基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
在服务的提交之后,对服务的发布进行管理,创建服务与服务之间的关系
分部式配置管理:
基于Nacos支持分部式系统中的外部化配置,配置更改的自动刷新
将服务中的某些配置设置为配置中心的外部化配置,实时刷新服务中的配置
服务之中,总会有一部分配置会经常发生修改,比如限流降级等开关配置,业务的黑白名单等经常需要修改的配置,这类配置无法直接写在工程服务之中。为了解决这些配置问题,出现了分布式配置管理相关的内容。
消息驱动能力:
基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
分布式任务调度:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行。
解决方案架构设计
构建SpringCloud 聚合项目并进行环境初始化
创建新的空项目
项目初始化配置
创建聚合父工程
第三步:添加核心依赖及版本管理:
导入spring Boot的两种方法
方法一:以继承的方法
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.2.RELEASE</version>
</parent>
方法二:以导入的方法导入Spring Boot
<!--Spring boot 依赖(定义了微服务规范)-->
<!--依赖于Spring Cloud Alibaba-->
<!--依赖于spring Cloud-->
<!--依赖于spring Boot-->
<!--需要添加三个jar的依赖-->
<!--引入Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<scope>import</scope><!--使用import的方式导入spring Boot-->
<type>pom</type><!--导入的jar包是一个pom对象-->
</dependency>
<?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>
<!--
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.2.RELEASE</version>
</parent>
-->
<groupId>com.cy</groupId>
<artifactId>01-sca</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<!-- 创建子类的 -->
<module>sca-provider</module>
<module>sca-consumer</module>
<module>sca-gateway</module>
<!--maveb的父工程是一个pom工程,
此工程负责依赖版本及部分基础依赖的管理 -->
</modules>
<!--properties中定义一些属性元素-->
<properties>
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!--定义需要导入的jar包-->
<!--Spring boot 依赖(定义了微服务规范)-->
<!--依赖于Spring Cloud Alibaba-->
<!--依赖于spring Cloud-->
<!--依赖于spring Boot-->
<!--需要添加三个jar的依赖-->
<!--第一步:引入Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<scope>import</scope><!--使用import的方式导入spring Boot-->
<type>pom</type><!--导入的jar包是一个pom对象-->
</dependency>
<!--第二部:引入Spring Cloud 依赖(定义了微服务规范)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<scope>import</scope><!--使用import的方式导入Spring Cloud-->
<type>pom</type><!--导入的jar包是一个pom对象-->
</dependency>
<!--第三步:Spring Cloud Alibaba依赖(基于spring微服务规范做了具体落地实现)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--dependencies定义子工程中都需要的依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--<version>1.18.12</version>具体的版本已经在spring boot中已经确定了
这里不添加版本信息,减少冲突-->
<!--添加scope表示这个jar包仅编译期可用-->
<scope>provided</scope>
</dependency>
</dependencies>
</project>
总结(Summary)
总之,微服务是一个架构设计方式,此架构中的每个服务(service)都是针对一组功能而设计的,并专注于解决特定的问题。如果开发人员逐渐将更多代码增加到一项服务中并且这项服务变得复杂,那么可以将其拆分成多项更小的服务。接下来进行独立的开发、测试、部署、运行、维护。进而更好,更灵活的处理客户端的请求并提高系统的可靠性,可扩展性。