做淘宝客需要自己建网站吗免费建站系统对比
1 微服务的概念
-  
区别于单体项目
 -  
单体项目拆分成微服务项目的目标:高内聚、低耦合
 -  
拆分思路
-  
纵向拆分:根据功能模块
 -  
横向拆分:抽取可复用模块
 
 -  
 
2 微服务拆分——远程调用
背景:微服务单一职责,每个服务只有自己的功能和数据,拆分出来的模块需要用到其他模块的功能,如查询购物车时也需要查询商品信息,但是两个模块不能直接调用
-  
模拟前端向后台发送请求
 -  
RestTemplate:通过远程调用,发送 HTTP 请求,得到 HTTP 响应
 
3 服务治理
服务远程调用存在问题:
写代码时还不知道要调用的服务地址(还没启动):例如 cart-service 不知道 item-service 启动的地址 / 端口
如果知道了地址,集群模式下 item-service 部署在多台服务器上(多实例部署),开启了负载均衡,cart-service 不知道该访问哪个端口
选了一个进行访问,如果该服务挂了,怎办?
写死了访问地址,item-service 又在新的服务器 / 端口上启动了,怎么知道新启动的服务的地址?无法感知服务状态的变更
以上问题统称为 服务治理
3.1 注册中心原理
如何解决服务治理问题?1 2 3 4
三个角色
-  
每个服务既可以作为服务的调用者
 -  
也可以作为服务的提供者
 -  
注册中心(家政中心)
-  
服务提供者到注册中心注册服务信息
 -  
服务调用者访问注册中心,订阅所需服务的信息
-  
负载均衡:随机、轮询、加权随机、加权轮询、哈希
 
 -  
 -  
监控服务状态变更
-  
服务提供者需要与注册中心进行 心跳续约,如果服务挂了(不再发送续约消息)就会将该服务从服务注册表中移除,并向服务调用者推送变更
 -  
注册中心会向服务调用者推送服务状态变更(有服务挂了、有新的服务启动)的新消息
 
 -  
 
 -  
 
3.2 搭建 Nacos 实现注册中心
-  
Nacos 是一个注册中心组件
 -  
使用 Docker 部署 Nacos 服务
 -  
可以进入 Nacos 控制面板监控服务的健康状态和服务详情(如启动服务器 IP 和端口等)
 

3.3 服务注册
步骤
-  
引入 nacos discovery 依赖
 -  
配置要注册的服务名称和 Nacos 的地址
 -  
启动服务实例(IDEA 的多个端口)
 

3.4 服务发现
步骤
-  
引入 nacos discovery 依赖
 -  
配置 Nacos 地址
 -  
服务发现:到 Nacos 注册中心获取服务注册列表(可以使用 Spring Cloud 提供的 API)
-  
根据服务名称,获取服务实例列表
 -  
负载均衡,选择一个实例进行请求
 -  
获取实例的 IP 和端口,发起远程调用
 
 -  
 
3.5 治理结果
-  
服务调用者不再需要记住服务提供者的 IP 地址和端口号,而是根据服务名称 动态拉取 服务实例列表,并通过负载均衡选择随机选择一个服务实例进行调用
 -  
服务挂了 ✔ 心跳续约
 -  
新启动的服务 ✔ 推送变更
 
4 OpenFeign 的使用
1. 基本介绍
- 声明式的 HTTP 客户端,基于 SpringMVC 的常见注解,更简单地实现 HTTP 请求的发送
 
2. 使用步骤
- 引入依赖
 
负载均衡的实现早期用的是 Spring Cloud 的 Ribbon,现在用的是 loadbalancer

-  
项目主类 / 启动类使用注解 @EnableFeignClients 开启 OpenFeign 功能
 -  
编写 FeignClient:使用 @FeignClient(value = "item-service"),@FeignClient 会将该类标记为一个 FeignClient 客户端,value 是服务名称, OpenFeign 会根据该 value 到注册中心去拉取实例列表
 
注意:这是一个不需要实现的接口,OpenFeign 会自动帮我们实现该接口

-  
使用 FeignClient,实现远程调用:配置好 FeignClient 接口后就可以像使用本地方法一样实现远程调用
 
List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3));