目录
什么是微服务
微服务架构(MSA)的基础是将单个应用程序开发为一组小型独立服务,这些独立服务在自己的进程中运行,独立开发和部署。这些独立服务使用轻量级的api通过定义的接口进行通信。这些服务是围绕业务功能构建的,每项服务执行一项功能。由于他们是独立运行的,因此可以根据各项服务进行更新、部署和扩展,以满足对应功能特定程序的需求。
程序中的微服务就是将各个业务系统的共性进行抽取,做成独立的服务,如图:
总之,微服务是分布式系统中的一种流行的架构模型,它并不是银弹,所以,也不要寄希望于微服务构架能够解决所有的问题。微服务架构主要解决的是如何快速地开发和部署我们的服务,这对于一个能够适应快速开发和成长的公司是非常必要的。同时,微服务设计中有很多很不错的想法和理念,通过学习微服务架构我们可以更快的迈向卓越。
SpringCloud Alibaba微服务解决方案
Spring Cloud Alibaba 是Spring Cloud的一个子项目,致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
核心组件
服务限流降级:
默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:
基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
分布式配置管理:
基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:
基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
分布式任务调度:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行。
解决方案的架构设计
基于Spring Cloud Alibaba实现的微服务,解决方案设计架构如图所示:
构建 SpringCloud聚合项目
首先创建一个空项目
配置环境:1.maven环境,2.字节编码utf-8,3.指定当前版本的jdk编译版本及其编译环境
创建父类Module 01-sca
修改pom.xml文件;
<dependencyManagement> <dependencies> <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.2.RELEASE</version> <type>pom</type><!--允许scope的值为import时,type的值必须pom--> <scope>import</scope> <!--这里的import类似java中的import--> </dependency> <!--Spring Cloud (Spring Cloud 工程依赖于spring boot), spring cloud中定义的是一些微服务规范。--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR9</version> <type>pom</type> <scope>import</scope> </dependency> <!--Spring Cloud Alibaba (这套依赖是基于Spring Cloud规范,做了具体的落地实现)--> <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> <!--定义公共依赖(lombok,test)--> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <!--springboot 2.2以后版本默认单元测试使用的是junit5, 所以junit4以前的测试引擎不在需要--> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <!--定义统一编译运行环境(jdk)--> <build> <plugins> <!--定义maven的编译插件--> <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>
<dependencyManagement></dependencyManagement>:常用于Maven聚合工程,在父工程中,将所有需要依赖的坐标写到这个标签之间,即只声明依赖。 在子模块中,需要什么坐标,就写到 <dependencies>标签之间,且不用写版本,因为父工程中已经有声明依赖的版本,如果不想使用已有的版本,可以在添加自己的版本。子模块项目会自动引用依赖。
<dependencies></dependencies>:如果子项目的 <dependencies> 标签的子标签 <dependency> 里面没有写 <version> 标签,那么 maven 就会自动到父项目的 <dependencyManagement> 标签里面去找有没有对该 artifactId 和 groupId 进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你 <dependency> 标签里面必须写一个 <version> 标签
如果子项目的 <dependencies> 标签的子标签 <dependency> 里面写了 <version> 标签并指定了具体的版本,那么无论父项目的 <dependencyManagement> 标签中有无对该 jar 包的 version 声明,都以子项目的 version 为准
<dependency></dependency>:依赖添加标签
<groupId></groupId>:组id,jar包所在的地址
<artifactId></artifactId>:映入jar包的名字和位置
<version></version>:所依赖jar包的版本信息
<type></type> :里的值默认值是jar表示引入的是jar包,这里使用的是pom表示导入的是父模块;
<scope></scope>:中的值import代表把父模块中的jar包导入进来,scope指所属的作用范围,
他在spring ioc中也作为注解使用,单例多例设置就使用的@Scope
<exclusions></exclusions>:排除依赖,比如文中的junit4依赖过旧,不适合微服务,那么我们就要用依赖排除来出去junit4版本,这样就不会出现jar包导入错误的问题。
<build></build>:定义jdk统一的运行时环境(文章中当前的build只编译了部分)
创建子类Module sca-common
创建子类Module sca-consumer
创建子类Module sca-gateway
创建子类Module sca-provider
父子类的pom.xml的配置
(1).当四个子类都创建好之后,在01-sca的pom.xml中会自动出现如图所示:
当需要删除某一个modules时,需要删除pom.xml中的module属性,然后再删除项目文件,当需要重新创建同名的文件时,需要注意:(如果出现对勾,需要取消对勾,再创建文件)
(2)父类配置好的依赖项,子类依然可以使用,子类不再需要配置该依赖,但是子类配置过的依赖项,父类不能使用。
配置spring boot:
当你想要在普通的测试类中调用项目中的对象,需要把项目中的对象交给spring管理(使用注解@Component),创建启动类springbootApplication(使用注解@SpringBootApplication)
创建springboot测试类(使用注解@SpringBootTest),把对象依赖注入到测试类中(使用注解@Autowired),编辑测试方法进行测试。