SpringCloud微服务之Eureka、Ribbon、Nacos详解

news2024/12/23 6:48:26

SpringCloud微服务之Eureka、Ribbon、Nacos详解

  • 1、认识微服务
    • 1.1、单体架构
    • 1.2、分布式架构
    • 1.3、微服务
    • 1.4、SpringCloud
  • 2、服务拆分与远程调用
    • 2.1、服务拆分的原则
    • 2.2、服务拆分示例
    • 2.2、提供者与消费者
  • 3、Eureka注册中心
    • 3.1、Eureka的结构和作用
    • 3.2、搭建eureka-server
      • 3.2.1、创建eureka-server微服务
      • 3.2.2、引入eureka依赖
      • 3.2.3、编写启动类
      • 3.2.4、编写配置文件
      • 3.2.5、启动服务
    • 3.3、服务注册
      • 3.3.1、启动多个user-service实例
    • 3.4、服务发现
  • 4、Ribbon负载均衡
    • 4.1、负载均衡的原理
    • 4.2、负载均衡策略
    • 4.3、饥饿加载
  • 5、Nacos注册中心
    • 5.1、认识和安装Nacos
      • 5.1.1、Windows安装
      • 5.1.2、Linux安装
    • 5.2、Nacos的依赖
    • 5.3、服务分级存储模型
      • 5.3.1、给user-service配置集群
      • 5.3.2、同集群优先的负载均衡
    • 5.4、权重配置
    • 5.5、环境隔离
      • 5.5.1、创建namespace
      • 5.5.2、给微服务配置namespace
    • 5.6、Nacos与Eureka的区别

1、认识微服务

随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?

1.1、单体架构

  • 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

在这里插入图片描述

单体架构的优缺点如下:

优点:

  • 架构简单、部署成本低

缺点:

  • 耦合度高(维护困难、升级困难)

1.2、分布式架构

  • 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

在这里插入图片描述

分布式架构的优缺点:

优点:

  • 降低服务耦合、有利于服务升级和拓展

缺点:

  • 服务调用关系错综复杂

思考:分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:

  • 服务拆分的粒度如何界定?
  • 服务之间如何调用?
  • 服务的调用关系如何管理?

人们需要制定一套行之有效的标准来约束分布式架构。

1.3、微服务

微服务的架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
  • 自治:团队独立、技术独立、数据独立,独立部署和交付
  • 面向服务:服务提供统一标准的接口,与语言和技术无关
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

在这里插入图片描述

微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚低耦合

因此,可以认为微服务是一种经过良好架构设计的分布式架构方案 。但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。其中在Java领域最引人注目的就是SpringCloud提供的方案了。

1.4、SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

其中常见的组件包括:

在这里插入图片描述

另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:

在这里插入图片描述

2、服务拆分与远程调用

2.1、服务拆分的原则

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

在这里插入图片描述

每个微服务都有自己的数据库,用户功能里面存的是用户相关的数据库,商品功能里面存的是商品相关的数据库,如果想在用户功能里面需要订单的信息,那么订单模块就对外暴露成一个接口,供用户功能的微服务调用。

