文章目录
- 一、认识微服务
- 二、微服务拆分原则
- 三、模块拆分
- 1.根据不同功能创建模块
- 2.修改配置文件
- 3.搬运包
- 四、远程调用
这一章我们从单体架构的优缺点来分析,看看开发大型项目采用单体架构存在哪些问题,而微服务架构又是如何解决这些问题的
一、认识微服务
单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:
架构简单
部署成本低
缺点:
团队协作成本高
系统发布效率低
系统可用性差
总结:
单体架构适合开发功能相对简单,规模较小的项目。
微服务
微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。
粒度小
团队自治
服务自治
SpringCloud
SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验
二、微服务拆分原则
从拆分目标来说,要做到:
高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖。
从拆分方式来说,一般包含两种方式:
纵向拆分:按照业务模块来拆分
横向拆分:抽取公共服务,提高复用性
三、模块拆分
1.根据不同功能创建模块
2.修改配置文件
pom.xml包:根据需求删减部分配置
application.yaml包
修改端口号
server:port: 8081
spring下的文件名与mysql信息
spring:application:name: item-serviceprofiles:active: devdatasource:url: jdbc:mysql://${hm.db.host}:3306/hm-item?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: ${hm.db.pw}
3.搬运包
根据需求将同功能的包组合到一起
四、远程调用
在拆分的时候,我们发现一个问题:就是购物车业务中需要查询商品信息,但商品信息查询的逻辑全部迁移到了item-service服务,导致我们无法查询。
最终结果就是查询到的购物车数据不完整,因此要想解决这个问题,我们就必须改造其中的代码,把原本本地方法调用,改造成跨微服务的远程调用(RPC,即Remote Produce Call)。
因此,现在查询购物车列表的流程变成了这样:
注入RestTemplate到Spring容器
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
发起远程调用
public <T> ResponseEntity<T> exchange(String url, // 请求路径HttpMethod method, // 请求方式@Nullable HttpEntity<?> requestEntity, // 请求实体,可以为空Class<T> responseType, // 返回值类型Map<String, ?> uriVariables // 请求参数
)
案例:
ResponseEntity<List<ItemDTO>> response= restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids",CollUtil.join(itemIds, ",")));