Part04 ☀️

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

Part04 ☀️

课程内容

  • 服务的注册和发现 🍐
    • 注册中心的原理 🍐 ✏️
    • Nacos注册中心 🍐 ✏️
    • 服务注册 🍐 ✏️
    • 服务发现
  • 负载均衡
  • GateWay网关
    • 路由
    • 断言

1.服务注册和发现 🍐

1.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

1.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服务端或者源代码:

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

image
image

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

1.2.解压 👇

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

image
image

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

image-20210402162526774
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

总结

课堂作业

  1. nacos是什么?有什么作用?如果让你打比方,你角色Nacos像生活中的什么东西?🎤

1.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,道理调用哪台服务器尼??

2.网关路由

2.1.认识网关 🍐

认识网关

网关:就是网络的关口,负责请求的路由、转发、身份校验。

数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验

更通俗的来讲,网关就像是以前园区传达室的大爷。

  • 外面的人要想进入园区,必须经过大爷的认可,如果你是不怀好意的人,肯定被直接拦截。
  • 外面的人要传话或送信,要找大爷。大爷帮你带给目标人。 image

现在,微服务网关 就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行
  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
image
image

在 SpringCloud 当中,提供了两种网关实现方案:

  • Netflix Zuul [zuːl]:早期实现,目前已经淘汰
  • SpringCloudGateway:基于 Spring 的 WebFlux 技术,完全支持响应式编程,吞吐能力更强

课堂中以 SpringCloudGateway 为例来讲解,官方网站:

https://spring.io/projects/spring-cloud-gateway/open in new window

image
image

总结

课堂作业

  1. 什么是网关?有何作用?🎤
  2. SpringCloud提供了哪些网关解决方案?哪种方案更受欢迎?🎤

2.2 Gateway快速入门 🍐 ✏️

SpringCloudGateway快速入门

接下来,先看下如何利用网关实现请求路由 。由于网关本身也是一个独立的微服务 ,因此也需要创建一个模块开发功能。大概步骤如下:

  • 创建网关微服务
  • 引入 SpringCloudGateway、NacosDiscovery 依赖
  • 编写启动类
  • 配置网关路由(可以理解为路牌open in new window)
image
image

代码操作

步骤

  1. 创建hm-gateway微服务
  2. 导入网关依赖,并且在com.hmall.gateway下创建GatewayApplication启动类
  3. hm-gateway 模块的 resources 目录新建一个 application.yaml 文件,配置服务名字和nacos配置以及路由信息
  4. 启动网关微服务(端口为8080),观察nacos中是否注册成功,以及访问前端http://localhost:18080open in new window 是否能同时登录和查看购物车列表

1.创建项目

首先,我们要在 hmall 下创建一个新的 module,命名为 hm-gateway,作为网关微服务:

image
image
image
image

创建完成后,程序的结构

3. 负载均衡 🍐

3.1 服务内部的负载均衡 🍐

负载均衡

项目整体的架构:👇

image
image

目前有商品微服务和购物车微服务,并且通过 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的解决方案

步骤

  1. 部署3台商品服务器,端口为8081,8082,8083(购物车端口为:8088)
  2. 调用DiscoveryClient对象,从nacos中获得商品服务器列表
  3. 利用随机数算法,随机选取一台服务器,作为调用的商品服务器实现负载均衡!!!
  4. 测试是否达到预期
  1. 参考下列教程,部署3台商品服务器,端口为8081,8082,8083(购物车端口为:8088) image

部署结果如下:👇 image

3.2 网关负载均衡 🍐

网关负载均衡

image
image

观察上图,思考网关接收到前端检索商品的请求后,道理访问的是下面的哪一台服务器?

image
image

关于网关最后要路由到哪个微服务,可以观察网关的配置

image
image

直接访问前端http://localhost:18080open in new window 登录后,检索商品,观察 1,2,3号服务器的日志输出请求!!

image
image

总结

课堂作业

  1. gateway访问微服务的负载均衡是使用什么策略?🎤