认识微服务

认识微服务

1.单体架构

把所有业务功能集成在以哦个项目中开发,打成一个包部署
优点:

  • 部署简单
  • 部署成本低
    缺点:
  • 团队协作太难了
  • 系统发布效率低
  • 系统可用性差(线上运行,有些并发量搞,如果部署在一台服务器上,可能资源耗尽,等待释放,用户体验差)
    某一个线程并发量太高,就吃完了Tomcat的资源,当访问其他接口的时候就会出现看卡顿/延迟现象

==总结:单体架构适合开发功能简单,规模较小的项目。==

2.微服务

把单个架构中的功能模块拆分为多个独立项目

  • 粒度小
  • 团队自治
  • 服务自治
    ==拆分为多个小的模块之后,编译速度大幅度提高,每个服务独立在一个服务器上,解决了系统可用性差问题,数据库也是隔离的每个服务独立的,避免了高并发访问时的影响其他服务了。==
    b43500757619fb64703145a878d600ca9c4cb1ee.png

3.微服务技术栈SpringCloud

3.1单体拆分成微服务

有纵向拆分和横向拆分
我这里就给大家展示纵向拆分,具体怎么拆分是要看具体的项目的

  • 首先创建一个module
  • 拆分可以是对某个服务进行拆分,从数据库再到整体的业务,要做到:高内聚,低耦合
  • 像大型项目–==淘宝==,就是一个project一个project来管理各个服务,实现了低耦合
  • 注意拆分出来的每个模块都要配置好依赖,注意端口不要冲突吗,==微服务名称不要冲突==这点比较麻烦,需要细心查看,否则扫描包的时候可能会报错
  • 注意数据库在真实的企业开发中,是一个微服务对应一个数据库容器的,但是这里考虑到资源问题,我直接使用不同的 database 作为隔离

[!NOTE] 注意
在做拆分的时候有些业务不完整,可以先去掉/注释掉
虽然两个服务的在物理上已经没有关系,完全分割开了,这时候两个服务是没办法调用别的服务的

f4c2953c67d250c09dce0e868850191f4285da38.jpeg

3.2远程调用

虽然物理上隔开了,但是网络上还是相通的,那为什么我们不能通过网络取请求这些数据呢
一旦微服务进行了拆分,数据产生了隔离,服务之间也产生了隔离,这个时候没办法像以前一样去本地调用了==要进行数据查询,查询别人的数据,就必须通过网络调用==
93cfda25ad1930736c732cb14cc151a9cfc87ecb.png

网络调用怎么做呢?

可以像前端想后端发起一个网络请求一样,用java代码去使用网络请求

  1. 在启动类创建RestTemplate实例
1
2
3
4
@Bean  
public RestTemplate restTemplate() {
return new RestTemplate();
}
  1. 直接使用
1
2
3
4
5
6
7
8
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, ","))
);
  • 字节码泛型会擦除,但是你new的对象他的泛型不会,这时候就可以通过反射拿到你这个对象上的泛型,从而就知道了我们想要的返回值类型是这个:List

整体的网络调用查询的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//2.1 利用RestTemplate发起http请求, 得到http响应  
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, ","))
);
//2.2 解析这个响应
if (!response.getStatusCode().is2xxSuccessful()){
// 查询失败,直接结束
return;
}
List<ItemDTO> items = response.getBody();
if (CollUtils.isEmpty(items)) {
return;
}

虽然上面的==服务远程调用==能够实现业务逻辑,但是
f11ce9a33531c6e5287826dad7a23d356a7545ae.png

存在着严重的问题==服务治理的问题==

这个我下一篇 ==服务治理== 会详细讲解