Spring cloud alibaba--Nacos注册中心

目录

1.什么是Nacos

2.注册中心演变及其设计思想

 3.Nacos注册中心服务架构

 4.Nacos核心功能

5.Nacos Server 部署

 6.搭建Nacos Client服务

 7.nacos服务心跳、服务健康检查

8. Nacos服务调用、负载均衡

 9.启动多个提供者,进行负载均衡调用

10.服务永久实例、保护阈值、雪崩保护

 11.Nacos更多配置项

12.Nacos集群部署

13.Nacos集群架构、nginx代理

14.CAP理论


1.什么是Nacos

官方:一个更易于构建云原生应用的动态服务发现、服务配置、服务管理平台

Nacos的关键特性包括:

(1)服务发现和服务健康监测

(2)动态配置服务

(3)动态DNS服务

(4)服务及其元数据管理

2.注册中心演变及其设计思想

管理所有微服务,解决微服务之间调用关系错综复杂,难以维护的问题。

(1)硬编码方法:把服务写入到代码里面

存在问题:ip和port变更,服务前移、集群部署时,都需要重新修改url

Spring cloud alibaba--Nacos注册中心_第1张图片

 (2)维护一张注册表方式:url有变动,在表中进行编辑链接

存在问题:订单服务进行水平扩容后,没法负载均衡调用;某个服务宕机了,没法响应服务

Spring cloud alibaba--Nacos注册中心_第2张图片

 (3)引入nginx进行负载均衡:nginx通过配置订单服务url,负载均衡请求

存在问题:成千上万的服务,nginx配置文件会特别复杂,每有一个服务地址变动需要在nginx中进行配置,难以维护

Spring cloud alibaba--Nacos注册中心_第3张图片

(4)服务启动后向注册中心写入接口服务:nacos服务器,当服务启动时,向注册中心注册表中添加接口服务信息;调用服务时,再从注册中心中获取服务地址。

存在问题:每次都需要去注册中心中拉取url信息,太浪费资源;若是拉取到的服务宕机了,没法响应请求;注册中心宕机了,整个服务都没法响应。

Spring cloud alibaba--Nacos注册中心_第4张图片

 (5)nacos注册中心添加心跳、缓存、负载均衡:服务启动时,向nacos注册中心写入接口服务;订单服务TimeTask定时访问心跳接口,若是过了心跳接口没接收大奥订单服务的访问,则状态status由up改为down;若是过了一定的时间点,心跳接口还是没有收到心跳调用,则从注册表中移出这个注册信息;当服务停止stop时,向注销接口中发送请求,从注册表中移出服务地址;定时器获取服务调用接口,缓存获取到的服务接口,当调用时从缓存中获取接口服务;当远程调用时使用负载均衡器从缓存中获取到接口服务url

Spring cloud alibaba--Nacos注册中心_第5张图片

 3.Nacos注册中心服务架构

Spring cloud alibaba--Nacos注册中心_第6张图片

 4.Nacos核心功能

(1)服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,例如ip地址、端口等信息。Nacos Servcer接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。

(2)服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳

(3)服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。leader raft

(4)服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面的注册服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新大奥本地缓存

(5)服务健康检查:Nacos Server会开启一个定时任务来检查注册服务实例的健康情况,对应超过15s没有收到客户端心跳的实例会将他的healthy属性设置为false(此时客户端服务再来获取服务列表时获取不到它)。如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。

5.Nacos Server 部署

(1)下载安装包

地址:https://github.com/alibaba/nacos/releases,找到我们需要的nacos版本1.4.2,下载window系统的安装包

Spring cloud alibaba--Nacos注册中心_第7张图片

Spring cloud alibaba--Nacos注册中心_第8张图片

(2)解压下载的nacos压缩文件,bin目录存放启动文件,conf存放配置信息文件

Spring cloud alibaba--Nacos注册中心_第9张图片

(3)在目录bin/startup.cmd编辑nacos为单机模式,启动项默认是集群的方式

默认的启动方式为集群:

Spring cloud alibaba--Nacos注册中心_第10张图片

 修改为单体的方式:

