Nacos服务注册与发现

Nacos

黑马程序员:https://www.bilibili.com/video/BV1LQ4y127n4?p=17

简介

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

1、安装

Github下载地址:Tags · alibaba/nacos · GitHub 推荐使用1.x版本
启动服务器

下载完毕后解压,进入bin目录下进入命令行,执行.\startup.cmd -m standalone 启动命令(standalone代表着单机模式运行,非集群模式):

Nacos默认集群模式运行。若不单机模式运行启动会报错。

关闭服务器

shutdown.cmd 或者双击shutdown.cmd运行文件。

2、Nacos的使用

在父类添加阿里巴巴管理依赖
注意版本号冲突


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    <version>2.1.4.RELEASEversion>
    <type>pomtype>
    <scope>importscope>
dependency>

服务提供者
导入Nacos依赖springcloud-provider-dept-8001


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    <version>2.1.4.RELEASEversion>
dependency>

配置nacos

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

测试
Nacos服务注册与发现_第1张图片
服务消费者

导入nacos依赖springcloud-consumer-dept-80


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>

配置文件

# 端口
server:
  port: 80
  
spring:
  cloud:
    nacos:
        server-addr: localhost:8848
  application:
    name: nacos-demo

报错:Param ‘serviceName‘ is illegal, serviceName is blank

解决办法,给注册的服务添加一个name服务名字

启动测试

Nacos服务注册与发现_第2张图片

3、Nacos注册中心

3.1 Nacos服务分级存储模型

服务跨集群调用问题

  • 服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
  • 本地集群不可访问时,再去访问其它集群

3.2 nacos集群的配置

服务提供者

修改配置文件

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH #上海集群

Nacos服务注册与发现_第3张图片

Nacos服务注册与发现_第4张图片

服务消费者

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 在消费中,优先访问杭州的集群

Nacos服务注册与发现_第5张图片

但是经过测试,依然采用轮询的方式来访问集群。所以必须修改负载均衡。

3.3 NacosRule负载均衡

根据集群负载均衡

在服务消费者springcloud-consumer-dept-80

优先访问已经设置的集群,如果本地没有,则访问其他集群。

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

根据权重负载均衡

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

  • 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

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

Nacos服务注册与发现_第6张图片

当权重设置为0时,将不会被访问,所以可以用来重启服务。

3.4 环境隔离(namespace)

Nacos中 服务存储和服务存储的最外层都是一个名为namespace的东西,用来做最外层隔离。

Nacos服务注册与发现_第7张图片

新建命名空间

Nacos服务注册与发现_第8张图片

Nacos服务注册与发现_第9张图片

创建完成

Nacos服务注册与发现_第10张图片

配置服务提供者

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        namespace: 55a18106-a5bf-43dc-b4aa-2615c63f39b8 # dev环境
        ephemeral: false # 非临时实例

重启服务

Nacos服务注册与发现_第11张图片

不同的环境下,不可以访问。

No instance available for userservice

3.5 Nacos注册中心原理

Nacos服务注册与发现_第12张图片

服务消费者—注册中心

定时拉取服务 pull:每隔三十秒更新一次。

主动推送服务 push:若30秒内服务宕机,注册中心会主动推送变更信息即使更新服务的状态。

服务提供者—注册中心

默认情况下所有的实例都是临时实例,宕机就会被剔除,推荐使用临时实例

非临时实例nacos不会采用心跳检测。如果宕机就会等待其恢复健康。

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

停掉服务后

只要不删除一直等待服务恢复。
Nacos服务注册与发现_第13张图片

3.6 与Eureka 的对比

共同点:

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

区别:

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

4、配置管理

4.1 统一配置管理

新建配置

Nacos服务注册与发现_第14张图片

Nacos服务注册与发现_第15张图片

Nacos服务注册与发现_第16张图片

Nacos服务注册与发现_第17张图片

配置获取原流程

Nacos服务注册与发现_第18张图片

Nacos服务注册与发现_第19张图片

Nacos服务注册与发现_第20张图片

  1. 引入nacos的配置管理客户端依赖
<dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>
  1. 新建bootstrap.yml(系统级别配置文件)
spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # 地址
      config:
        file-extension: yaml # 后缀名
  1. 在UserController中进行测试
@NacosValue("${pattern.dateformat}")
private String dateformat;
@GetMapping("/now")
public String now(){
    return 	LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}

你可能感兴趣的:(springcloud,java)