微服务架构入门
背景
微服务架构诞生的背景:
对于比较小的单体项目,通过使用编辑器,创建maven创建工程,然后基于spring boot,spring mvc,mybatis等框架进行整合,在写一些controller,service,mapper层以及一些配置文件进行业务的调用,然后打包成jar包/war包,最后将包放到tomcat等,最后发布到Linux服务器上跑业务,然后呢,通过服务提供的访问端口发送http请求,通过springweb组件,进行代码层层调用,像这种项目访问量不大,体积较小,一个小团队即可完成.但是一个庞大的服务,需要庞大的代码组成,维护起来非常困难,如何解决这个问题,就需要抽丝剥茧,将业务按要求分离出来单独开发,这个问题就迎刃而解了.
解决臃肿的大的服务,拆成若干个小系统,各司其职,假如某个系统出问题,保证整个系统依然正常运行,比如一个城市有多座火车站,一个火车站出问题,不影响其他.
SpringCloud Alibaba 微服务解决方案
概述
SpringCloud Alibaba是SpringCloud中的一个子项目,由阿里巴巴团队开发维护,致力于一站式解决微服务开发的解决方案,此项目包含开发分布式微服务的必要组件,方便程序员通过SpringCloud中的模型轻松式样这些组件来开发分布式微服务应用
重要核心组件
SpringCloud Alibaba默认提供了一下功能组件
- 服务限流降级:
- 默认支持WebService,OpenFeign,RestTemplate,SpringCloud GateWay,RocketMQ限流降级功能的直接接入,可以在运行时通过控制台实时修改限流降级规则,还支持限流降级Metrics监控.
什么是限流降级:例如,电商在搞秒杀活动时,会将秒杀服务的等级提高,限制其他服务访问等级,使秒杀互动正常运行.
有点断臂求生的意思.
- 服务注册与发现
- 基于SpringCloud服务注册与发现标准,通过Nacos后台管理进行实现,默认集成Ribbo
- 分布式配置管理
- 基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新
- 消息驱动能力
- 基于SpringCloud Stream为微服务应用构建消息驱动能力
- 分布式事务
- 使用@GlobalTransactionan注解,高效并且对业务零侵入地解决业务分布式事务问题
- 分布式任务调度
- 提供秒级,精准,高可靠,高可用的定时(基于Cron表达式)任务调度服务,同时提供分布式的任务执行模型,如网格任务,网格任务支持海量子任务均匀分配到所有Worker上执行
SpringCloud Alibaba 架构设计
接下来我们通过创建一个Maven工程一步步的实现分布式微服务的业务逻辑.我们会涉及到的知识内容有,Maven,SpringBoot,Nacos,SpringMVC等.
创建工程
工程结构
微服务一般创建聚合工程结构,便于资源的共享以及简化开发
创建一个空文件目录并配置maven环境
Maven版本使用的3.8.4,Maven仓库最好创建到其他磁盘,否则默认在系统盘下,随着依赖越来越多,C盘承受不住~.
设置版本为8
配置父级pom文件
<dependencyManagement>
<dependencies>
<!--spring boot 核心依赖版本定义(spring官方定义)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud 微服务规范(由spring官方定义)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type><!--假如scope是import,type必须为pom-->
<scope>import</scope><!--引入三方依赖的版本设计-->
</dependency>
<!--Spring Cloud alibaba 依赖版本管理 (参考官方说明)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--第二步: 添加子工程的所需要的公共依赖-->
<dependencies>
<!--lombok 依赖,子工程中假如需要lombok,不需要再引入-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope><!--provided 表示此依赖仅在编译阶段有效-->
</dependency>
<!--单元测试依赖,子工程中需要单元测试时,不需要再次引入此依赖了-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope><!--test表示只能在test目录下使用此依赖-->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--其它依赖...-->
</dependencies>
<!--第三步: 定义当前工程模块及子工程的的统一编译和运行版本-->
<build><!--项目构建配置,我们基于maven完成项目的编译,测试,打包等操作,
都是基于pom.xml完成这一列的操作,但是编译和打包的配置都是要写到build元素
内的,而具体的编译和打包配置,又需要plugin去实现,plugin元素不是必须的,maven
有默认的plugin配置,常用插件可去本地库进行查看-->
<plugins>
<!--通过maven-compiler-plugin插件设置项目
的统一的jdk编译和运行版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!--假如本地库没有这个版本,这里会出现红色字体错误-->
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
创建子类工程-服务提供方工程
注意创建位置,在父级工程下创建子工程
创建子类工程-服务消费方工程
创建网关服务工程
服务关系以及调用关系架构
我们会基于此架构,完成分布式微服务的业务流程.
在下一篇博客中我们将介绍注册中心Nacos的相关内容.