Spring cloud alibaba--Nacos注册中心_第11张图片

 (4)在目录conf/application.properties可以修改启动的端口,是否使用数据库,数据库的配置信息等,单体的情况下不做任何修改

Spring cloud alibaba--Nacos注册中心_第12张图片

 (5)目录bin/startup.cmd下双击,控制台打印出nacos启动模式,以及控制台访问连接

Spring cloud alibaba--Nacos注册中心_第13张图片

(6)通过Console的连接访问系统

Spring cloud alibaba--Nacos注册中心_第14张图片

 (7)输入默认用户名密码nacos/nacos,访问系统

Spring cloud alibaba--Nacos注册中心_第15张图片

 6.搭建Nacos Client服务

(1)在Spring cloud alibaba--环境搭建时创建项目的基础上,复制一份Order,命名为OrderNacos;复制一份Stock,命名为StockNacos。

Spring cloud alibaba--Nacos注册中心_第16张图片

(2)新复制的项目删除Order.iml和Stock.iml,分别编辑pom.xml的artifactId为OrderNacos、StockNacos

Spring cloud alibaba--Nacos注册中心_第17张图片

Spring cloud alibaba--Nacos注册中心_第18张图片

 (3)由于是复制出来的项目,需要在父项目SpringCloudAlibaba的pom.xml中进行model配置,若是点击父项目新建出来的,会自动在pom.xml中配置

Spring cloud alibaba--Nacos注册中心_第19张图片

(4)刷新工程,形成编译的maven项目(项目上有蓝色框)

Spring cloud alibaba--Nacos注册中心_第20张图片

 (5)OrderNacos和StockNacos项目在pom.xml中添加Nacos服务注册发现依赖

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
(6)OrderNacos和StockNacos项目在application.properties中添加Nacos服务注册的相关信息。

OrderNacos项目的application.properties:

server.port=8084
#应用名称,nacos会将该名称当做服务名称
spring.application.name=order-service
#nacos服务连接地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
#nacos discovery连接用户名
spring.cloud.nacos.discovery.username=nacos
#nacos discovery连接密码
spring.cloud.nacos.discovery.password=nacos
#nacos discovery工作空间
spring.cloud.nacos.discovery.workspace=public

 StockNacos项目的application.properties:

server.port=8085
#应用名称,nacos会将该名称当做服务名称
spring.application.name=stock-service
#nacos服务连接地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
#nacos discovery连接用户名
spring.cloud.nacos.discovery.username=nacos
#nacos discovery连接密码
spring.cloud.nacos.discovery.password=nacos
#nacos discovery工作空间
spring.cloud.nacos.discovery.workspace=public

(7)启动项目,控制台打印nacos注册成功--服务注册

Spring cloud alibaba--Nacos注册中心_第21张图片

 刷新Nacos控制平台,可以看到两个服务已经注册到nacos中来。

Spring cloud alibaba--Nacos注册中心_第22张图片

 7.nacos服务心跳、服务健康检查

 (1)服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。

(2)服务健康检查:Nacos Server会开启一个定时任务来检查注册服务实例的健康情况,对应超过15s没有收到客户端心跳的实例会将他的healthy属性设置为false(此时客户端服务再来获取服务列表时获取不到它)。如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。

(3)停止一个服务stock-service,通过控制台刷新查看服务列表变化。

15秒后触发保护阈值,由false变为true:

Spring cloud alibaba--Nacos注册中心_第23张图片

点击详情查看健康状态为false:

Spring cloud alibaba--Nacos注册中心_第24张图片

 30秒之后,从服务列表中移出:Spring cloud alibaba--Nacos注册中心_第25张图片

 再次启动服务,再次把服务注册进来:

Spring cloud alibaba--Nacos注册中心_第26张图片

8. Nacos服务调用、负载均衡

(1)服务之间调用,需要使用负载均衡器

Spring cloud alibaba--Nacos注册中心_第27张图片

 (2)RestTemplate创建时添加负载均衡配置@LoadBalanced,默认轮询的方式

Spring cloud alibaba--Nacos注册中心_第28张图片

