什么是微服务
微服务是一种用于构建应用的架构方案
微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响
可以理解为模块化
微服务与微服务结构
微服务强调的是服务的大小,是具体解决某一个问题对应的服务应用
微服务架构是一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调,相互配合,为用户提供最终价值,每个服务运行在其独立的进程中
微服务优缺点
优点
- 每个服务足够内聚、足够小(职责单一),代码容易理解
- 开发简单,效率高
- 微服务能够没小团队单独开发
- 开发和部署都是独立的
- 可以使用不同的语言开发
- 易于和第三方集成
缺点
- 开发人员要处理分布式的复杂性
- 运维难度和成本增大
- 服务间通信成本增加
- 出现数据一致性问题
SpringCloud
SpringCloud是基于SpringBoot提供的一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件
SpringBoot没有重复造轮子,而是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装,屏蔽了复杂的配置和实现原理,最终给开发者留下一套简单易用的开发工具包
SpringCloud是分布式微服务架构下的一站式解决方案,是各个微服务结构落地技术的集合体,俗称微服务全家桶
SpringCloud和SpringBoot的关系
SpringBoot专注于快速方便的开发单个个体微服务(也就是一个个Jar包)
SpringCloud关注于全局微服务协调治理框架,将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等集成服务
SpringBoot可以离开SpringCloud单独开发项目,但是SpringCloud离不开SpringBoot
版本的选择问题
需要注意的是,并不是所有工具的选择上都是最新的最好
对于SpringCloud的使用来说,与SpringBoot的版本对应最好根据官方网站的推荐搭配
项目搭建
SpringCloud项目的创建方式,基础架构,要清楚SpringCloud是基于SpringBoot的。
创建父工程
删除src
文件,保留pom.xml
配置pom.xml
<!-- 打包方式 -->
<packaging>pom</packaging>
<!-- 版本统一控制 -->
<properties>
<lombok.version>1.18.20</lombok.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- springcloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springboot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建实体类子工程
在父工程下创建一个Module,同样选择Maven项目,此时该工程的pom.xml
中会出现父工程信息
而父工程pom.xml
中就会出现子工程的module
正常业务模块创建
同样在父工程下创建Module,Maven项目
导入实体类模块
<dependency>
<groupId>org.fan</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
如果导入的依赖在父工程中有定义,就不用指定版本号,使用父工程的即可,其余操作跟普通Maven项目一样。