微服务学习-Nacos 作为注册中心使用

Nacos 实现服务的注册与发现

1. 作用

服务的注册与发现

2. 为什么要引入注册中心

微服务中的订单服务调用商品、库存、账户等服务的 IP 地址和端口都是硬编码,会存在很多问题

  • 如果商品、库存、账户等服务的 IP 地址或端口发生了变化,则订单服务将变得不可用,需要同步修改订单服务调用的地址和端口。
  • 如果系统中提供多个商品、库存、账户等服务,则无法实现微服务的负载均衡功能。
  • 如果需要支持更高的并发,需要部署多个商品、库存账户服务,订单服务中的硬编码后续维护变得异常复杂。

所以,微服务开发过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

3. Nacos 是什么

官方文档:Nacos 配置中心简介, Nacos 是什么 | Nacos 官网

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。--简单理解就是注册中心+配置中心

4. Nacos 下载安装

目前使用版本:Nacos Version: 2.3.2

官方下载地址:https://github.com/alibaba/nacos/tags

官方安装文档:Nacos支持三种部署模式 | Nacos 官网

安装成功后直接访问 http://icoolkj-mall-nacos-server:8848/nacos注意配置 hosts 地址映射,使用云服务器需要开放端口策略),默认账号密码都是 nacos

5. 微服务整合 Nacos 注册中心

官方参考文档:快速开始-阿里云Spring Cloud Alibaba官网

融合 Spring Cloud 文档:Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos 官网

5.1. 整合 Nacos 的服务提供者(库存服务)

服务提供者可以通过 Nacos 的服务注册功能将其服务注册到 Nacos server 上。

5.1.1. 引入依赖:库存服务的 pom.xml 添加 nacos-discovery 注册中心依赖
复制代码
<!--nacos-discovery  注册中心依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
5.1.2. 库存服务的 application.yml 中配置 Nacos server 的地址
复制代码
spring:
  application:
    name: icoolkj-mall-inventory
  cloud:
    nacos:
      server-addr: icoolkj-mall-nacos-server:8848/
5.1.3. 在库存服务启动类上使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
复制代码
@EnableDiscoveryClient
public class InventoryApplication {
5.1.4. 重新启动库存服务,然后进入 nacos 控制台查看库存服务是否成功注册
5.1.5. 同理,商品、账户服务配置同上。
5.2. 整合 Nacos 的服务调用(消费)者(订单服务)
5.2.1. 服务注册

订单服务也需要注册到 Nacos,具体配置同上。

5.2.2. 服务发现

服务调用者可以通过 Nacos 的服务发现功能从 Nacos server 上获取到它要调用的服务。

发现问题:订单服务作为服务调用(消费)者,需要获取库存服务列表,然后选择一个库存服务节点发起调用,那么多个库存服务节点,到底调用那个库存服务节点呢?

新的需求:如果实现选择一个库存服务节点发起调用?

解决方案:RestTemplate + LoadBalancer

6. RestTemplate + LoadBalancer

6.1. 什么是 LoadBalancer

官方文档:Spring Cloud LoadBalancer :: Spring Cloud Commons

SpringCloud LoadBalancer 是由 SpringCloud 官方提供的一个开源的,简单易用的客户端负载均衡器。它包含在 SpringCloud-commons 中用来替换以前的 Ribbon 组件。相比较 Ribbon,SpringCloud LoadBalancer 不仅能够支持 RestTemplate,还支持 WebClient (WebClient 是 Spring Web Flux 中提供的功能,可以实现响应异步请求)。

6.2. 订单服务如何使用 LoadBalancer

订单服务利用负载均衡器 LoadBalancer,从多个库存列表中选择一个节点,再通过 RestTemplate 实现库存服务调用。

6.2.1. 订单服务的 pom.xml 中添加 LoadBalancer 的依赖
复制代码
<!-- loadbalancer 负载均衡器依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
6.2.2. 订单服务的 application.yml 中添加配置 spring.cloud.loadbalancer.nacos.enabled-true
复制代码
spring:
  application:
    name: icoolkj-mall-order
  cloud:
    nacos:
      server-addr: icoolkj-mall-nacos-server:8848
    loadbalancer:
      nacos:
        enabled: true
6.2.3. RestTemplate 添加通过 @LoadBalanced 注解接入 LoadBalancer
复制代码
@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
6.2.4. 订单服务调用逻辑调整

RestTemplate 远程调用,将库存服务的 localhost:8081 使用微服务名称 icoolkj-mall-inventory 替代

复制代码
//String inventoryUrl = "http://localhost:8081/api/inventory/reduce-inventory";
String inventoryUrl = "http://icoolkj-mall-inventory/api/inventory/reduce-inventory";
int inventoryCode = restTemplate.postForObject(inventoryUrl, inventoryRequest, Result.class).getCode();

7. 重启所有服务,测试

7.1. 借助 idea 工具,增加一个库存服务(服务端口:8086)

通过 idea 复制一个启动程序,增加 vm 选项,配置 -Dserver.port=8086

7.2. Nacos 控制台查看服务是否都注册成功
7.3. 多次下单,查看是否成功扣减库存,并查看当前 2 个库存服务的调用的时候,能否调用到新库存服务(服务端口:8086) 。

库存正常扣减,负载均衡器也成功达到效果。

8. RestTemplate + LoadBalancer 这种方式进行微服务调用存在那些问题?

8.1.1. 代码可读性差,编程体验不统一,无法像本地方法调用那样,参数复杂的 URL 难以维护。
8.1.2. 是否有比 RestTemplate + LoadBalancer 更方便好用的服务调用组件?

可以选择 OpenFeign 简化服务调用。

9. 下单业务场景(订单服务调用库存服务为例)

10. 小结

通过 Nacos 注册中心可以实现微服务的注册与发现。

相关推荐
周杰伦_Jay5 小时前
【Spring Cloud Alibaba】微服务组件详解:电商场景落地实践
微服务·云原生·架构
码界奇点6 小时前
Python从0到100一站式学习路线图与实战指南
开发语言·python·学习·青少年编程·贴图
老前端的功夫7 小时前
Vue 3 性能深度解析:从架构革新到运行时的全面优化
javascript·vue.js·架构
YJlio7 小时前
Active Directory 工具学习笔记(10.8):AdInsight——保存与导出(证据留存、共享与二次分析)
数据库·笔记·学习
生骨大头菜8 小时前
使用python实现相似图片搜索功能,并接入springcloud
开发语言·python·spring cloud·微服务
噗噗夹的TA之旅10 小时前
Unity Shader 学习20:URP LitForwardPass PBR 解析
学习·unity·游戏引擎·图形渲染·技术美术
2401_8345170711 小时前
AD学习笔记-36 gerber文件输出
笔记·学习
气π11 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi
深蓝海拓11 小时前
PySide6从0开始学习的笔记(三) 布局管理器与尺寸策略
笔记·python·qt·学习·pyqt
暗然而日章11 小时前
C++基础:Stanford CS106L学习笔记 8 继承
c++·笔记·学习