(3)服务调动的地址,可以把ip+端口替成系统名称

Spring cloud alibaba--Nacos注册中心_第29张图片

库存系统服务名称:

Spring cloud alibaba--Nacos注册中心_第30张图片

(4)页面访问订单系统方法,使用负载均衡调用另一个系统,返回结果值

Spring cloud alibaba--Nacos注册中心_第31张图片

 9.启动多个提供者,进行负载均衡调用

(1)idea2020开启Services管理多个启动类,之前版本是Run dashboard

控制台添加services:View->Tool Windows ->Services 

Spring cloud alibaba--Nacos注册中心_第32张图片

点开底栏的Services,第一次点开是一片空白。点add,点Run Configuration Type,弹出一个菜单,选择Spring Boot。

 此时会罗列出一系列的Spring Boot启动类

Spring cloud alibaba--Nacos注册中心_第33张图片

 可以右键编辑启动服务类名

Spring cloud alibaba--Nacos注册中心_第34张图片

 Spring cloud alibaba--Nacos注册中心_第35张图片

 (2)复制一份库存订单启动系统,修改下端口:右键启动项选择Copy Configuration

Spring cloud alibaba--Nacos注册中心_第36张图片

 修改Name名称,覆盖的参数为server.port系统端口号

Spring cloud alibaba--Nacos注册中心_第37张图片

 (3)配置通过服务名调用服务

Spring cloud alibaba--Nacos注册中心_第38张图片

 (4)创建调用的RestTemplate需要使用负载均衡的注解@LoadBalanced

Spring cloud alibaba--Nacos注册中心_第39张图片

 (5)被调用的类中添加此系统的端口号,用于区分调用时哪个系统响应的

Spring cloud alibaba--Nacos注册中心_第40张图片

 (6)启动这两个不同端口的提供者(库存项目)

Spring cloud alibaba--Nacos注册中心_第41张图片

(7)页面访问系统,使用负载均衡,轮询处理请求

Spring cloud alibaba--Nacos注册中心_第42张图片

Spring cloud alibaba--Nacos注册中心_第43张图片

 (8)通过依赖的jar可以看出,使用的负载均衡为ribbon

Spring cloud alibaba--Nacos注册中心_第44张图片

10.服务永久实例、保护阈值、雪崩保护

(1)启动服务名称相同端口不同的两个服务,从控制台可以看到实例数为2

Spring cloud alibaba--Nacos注册中心_第45张图片

Spring cloud alibaba--Nacos注册中心_第46张图片

 (2)目前Nacos注册的服务都是临时实例,当服务宕机后有心跳检测和剔除服务的操作;

Spring cloud alibaba--Nacos注册中心_第47张图片

在application.properties中配置服务为永久实例,添加配置

#永久实例,服务宕机后也不会被剔除,默认是true临时实例
spring.cloud.nacos.discovery.ephemeral=false

重启服务后:属于永久实例,心跳检测机制也不会把服务从服务列表中剔除 

Spring cloud alibaba--Nacos注册中心_第48张图片(3)我们可以设置服务保护阈值,用于防止服务雪崩。

例:当我们设置保护阈值为0.6,当健康实例/总实例数 < 保护阈值时,为了防止服务雪崩,服务全部不能使用,就算宕机的服务也会对外提供服务。服务雪崩:请求的数量大于服务器处理的能力,会导致但服务器处理不过来集群架构才能处理的洪峰。

Spring cloud alibaba--Nacos注册中心_第49张图片

 11.Nacos更多配置项

地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

配置项 Key 默认值 说明

服务端地址

spring.cloud.nacos.discovery.server-addr

Nacos Server 启动监听的ip地址和端口

服务名

spring.cloud.nacos.discovery.service

${spring.application.name}

给当前的服务命名

服务分组

spring.cloud.nacos.discovery.group

DEFAULT_GROUP

设置服务所处的分组

权重

spring.cloud.nacos.discovery.weight

1

取值范围 1 到 100,数值越大,权重越大

网卡名

spring.cloud.nacos.discovery.network-interface

当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址

注册的IP地址

