Part03 ☀️

YangeIT大约 11 分钟服务注册和发现Nacos微服务负载均衡

Part03 ☀️

课程内容

  • 服务的调用
    • 购物车微服务远程调用商品服务 ✏️
  • 服务的注册和发现 🍐
    • 注册中心的原理 🍐 ✏️
    • Nacos注册中心 🍐 ✏️
    • 服务注册 🍐 ✏️
    • 服务发现

1. 服务的调用

接下来解决: cart-service 服务中实现对 item-service 服务的调用🎯

服务调用

在拆分的时候,我们发现一个问题:

就是购物车业务中需要查询商品信息,但商品信息查询的逻辑全部迁移到了 item-service 服务,导致我们无法查询。

最终结果就是查询到的购物车数据不完整,因此要想解决这个问题,我们就必须改造其中的代码,把原本本地方法调用,改造成跨微服务的远程调用🎯(RPC,即 Remote Produce Call)。

因此,现在查询购物车列表的流程变成了这样: 调用流程图

调用时序图
调用时序图

那么问题来了 :我们该如何跨服务调用,准确的说,如何在 cart-service 中获取 item-service 服务中的提供的商品数据呢?

提示:使用RestTemplate可以方便的实现 Http 请求的发送

代码操作

核心步骤

  1. 在item-service的controller导入ItemController类,提供一个根据id查询商品的接口
  2. 熟悉RestTemplate,并初始化RestTemplate对象,并准备CartVo类
  3. 注入RestTemplate对象,并发起远程调用
  4. 获得远程的结果,处理数据(最新的价格,状态,库存),返回给前端
  1. 在item-service的controller导入ItemController类,提供一个根据id查询商品的接口
@RestController
@RequestMapping("/items")
public class ItemController {
    @Autowired
    private ItemService itemService;


    /**
     * 接收 http://localhost:端口/items?ids=1,2,3 请求
     * @param ids
     * @return
     */
    @GetMapping
    public List<Item> queryItemByIds(@RequestParam("ids") List<Long> ids) {
        return itemService.listByIds(ids);
    }

}
image
image

2.服务注册和发现

2.1.注册中心原理

注册中心是服务治理中的重要组件,用于管理服务实例的数量和状态,提供服务注册和发现的功能。🎯

注册中心原理

在上一章我们实现了微服务拆分,目前有商品微服务和购物车微服务,并且通过 Http 请求实现了跨微服务的远程调用。不过这种手动发送 Http 请求的方式存在一些问题。

试想一下,假如商品微服务被调用较多,为了应对更高的并发,我们进行了多实例部署,如图:

image
image

此时,每个 item-service 的实例其 IP 或端口不同,问题来了

image
image
  • item-service 这么多实例,cart-service 如何知道每一个实例的地址
  • http 请求要写 url 地址,cart-service 服务到底该调用哪个实例呢?
  • 如果在运行过程中,某一个 item-service 实例宕机cart-service 依然在调用该怎么办?
  • 如果并发太高,item-service 临时多部署了N台实例cart-service 如何知道新实例的地址?

为了解决上述问题,就必须引入注册中心的概念了,接下来我们就一起来分析下注册中心的原理。🎯

总结

  • 服务治理中的三个角色分别是什么?
    • 服务提供者:暴露服务接口,供其它服务调用
    • 服务消费者:调用其它服务提供的接口
  • 注册中心:记录并监控微服务各实例状态,推送服务变更信息
    • 消费者如何知道提供者的地址?
    • 服务提供者会在启动时注册自己信息到注册中心,消费者可以从注册中心订阅和拉取服务信息
  • 消费者如何得知服务状态变更?
    • 服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
  • 当提供者有多个实例时,消费者该选择哪一个?
    • 消费者可以通过负载均衡算法,从多个实例中选择一个

课堂作业

  1. 什么是注册中心?他有什么功能?🎤
  2. 服务的提供者向注册中心提供什么信息?🎤
  3. 服务的调用者从注册中心获取什么信息?🎤
  4. 点击图片,补充空白区域的内容open in new window

2.2.认识和安装Nacos ✏️

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。

认识和安装Nacos

Nacosopen in new window是阿里巴巴的产品,现在是SpringCloudopen in new window中的一个组件。相比Eurekaopen in new window功能更加丰富,在国内受欢迎程度较高。

image-20210713230444308
image-20210713230444308

:::

安装教程码操作

1.1.下载安装包

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacosopen in new window

GitHub的Release下载页:https://github.com/alibaba/nacos/releasesopen in new window

如图:

image-20210402161102887
image-20210402161102887

本课程采用1.4.1.版本的Nacos,课前资料已经准备了安装包:

image
image

windows版本使用nacos-server-1.4.1.zip包即可。

1.2.解压

将这个包解压到任意非中文目录下,如图:

image
image

启动非常简单,双击点击启动.bat即可 image-20210402162526774

1.3.端口配置

Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

image-20210402162008280
image-20210402162008280

修改其中的内容:

image-20210402162251093
image-20210402162251093

1.4.访问

在浏览器输入地址:http://127.0.0.1:8848/nacosopen in new window

image-20210402162630427
image-20210402162630427

默认的账号和密码都是nacos,进入后:

image-20210402162709515
image-20210402162709515

2.3.服务注册

服务注册

接下来,我们把 item-servicecart-service注册到 Nacos,🎯 步骤如下:

  • 引入依赖
  • 配置 Nacos 地址
  • 重启

代码操作

1.添加依赖

item-servicecart-servicepom.xml 中都添加依赖:

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

🎉恭喜你🎉,掌握了nacos服务注册,距离微服务调用越来越近了

总结

课堂作业

  1. 为什么要进行服务注册?🎤
  2. 向注册中心注册服务,主要要配置哪些信息?🎤
  3. 思考一下cart-service远程调用item-service,道理调用哪台服务器尼??