当前位置: 首页 > article >正文

Nacos注册中心一些配置说明

未安装Nacos的可以参考以下的安装教程

Nacos 安装教程(史上最详细保姆级教程)_nacos安装_大三的土狗的博客-CSDN博客

注意: Nacos默认是集群部署,如果想单机启动需要在对应Nacos的bin目录执行下面的命令

因为以后不可能只有一个Nacos注册中心,所以就默认集群部署很合理(😄

startup.cmd -m standalone

Nacos注册中心一些配置说明

现在有两个服务一个是user-service(提供者) 一个是order-service (消费者)

从四个方面说明:

  1. 服务注册的配置
  2. Nacos服务分级的配置(集群配置)
  3. 服务权重的配置
  4. 环境隔离的配置

一 基本服务配置

1 导入依赖

在消费者(user-service)和提供者(order-service )的pom中导入注册的依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<!-- 像这种通用的版本配置我们一般交给父工程管理,这里我先加上 -->
    <version>2.2.6.RELEASE</version>  
</dependency>

注意:如果有eureka等注册中心的依赖,需要注释掉,因为二者冲突> 亲测冲突🐶

2 地址配置

在微服务的配置文件中配置, 即消费者和提供者的配置文件

spring:
  cloud:
    nacos:
      server-addr: localhost:8848  # 自己Nacos的地址及端口

此时当前服务就可以知道注册中心的位置,也可以向注册中心注册自己的服务

二 服务分级存储模型

首先说明一下为什么分级,因为在分布式系统中,一个服务可能有多个实例, 那么实例和实例之间的关系,又可以进一步的划分,就比如这里的user-service服务,假设有如下三个实例(忽略模拟地址)

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

假如这些实例分布于全国各地的不同机房,例如:

  • 127.0.0.1:8081,在上海机房
  • 127.0.0.1:8082,在上海机房
  • 127.0.0.1:8083,在杭州机房

Nacos 可以通过配置将同一机房内的实例 划分为一个集群

也就是说,user-service服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

杭州机房内的order-service应该优先访问同机房的user-service。

1. 给user-service配置集群

修改user-service的application.yml文件,添加集群配置:

此时有三个实例,对实例依次配置所属集群

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

配置之后重启进入Nacos中刷新就可以看到,如下配置

在这里插入图片描述

现在就实现了三台user-service服务两台在HZ集群,一台在SH集群

下面对order-service也进行集群的配置,把其放入到HZ集群中

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称
2. 同集群优先的负载均衡

配置之后此时的集群分布图如下:

红色框框是我们已经配置的四台服务, 此时对于order-service来说有三台user-service服务可以选择,那么应该怎么选择呢?

按照默认的负载均衡规则使用的是ZoneAvoidanceRule,他的规则是什么呢?如下

ZoneAvoidanceRule
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。

可见该规则并不能实现根据同集群优先来实现负载均衡。

因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。我们一般也就使用NacosRule规则, 具体的配置如下

userservice:  # 顶格
  ribbon:     # 这里的ribbon是springCloud底层使用的负载均衡组件
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

对于底层Ribbon具体做了什么可以参考下面文章的下半部分

Eureka注册中心及Ribbon的源码跟踪_yfs1024的博客-CSDN博客

如果此时杭州的两台服务都挂了此时就会根据Nacosrule拉取到上海集群中的对应的服务,但是此时order-service会报如下异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxyLa7s8-1683265483964)(C:\Users\57589\AppData\Roaming\Typora\typora-user-images\image-20230505115935558.png)]

三 权重配置

如果了解nginx的配置,其实这个和nginx中权重的一次基本一样.

权重的出现为我们解决了一些问题; 比如服务升级,服务的选择

在之前的项目中,对于服务的升级为了不影响服务正常的使用一般选择在访问较小的时间进行升级,即服务升级和时间挂钩, 但是有了权重就可以通过设置权重值来设置当前的服务的访问比.

服务选择.实际部署中还会出现这样的场景:服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

在这里插入图片描述在弹出的编辑窗口,修改权重:

在这里插入图片描述

注意:如果权重修改为0,则该实例永远不会被访问, 此时我们就可以升级系统

由此就通过去那种解决了服务升级,服务的选择这两问题

四 环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

我们可以通过将当前实例配置到不同的namespace中来实现服务之间的隔离

那么我们为什么要隔离? 比如现在我们想测试, 但是不想被开发的一些实例影响就可以使用namespace将测试与开发环境隔离开来

对于下面的理解可以忽略组的概念

1. 创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public

在这里插入图片描述

我们可以点击页面新增按钮,添加一个namespace:

然后,填写表单:这里的命令空间的名称 默认是使用UUID生成

就能在页面看到一个新的namespace:

2. 给微服务配置namespace

修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

重启order-service后,访问控制台,可以看到下面的结果:

此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

此时就实现了不同服务环境的隔离,这也是Nacos提供的Namespace的用处之一


http://www.kler.cn/news/18093.html

相关文章:

  • 《Netty》从零开始学netty源码(五十三)之PoolThreadCache的功能
  • MySQL面试八股文:索引篇
  • 我把Solon打包成了native image,速度快的惊人
  • 【linux的学习与软件安装】
  • 计算机操作系统实验:页面置换算法的实现
  • 充电桩测试设备TK4800充电桩现校仪检定装置
  • MySQL优化二索引使用
  • 信息安全从业人员职业规划(甲方乙方分别说明)
  • 中兴B860AV2.1-T(M)-高安版-当贝纯净桌面线刷固件包
  • Facebook 用户量十分庞大,为什么还使用 MySQL 数据库?
  • IDEA沉浸式编程体验
  • 锁相环技术,单边带信号,信号的调制
  • MySQL数据库之索引
  • 【SpringMVC】三、SpringMVC获取请求参数与域数据共享
  • Ubuntu20.04安装Vtk9.2.6+PCL1.12.1(成功无报错)
  • 使用asp.net core web api创建web后台,并连接和使用Sql Server数据库
  • Flink dataStream,如何开窗,如何进行窗口内计算
  • BM54-三数之和
  • 盲目自学网络安全只会成为脚本小子?
  • Java入门全网最详细 - 从入门到转行
  • MySQL安装配置教程(保姆级,包含环境变量的配置)适合小白
  • 【Java笔试强训 33】
  • 【python脚本系列】python脚本2——PDF转word文档
  • Rosetta从头蛋白抗体设计、结构优化及在药物研发中的应用
  • Grafana 系列-统一展示-1-开篇
  • 本地使用3台centos7虚拟机搭建K8S集群教程
  • 璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!
  • Chapter4:频率响应法(下)
  • tiechui_lesson01_入口函数和卸载函数
  • MySQL数据库——MySQL存储函数详解