spring.cloud.nacos.discovery.ip

优先级最高

注册的端口

spring.cloud.nacos.discovery.port

-1

默认情况下不用配置,会自动探测

命名空间

spring.cloud.nacos.discovery.namespace

常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

AccessKey

spring.cloud.nacos.discovery.access-key

当要上阿里云时,阿里云上面的一个云账号名

SecretKey

spring.cloud.nacos.discovery.secret-key

当要上阿里云时,阿里云上面的一个云账号密码

Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息

日志文件名

spring.cloud.nacos.discovery.log-name

集群

spring.cloud.nacos.discovery.cluster-name

DEFAULT

配置成Nacos集群名称

接入点

spring.cloud.nacos.discovery.enpoint

UTF-8

地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址

是否集成Ribbon

ribbon.nacos.enabled

true

一般都设置成true即可

是否开启Nacos Watch

spring.cloud.nacos.discovery.watch.enabled

true

可以设置成false来关闭 watch

12.Nacos集群部署

(1)单机环境下部署伪集群,复制nacos,分别命名为nacos8849、nacos8850、nacos8851

Spring cloud alibaba--Nacos注册中心_第50张图片

 (2)配置mysql数据源(版本要求,5.7及以上),若是不配置数据源,nacos所有的操作都在内存中进行,没法进行集群方式管理。在目录conf/application.properties中配置数据源,默认使用mysql,修改位置:

Spring cloud alibaba--Nacos注册中心_第51张图片

 修改情况:放开注释,配置mysql的连接信息(用户名密码等信息),三个集群的nacos都修改

Spring cloud alibaba--Nacos注册中心_第52张图片

 (3)在连接的数据库中创建nacos数据库,执行命令

CREATE DATABASE nacos

Spring cloud alibaba--Nacos注册中心_第53张图片

 (4)执行nacos初始sql语句,在目录conf/nacos-mysql.sql 

Spring cloud alibaba--Nacos注册中心_第54张图片

选择刚才建好的nacos数据库,执行SQL语句

Spring cloud alibaba--Nacos注册中心_第55张图片

(5)在目录conf/application.properties下,修改三个nacos的端口分别为8849、8850、8851

 (6)在目录conf下,把集群实例配置文件cluster.conf.example重命名为cluster.conf,三个文件都需要重命名

Spring cloud alibaba--Nacos注册中心_第56张图片

Spring cloud alibaba--Nacos注册中心_第57张图片

 (7)把这三台nacos服务器的访问信息(ip+端口)配置到conf/cluster.conf文件中,三个文件都需要配置,配置内容:

127.0.0.1:8849
127.0.0.1:8850
127.0.0.1:8851

Spring cloud alibaba--Nacos注册中心_第58张图片(8)确保启动的模式为集群方式,在目录bin/startup.cmd中,使用编辑器打开,默认的启动方式为集群cluster。

Spring cloud alibaba--Nacos注册中心_第59张图片

 (9)启动时若是出现内存不足的情况,在bin/startup.cmd中修改启动jvm参数,分为单机standalone和集群cluster的启动方式,可以配置初始内存、最大内存、年轻代大小。 

Spring cloud alibaba--Nacos注册中心_第60张图片

(10)双击bin/startup.bat,启动nacos8849服务,控制台输出集群模式cluster启动成功,使用外部数据源 

Spring cloud alibaba--Nacos注册中心_第61张图片

(11)登陆nacos控制台界面,查看集群情况,目前只有8849启动,其它两台服务状态为down 

Spring cloud alibaba--Nacos注册中心_第62张图片

(12)启动8850和8851两台服务器,集群界面都显示上线

Spring cloud alibaba--Nacos注册中心_第63张图片

13.Nacos集群架构、nginx代理

(1)集群部署架构图

Spring cloud alibaba--Nacos注册中心_第64张图片

(2)nginx反向代理

①nginx安装:下载地址:http://nginx.org/en/download.html  ,下载后解压

Spring cloud alibaba--Nacos注册中心_第65张图片

 ②在conf/nginx.conf配置文件中配置服务启动端口,默认是80