2.2、服务拆分示例

  1. 创建订单模块的数据库KuangStudy_springcloud_order,然后导入下述sql
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
  `price` bigint(20) NOT NULL COMMENT '商品价格',
  `num` int(10) NULL DEFAULT 0 COMMENT '商品数量',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12 ', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '骆驼(CAMEL)休闲运动鞋女', 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 双模5G 视频双防抖', 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II ', 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人体工学电脑椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休闲男鞋', 31900, 1);
  1. 创建用户模块的数据库KuangStudy_springcloud_user,然后导入下述sql
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_user` VALUES (1, '柳岩', '湖南省衡阳市');
INSERT INTO `tb_user` VALUES (2, '文二狗', '陕西省西安市');
INSERT INTO `tb_user` VALUES (3, '华沉鱼', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '张必沉', '天津市');
INSERT INTO `tb_user` VALUES (5, '郑爽爽', '辽宁省沈阳市大东区');
INSERT INTO `tb_user` VALUES (6, '范兵兵', '山东省青岛市');

tb_user表中初始数据如下:

在这里插入图片描述

tb_order表中初始数据如下:

在这里插入图片描述

tb_order表中持有tb_user表中的id字段。

  1. 在order-service服务中,有一个根据id查询订单的接口:

在这里插入图片描述

根据id查询订单,返回值是Order对象,如图:

在这里插入图片描述

在user-service中有一个根据id查询用户的接口:

在这里插入图片描述

查询的结果如图:

在这里插入图片描述

  1. 案例需求:修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回

在这里插入图片描述

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器
  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User
  • 将查询的User填充到Order对象,一起返回
  1. 在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    /**
    * 注册RestTemplate
    */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法

在这里插入图片描述

  1. 访问:http://localhost:8080/order/101

在这里插入图片描述

2.2、提供者与消费者

在服务调用关系中,会有两个不同的角色:

  • 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

  • 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

思考:如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者
  • 因此,服务B既可以是服务提供者,也可以是服务消费者。

总结:一个服务既可以是提供者,也可以是消费者

3、Eureka注册中心

  • 读音:Eureka:you rui ka

假如我们的服务提供者user-service部署了多个实例,如图:

在这里插入图片描述

大家思考几个问题:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

3.1、Eureka的结构和作用

这些问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka,其结构如下:

在这里插入图片描述

Eureka分为两层结构:

  1. 服务端:也就是注册中心
  2. 客户端:包含服务消费者和服务提供者

每一个user-service在启动时都会去 注册中心 注册服务信息,Eureka会把这些信息记录下来,包括ip、端口等等,如果 order-service 需要调用user-service的接口,先去找注册中心,注册中心有关于user-service的信息,则order-service就可以获取到user-service的信息了。

如上图,order-service拿到了3个user-service的信息,通过负载均衡挑出一个,这样order-service就可以调用user-service了。

思考:那挑选出来的user-service会不会宕机呢?

答案:不会,因为客户端会每30秒给Eureka发送心跳,来续费自己的信息,以此来让Eureka来确保自己还活着!

这样我们就可以回答之前的各个问题了!

  1. order-service如何得知user-service实例地址?
    • 获取地址信息的流程如下:
    • user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
    • eureka-server保存服务名称到服务实例地址列表的映射关系
    • order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取
  2. order-service如何从多个user-service实例中选择具体的实例?
    • order-service从实例列表中利用负载均衡算法选中一个实例地址
    • 向该实例地址发起远程调用
  3. order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?
    • user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
    • 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
    • order-service拉取服务时,就能将故障实例排除了

3.2、搭建eureka-server

3.2.1、创建eureka-server微服务

在cloud-demo父工程下,创建一个子模块:

在这里插入图片描述

填写Maven模块信息:

在这里插入图片描述

然后填写服务信息:

在这里插入图片描述

3.2.2、引入eureka依赖

引入SpringCloud为eureka提供的starter依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3.2.3、编写启动类

给eureka-server服务编写一个启动类:

  • src/main/java/cn/itcast/eureka/EurekaApplication.java
  • 一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3.2.4、编写配置文件

编写一个application.yml文件,内容如下:

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

3.2.5、启动服务

启动erueka-server微服务EurekaApplication,然后在浏览器访问:http://127.0.0.1:10086,看到如下结果则成功。

在这里插入图片描述

3.3、服务注册

下面,我们将user-service注册到eureka-server中去。

  1. 引入依赖

    在user-service的pom文件中,引入下面的eureka-client依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 配置文件

    在user-service中,修改application.yml文件,添加服务名称、eureka地址:

spring:
  application:
  	# 微服务的名字
    name: userservice
    
# eureka 服务注册    
eureka:
  client:
    service-url:
      # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

3.3.1、启动多个user-service实例

为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service。模拟多实例部署,但是为了避免端口冲突,需要修改端口设置。

  1. 首先,复制原来的user-service启动配置:

在这里插入图片描述

  1. 填写信息,将第二个user-service的端口写为8082

在这里插入图片描述

  1. 启动两个user-service实例(第一个是8081端口、第二个是8082端口)、启动eureka-service 注册中心

3.4、服务发现

下面,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。

  1. 引入依赖:之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致,在order-service的pom文件中,引入下面的eureka-client依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 配置文件:服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息,在order-service中,修改application.yml文件,添加服务名称、eureka地址
spring:
  application:
  	# 微服务的名字
    name: orderservice
    
# eureka 服务注册    
eureka:
  client:
    service-url:
      # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka
  1. 服务拉取与负载均衡

最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。不过这些动作不用我们去做,只需要添加一些注解即可。

  • 在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

在这里插入图片描述

  • 修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:

在这里插入图片描述

spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。

4、Ribbon负载均衡

  • 读音Ribbon:瑞奔

4.1、负载均衡的原理

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

在这里插入图片描述

当微服务 order-service 发起 http://userservice/user/1 的请求时,会先被 Ribbon 拦截获得另一个微服务名称 user-service,Ribbon 会去找 eureka-server 注册中心拉取 user-service 的ip和端口号,然后对 ip 和端口号进行负载均衡。

思考: 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢?

SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

在这里插入图片描述

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

4.2、负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

在这里插入图片描述

不同规则的含义如下:

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略:
(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。
(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案注意,一般用默认的负载均衡规则,不做修改。

4.3、饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

  • 在 order-service 的 application.yaml 里面开启饥饿加载:
ribbon:
  eager-load:
    # 开启饥饿加载
    enabled: true
    # 指定饥饿加载的服务名称
    clients: userservice

假如有多个服务需要开启饥饿加载:

ribbon:
  eager-load:
    # 开启饥饿加载
    enabled: true
    # 指定饥饿加载的服务名称
    clients: 
     - userservice
     - xxxservice

5、Nacos注册中心

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

5.1、认识和安装Nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

在这里插入图片描述

  1. 去GitHub的Release下载Nacos:https://github.com/alibaba/nacos/releases

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

5.1.1、Windows安装

  1. 我这里下载nacos-server-1.4.7.zip ,解压到非中文目录下,目录说明

    • bin:启动脚本
    • conf:配置文件
  2. Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf/application.properties目录,修改配置文件中的端口

在这里插入图片描述

  1. 启动:进入 bin目录,打开 cmd,执行如下命令
# 以单机模式启动
startup.cmd -m standalone

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 访问:http://127.0.0.1:8848/nacos即可,默认账号密码都是 nacos

在这里插入图片描述

5.1.2、Linux安装

  1. Nacos依赖于JDK运行,索引Linux上也需要安装JDK才行。(略:参考Linux下安装JDK环境)
  2. nacos-server-1.4.7.tar.gz 上传到Linux服务器的某个目录
  3. 解压
tar -xvf nacos-server-1.4.7.tar.gz
  1. 端口配置:与Windows类似
  2. 启动,在nacos/bin目录中,输入命令启动
sh startup.sh -m standalone

5.2、Nacos的依赖

  1. 引入依赖:在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖
<!--nacos的管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
  1. 注释掉 order-service 和 user-service 中原有的 eureka 依赖
  2. 引入依赖:然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 服务注册到nacos:在user-service和order-service的application.yml中添加nacos地址:
spring:
  cloud:
    nacos:
      # nacos服务地址
      server-addr: localhost:8848 
  1. 注释掉 eureka 的配置
  2. 启动 order-service、user-service 微服务,登录 nacos 管理页面:http://127.0.0.1:8848/nacos,可以看到微服务信息

在这里插入图片描述

5.3、服务分级存储模型

一个服务可以有多个实例,例如我们的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。

5.3.1、给user-service配置集群

  1. 修改user-service的application.yml文件,添加集群配置:
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        # 集群名称杭州
        cluster-name: HZ 

重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

在这里插入图片描述

在这里插入图片描述

我们再次复制一个user-service启动配置,添加属性:

# 端口为8083 集群为上海
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

在这里插入图片描述

启动UserApplication3后再次查看nacos控制台:

5.3.2、同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。所以需要给 order-service也需要配置 HZ 集群信息。

  1. 给order-service配置集群信息:修改order-service的application.yml文件,添加集群配置:
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称
  1. 修改负载均衡规则:修改order-service的application.yml文件,修改负载均衡规则:
userservice:
  ribbon:
    # 负载均衡规则 
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule 

5.4、权重配置

实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

在这里插入图片描述

在这里插入图片描述

注意:如果权重修改为0,则该实例永远不会被访问

5.5、环境隔离

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

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

在这里插入图片描述

5.5.1、创建namespace

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

在这里插入图片描述

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

在这里插入图片描述

5.5.2、给微服务配置namespace

给微服务配置namespace只能通过修改配置来实现。例如,修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: d494f25a-438d-4927-bdf8-aaa9d3fc0279 # 命名空间,填ID

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

在这里插入图片描述

order-service在 dev 的命名空间,user-service在 public 命名空间,此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错

5.6、Nacos与Eureka的区别

Nacos的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

在这里插入图片描述

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何把音乐的原声调小?调整音频大小的方法你知道吗?

调节音频声音的大小是一项常见的音频处理任务&#xff0c;无论是在家庭娱乐、工作学习还是专业音频制作中&#xff0c;都是必不可少的技能。通过调节音频声音的大小&#xff0c;我们可以更好地控制音频的质量和听感&#xff0c;以满足不同的需求和环境。首先&#xff0c;我们需…

防火墙技术基础篇:什么是包过滤技术

什么是防火墙包过滤技术 当数据在网络中传输时&#xff0c;它们被分割成小的单元&#xff0c;称为数据包。防火墙的包过滤是一种基本的网络安全技术&#xff0c;用于检查这些数据包并根据预定义的规则决定是否允许它们通过防火墙。 防火墙包过滤是一种关键的网络安全技术&am…

ENVI拓展工具资源去哪里找

ENVI拓展工具资源去哪里找&#xff1f; 文章目录 ENVI拓展工具资源去哪里找&#xff1f;前言网站&#xff08;链接见文末&#xff09;ENVI应用商店&#xff08;App Store&#xff09;ENVI官方提供第三方制作自己制作 总结参考 前言 ENVI 拓展工具是指 ENVI 软件的扩展功能或插…

【微信小程序开发】微信小程序、大前端之flex布局方式详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

力扣HOT100 - 35. 搜索插入位置

解题思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

自动化脚本如何有效防检测、防风控?

我们在编写自动化脚本过程中经常会出现被app检测到&#xff0c;有的甚至会被风控&#xff0c;遇到这类问题如何有效应对呢&#xff1f;本人长期从事自动化脚本领域工作&#xff0c;从早期的按键精灵&#xff0c;到autojs&#xff0c;到现代的冰狐智能辅助&#xff0c;积累的不少…

现货黄金今日行情分析:昨日高低点法

进行交易之前&#xff0c;投资者要对现货黄金今日行情进行一波分析&#xff0c;我们交易决策应该建立在合理分析的基础之上。那么打开市场交易软件看到现货黄金今日行情之后&#xff0c;该如何着手进行分析呢&#xff1f;下面我们就来讨论一下具体的方法。 要进行现货黄金今日行…

《大疆二次开发》EMQX和MQTT部署

EMQX 服务器 基础知识 概念 EMQX (Erlang/Enterprise/Elastic MQTT Broker) &#xff1b;EMQ/EMQX就是MQTT Broker的一种实现&#xff1b;一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计&#xff1b;支持多种协议&…

.Net MAUI 搭建Android 开发环境

一、 安装最新版本 VS 2022 安装时候选择上 .Net MAUI 跨平台开发 二、安装成功后,创建 .Net MAUI 应用 三、使用 VS 自带的 Android SDK 下载 ,Android镜像、编译工具、加速工具 四、使用Vs 自带的 Android Avd 创建虚拟机 五、使用 Android 手机真机调试

Jmeter页面汉化和字体显示过小调整

在频繁解压使用Jmeter的时候&#xff0c;经常会遇到需要将页面的英文调整为中文&#xff0c;页面文字和编辑区域内容文字显示较小的问题&#xff0c;记录一下方便以后查阅。 1.页面汉化 Jmeter在解压启动之后页面显示是英文&#xff0c;如果需要修改为中文&#xff0c;可以修改…

【全开源】Java v7淘宝客APP源码-自营商城任务墙源码美团外卖CPS广告联

一、淘宝客源码 特色功能&#xff1a; 商品搜索与推荐&#xff1a;基于用户的搜索关键词&#xff0c;推荐优质商品&#xff0c;帮助用户快速找到符合需求的商品。商品详情展示&#xff1a;展示商品图片、描述、价格等信息&#xff0c;帮助用户更好地了解商品的各项特性。下单…

走进SVG:不懂就OUT了!

在当今的数字世界里&#xff0c;图形设计和网页设计是我们生活的重要组成部分。无论是滚动你的社交媒体页面&#xff0c;还是浏览你最喜欢的网站&#xff0c;你都会接触到各种图形和图像。其中&#xff0c;有一种特殊的文件格式被广泛使用&#xff0c;它可以给你带来前所未有的…

eclipse创建web项目

前言&#xff1a;我是第一次写web项目&#xff0c;探索了很多天&#xff0c;今天就把我知道的分享给大家&#xff0c;希望大家能够少走弯路&#xff0c;早点写出属于自己的web项目。完成课程设计或毕业设计。 一.准备工作 首先&#xff0c;在这里推荐一个网站--菜鸟教程。这个…

占道经营监测识别摄像机

随着城市化进程的加速和商业活动的不断增加&#xff0c;城市道路上的占道经营现象也变得越来越普遍。为了规范市容市貌、维护交通秩序和保障市民的出行安全&#xff0c;一种名为占道经营监测识别摄像机应运而生&#xff0c;成为城市管理的有效辅助工具。这种占道经营监测识别摄…

基于Springboot+Vue+Java的校园资料分享平台

&#x1f49e; 文末获取源码联系 &#x1f649; &#x1f447;&#x1f3fb; 精选专栏推荐收藏订阅 &#x1f447;&#x1f3fb; &#x1f380;《Java 精选实战项目-计算机毕业设计题目推荐-期末大作业》&#x1f618; 更多实战项目~ https://www.yuque.com/liuyixin-rotwn/ei3…

【论文速读】|针对模糊驱动生成的提示性模糊测试

本次分享论文&#xff1a;Prompt Fuzzing for Fuzz Driver Generation 基本信息 原文作者&#xff1a;Yunlong Lyu, Yuxuan Xie, Peng Chen, Hao Chen 作者单位&#xff1a;腾讯安全大数据实验室、加州大学戴维斯分校 关键词&#xff1a;软件测试, Fuzzing, 自动化Fuzz驱动…

如何使用client-go构建pod web shell

代码示例及原理 原理是利用websocket协议实现对pod的exec登录&#xff0c;利用client-go构造与远程apiserver的长连接&#xff0c;将对pod容器的输入和pod容器的输出重定向到我们的io方法中&#xff0c;从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…

联丰策略股票杠杆交易炒股市场四大变量,突袭A股

查查配今天早盘,港股一度冲高,但临近午盘时,亦快速杀跌,三大股指纷纷转跌。A股市场自开盘之后,就走势较为低迷。人民币和A50亦同步走弱。而从亚太市场来看,日本股市跌幅最大,日经225指数一度杀跌超1.7%。那么,究竟发生了什么? 联丰策略拥有一支由知名互联网公司和国内证券金融…

Java进阶07集合(续)

Java进阶07 集合&#xff08;续&#xff09; 一、数据结构&#xff08;树&#xff09; 1、关于树 1.1 相关概念 节点&#xff1a;树中每个单独的分支 节点的度&#xff1a;每个节点的子节点数量 树高&#xff1a;树的总层数 根节点&#xff1a;最顶层节点 左子节点&…

融知财经:期货交易原理是怎样的?期货交易有哪些特征?

期货的原理是基于对某期货品种未来走势的判断而形成对其合约的买卖交易&#xff0c;因此期货可以解释为买涨或买跌。买涨&#xff0c;即看多交易&#xff0c;预期某期货品种未来价格上涨而进行的买入开仓交易&#xff1b;买跌&#xff0c;即看空交易&#xff0c;预期某期货品种…