微服务系列(5)- Nacos负载均衡与环境隔离

1.Nacos负载均衡

1.1 集群负载均衡

我们通过修改启动参数新添加一个实例 :

微服务系列(5)- Nacos负载均衡与环境隔离_第1张图片

参数如下 :

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

指定 user-service 的8083的实例集群为上海集群

从Nacos的Web页面我们可以看到, 此时有三个实例, 两个所属杭州集群, 另外两个所属上海集群

微服务系列(5)- Nacos负载均衡与环境隔离_第2张图片

默认情况下 Nacos 还是使用的轮询的负载均衡策略, 如果我们想要实现集群优先的负载均衡的话, 就要添加如下配置 :

user-service: # 微服务名称
  ribbon: # 负载均衡规则
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

如果之前配置过 Eureka 负载均衡规则,只需要修改下即可

配置完成以后, 重启下 order-service , 然后访问 http://localhost:8080/order/101~106

微服务系列(5)- Nacos负载均衡与环境隔离_第3张图片

如上图可以看到所有的请求都发送到了SH 集群里 , 这样我们就实现了集群的负载均衡

之所以所有的请求都发送到了SH集群里, 是因为 order-service 的微服务也属于 SH 集群, 一般情况下优先访问同一集群的服务

1.2 权重负载均衡

实际部署中会出现这样的场景:

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

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在nacos控制台,找到 user-service 的实例列表,点击编辑,即可修改权重:

微服务系列(5)- Nacos负载均衡与环境隔离_第4张图片

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

修改后需要注意的是, 上面我们把微服务8083的集群修改为SH, 和order-service微服务的集群一致

这样再次访问, 哪怕修改了权重, 大概率也是访问同一集群内的微服务实例

所以为了区分, 我们把8083的微服务实例集群修改为 BJ

微服务系列(5)- Nacos负载均衡与环境隔离_第5张图片

重启微服务, 然后再次访问 http://localhost:8080/order/101~106 查看, 可以看到服务是优先请求权重搞的微服务实例的

2.Nacos环境隔离

2.1 基本概念

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

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

微服务系列(5)- Nacos负载均衡与环境隔离_第6张图片

2.2 NameSpace创建

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

微服务系列(5)- Nacos负载均衡与环境隔离_第7张图片

我们可以新建一个命令空间 :

微服务系列(5)- Nacos负载均衡与环境隔离_第8张图片

创建后是下面这样的, 我们可以通过命名空间ID去配置对应的命名空间

微服务系列(5)- Nacos负载均衡与环境隔离_第9张图片

2.3 NameSpace配置

修改 order-service 微服务的application.yml配置 :

spring:
  cloud:
    nacos:
      discovery:
        cluster-name: SH # 配置集群
        namespace: dev-01 # 配置namespace (namespace ID)
      server-addr: localhost:8848

根据上面新建的namespace 自定义的 id , 添加相关配置, 配置完成以后重启微服务

微服务系列(5)- Nacos负载均衡与环境隔离_第10张图片

重启以后即可在服务列表的dev命名空间看到, 如上图 但是要注意的是不同命名空间的服务是隔离的

也就是说, 现在 order-service 无法访问到 user-service 微服务了

当我们尝试调用的时候, 就会出现 No instances available for user-service

微服务系列(5)- Nacos负载均衡与环境隔离_第11张图片

2.4 服务实例

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

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

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

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH # 配置集群
        # namespace: dev-01 # 配置namespace (namespace ID)
        ephemeral: true # 配置实例为永久实例

3. Eureka和Nacos的区别

3.1 共同与差异

微服务系列(5)- Nacos负载均衡与环境隔离_第12张图片

Nacos与eureka的共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别

  • Nacos支持服务端主动检测提供者状态:

    • 临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

  • Nacos集群默认采用AP方式强调服务的可用性

  • 当集群中存在非临时实例时,采用CP模式, 强调数据的可靠性和可用性

  • Eureka采用AP方式

你可能感兴趣的:(Java系列,微服务,微服务,nacos)