Spring cloud alibaba--Nacos注册中心_第66张图片

③启动nginx服务,方式有:

--直接双击nginx.exe,双击后一个黑色的弹窗一闪而过

--打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe 或者 start nginx ,回车即可

 ④启动之后,输入地址和配置的端口访问nginx,看到此界面说明启动成功

Spring cloud alibaba--Nacos注册中心_第67张图片

 ⑤关闭nginx

如果使用cmd命令窗口启动nginx,关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx

--输入nginx命令  nginx -s stop(快速停止nginx)  或  nginx -s quit(完整有序的停止nginx)

--使用taskkill   taskkill /f /t /im nginx.exe

⑥使用nginx代理服务器做负载均衡

我们可以修改nginx的配置文件nginx.conf 达到访问nginx代理服务器时跳转到指定服务器的目的,即通过proxy_pass 配置请求转发地址,即当我们依然输入http://localhost:8088 时,请求会跳转到我们配置的服务器

Spring cloud alibaba--Nacos注册中心_第68张图片

 同理,我们可以配置多个目标服务器,当一台服务器出现故障时,nginx能将请求自动转向另一台服务器,例如配置如下:

Spring cloud alibaba--Nacos注册中心_第69张图片

当服务器127.0.0.1:8849 挂掉时,nginx能将请求自动转向服务器 127.0.0.1:8850 。上面还加了一个weight属性,此属性表示各服务器被访问到的权重,weight越高被访问到的几率越高。

⑦nginx配置静态资源

将静态资源(如jpg|png|css|js等)放在如下配置的d:/software/nginx-1.18.0/static目录下,然后在nginx配置文件中做如下配置(注意:静态资源配置只能放在 location / 中),浏览器中访问  http://localhost:8082/1.png 即可访问到 d:/software/nginx-1.18.0/static目录下的 1.png图片

Spring cloud alibaba--Nacos注册中心_第70张图片

 Spring cloud alibaba--Nacos注册中心_第71张图片

 ⑧nginx可以配置多个服务端口,ip+端口访问时,nginx默认会去找到nginx的html下面的index.html页面

Spring cloud alibaba--Nacos注册中心_第72张图片

Spring cloud alibaba--Nacos注册中心_第73张图片 Spring cloud alibaba--Nacos注册中心_第74张图片

 (3)使用nginx代理分析

在conf/nginx.conf中配置了三台nacos集群的服务

Spring cloud alibaba--Nacos注册中心_第75张图片

 (4)通过nginx代理访问nacos服务,输入nginxip+端口+前缀即可使用代理访问到nacos系统

Spring cloud alibaba--Nacos注册中心_第76张图片

(5)把系统中访问nacos的地址改成nginx代理的地址

Spring cloud alibaba--Nacos注册中心_第77张图片

 (6)启动系统,发现控制台报错com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance after all servers

Spring cloud alibaba--Nacos注册中心_第78张图片

 (7)解决启动连接不到nginx代理的nacos服务器:我们配置的所有ip都不能使用127.0.0.1来代替本地,需要使用真实ip地址,否则ngin路由不到地址;涉及到的配置为nacos的集群文件cluster.conf、nginx的nginx.conf、项目的application.properties,都修改为服务器自己的ip地址。

三个nacos集群配置cluster.conf修改:

Spring cloud alibaba--Nacos注册中心_第79张图片

 nginx的nginx.conf:

Spring cloud alibaba--Nacos注册中心_第80张图片

 项目的application.properties:

Spring cloud alibaba--Nacos注册中心_第81张图片

(8)启动服务,访问系统,验证是否通过nginx代理成功

Spring cloud alibaba--Nacos注册中心_第82张图片

访问服务正常,nginx代理服务正常

 Spring cloud alibaba--Nacos注册中心_第83张图片

14.CAP理论

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍--分区容错性(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

nacos支持CP+AP,zookeeper支持CP。

Spring cloud alibaba--Nacos注册中心_第84张图片

你可能感兴趣的:(nacos,nacos,spring,cloud,alibaba,nginx,集群部署,注册中心)