资讯详情

资讯详情

SpringCloud组件:Nacos服务注册快速入门

一、Nacos简要介绍1.1Nacos和Eureka区别对比EurekaNacosCAP仅支持AP及支持CP也支持AP健康检查客户端心跳续约客户端上报15s 没收到心跳标记失效自我保护机制不会立刻剔除实例两种模式临时实例客户端心跳持久实例服务端主动探测 (TCP/HTTP)及时摘除不健康实例持久化默认内存存储重启丢失可选磁盘快照持久化支持两种实例临时实例不持久化持久实例写入数据库 / 磁盘持久保存同时兼任配置中心配置数据持久化到 MySQL1.2Nacos的优势Nacos不仅实现了服务注册功能同时也支持配置中心功能两大核心功能集于一身大大满足了用户的需求同时也减少了使用多个组件带来的麻烦和繁琐Nacos提供了客户端页面便于我们进行开发和使用Nacos是一个可运行的独立服务器软件不用想Eureka一样需要自己实现服务使用Nacos只需安装软件包执行脚本就可以直接运行非常方便Nacos适配SpringCloudAlibaba生态在国内项目广泛使用社区活跃Nacos提供的功能比Eureka更多且更加强大详细请看上文-Nacos和Eureka区别1.3服务注册和服务发现主要概念服务注册服务将自己的信息如url注册在Nacos服务中心上并保持实时更新其他服务可以从Nacos上获取该服务的信息调用该服务提供的接口实现远程调用。服务发现当服务需要调用另一个服务的接口的时候可以进行服务发现从Nacos服务中心获取对方的地址根据地址调用对方的接口进行远程调用。例如订单服务商品服务订单服务和商品服务都是两个独立的微服务当订单服务需要根据订单id获取订单信息再根据订单信息中的商品id获取商品信息的时候由于双方都是独立的服务订单服务无法直接调用商品服务的接口就需要进行远程调用传统的远程调用实现比较复杂并且订单服务的url是写死的如果订单服务的url发生改变那远程调用的代码也需要进行修改而在实际业务开发中修改代码之后需要重新进行打包部署过程十分繁琐并且容易出现失误而服务发现可以动态获取商品服务的url即使对方发生改变也可以同步获得。二、Nacos服务注册主要操作基于Ubuntu系统的云服务器2.1如何使用Nacos2.1.1 Ubuntu 云服务器安装启动 Nacos单机模式单机模式指的是Nacos服务安装在一台服务器上使用单机模式启动Nacos服务下载安装包下载地址点击跳转http:// https://github.com/alibaba/nacos/releases/tag/2.2.3上传软件包到Linux某个目录中解压安装包unzip nacos-server-2.2.3.zip #如果第一次使用未安装unzip命令, 需要安装⼀下 apt-get install unzip单机模式启动#进入nacos/bin目录,具体目录以安装存放目录为主 cd user/nacos.bin #启动Naocs服务 bash startup.sh -m standalone注意Nacos安装前需要先安装JDK启动成功后会显示Nacos的日志存放在/root/user/nacos/logs/start.out这个文件中我们可以查看Nacos是否启动成功2.1.2 访问 Nacos 后台页面Nacos服务启动成功之后可以通过http://服务器ip:Nacos端口号/nacos进行访问Nacos默认端口号为8848重点访问之前需要在服务器开放Nacos的端口号如果Nacos的端口号为8848则需要同时开放884889488949进入Nacos网页表示Nacos启动成功2.2Nacos的配置信息Nacos的配置信息存放在nacos/conf目录下我们可以查看并且修改Nacos的配置信息以修改Nacos的端口号为例#进入conf目录 cd user/nacos/conf #打开application.properties文件 vi application.properties #单击i进入编辑模式 i #修改端口号为10020 #点击ESC退出编辑模式 #输入:wq退出并保存修改 :wq注意修改Nacos的端口号之后需要开放端口号2.3实操基于订单服务实现Nacos服务使用Nacos需要添加相对于的依赖!--将服务注册到Nacos上-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency配置文件Nacos启动成功之后服务需要通过配置才能注册在Nacos上下面简单介绍服务如何配置Nacos订单服务server: port: 8080 #服务端口号 spring: application: name: order-service # 服务名Nacos配置中心DataId默认就是 order-service.yaml cloud: nacos: # 服务注册发现 discovery: server-addr: 121.199.35.34:10020 #服务器ipNacos端口号商品服务server: port: 9090 #和订单服务端口号不能一样 spring: application: name: product-service cloud: nacos: discovery: server-addr: 121.199.35.34:10020启动服务查看服务是否有注册到Nacos上修改远程调用的代码先前我们远程调用的url是写死的现在我们进行修改将原来写的url改成product服务的服务名这样order服务发起远程调用的时候就可以根据这个服务名称从Nacos获得product的地址并将请求发送给product-service的接口。原来代码public orderInfo getOrderInfo(Integer id){ orderInfo orderInfo orderMapper.selectOrderInfoById(id); String urlhttp://127.0.0.1:9090/product/orderInfo.getProductId(); productInfo productInfo restTemplate.getForObject(url, productInfo.class); orderInfo.setProductInfo(productInfo); return orderInfo; }修改后public orderInfo getOrderInfo(Integer id){ orderInfo orderInfo orderMapper.selectOrderInfoById(id); String urlhttp://product-service/product/orderInfo.getProductId(); productInfo productInfo restTemplate.getForObject(url, productInfo.class); orderInfo.setProductInfo(productInfo); return orderInfo; }三、权重配置3.1分配权重权重作用负载均衡策略可以同时开启多个服务器分担请求流量当Nacos注册了多个客户端时Nacos如何把这些流量是分配给客户端的这就是分配权重的作用大量流量时Nacos服务中心将流量按不同的比例分配给客户端。例如假设我们有三台服务器我们将三台服务器的权重均设为1当有多个请求时就会平均分给这三个服务器去接受这就是分配权重。⚠️注意分配权重不是一定按照设置的比例均等分配而是大致按照这个比例分配给客户端流量越多权重分配就越明显。当只有一台服务注册时注册中心就只会把服务转发给这个服务。默认权重为1配置方式例注册三个product-service服务到Nacos上端口号分别为9090,9091,9092将9090权重设置为1将9091权重设置为0.1。当order-service发送大量请求给product-service时可以观察到大部分请求都转发给9090而9091只收到特别少的请求。添加配置开启loadBancanedspring: cloud: loadbalancer: nacos: enabled: true3.2同集群优先在中大型公司一般会有不同地区的分公司这些公司的机房中部署一些同样的服务器将在同一个机房的服务器看成一个集群那一个相同的服务就部署在了很多不同集群的服务器中例如order-service部署在A集群和B集群product-service也部署在A集群和B集群同集群优先指的是当A集群的order-service发送请求给product-service时Nacos会优先将请求转发给同样在A集群的product-service。如果A集群的product-service下线才会转发给B集群的product-service处理。同样同集群优先需要实现loadBanlanced负载均衡默认集群为default分别将两个product-service集群修改为NJ和BJ,将ord-service的集群修改成NJ连续发送请求给product-service查看响应结果。spring.cloud.nacos.discovery.cluster-name集群名称发送请求可以看到集群为BJ的服务没有收到请求集群为NJ的服务收到请求。集群为NJ的product-service下线BJ集群的product-service又可以接收到请求。四、健康检查4.1服务下线强制下线粗暴下线操作直接kill -9 PID、服务器宕机、进程崩溃没有任何通知流程服务进程直接被杀来不及通知注册中心注册中心不知道服务已经挂了还保留该实例调用方消费者还会继续把请求转发给这个死掉的实例 →报错直到注册中心健康检查失败才剔除实例有窗口期这段时间会产生失败请求缺点会出现一段时间请求失败业务报错适用进程卡死无法正常关闭的紧急场景优雅下线推荐生产使用操作kill PID不带 - 9或者 SpringBoot 内置优雅关闭、Nacos 主动注销流程收到关闭信号先停止接收新请求等待正在处理中的旧请求执行完毕等待超时时间可配置主动向注册中心发送注销请求告诉注册中心我要下线了注册中心立刻把该实例从服务列表剔除消费者刷新本地服务列表不再往这个实例发请求等待现有请求处理完成后再关闭线程池、释放资源退出进程优点不会出现请求丢失 / 报错平滑停机适合版本发布、迭代更新缺点需要等待存量请求关闭耗时更长4.2健康检查实例类型健康检查临时实例默认主动上报非临时实例永久实例反向侦查概念临时实例该服务下线Nacos会主动删除非临时实例即使服务下线Nacos也不会删除该实例主动上报 临时实例主动上报健康情况给注册中心当实例没有发送时注册中心会发送一个心跳包给服务如果服务未响应Nacos也不会立即删除而是等一段时间才会删除。反向侦查注册中心会主动侦查永久实例的健康情况若实例未回应Nacos不会删除实例而是将其标记为非健康状态等到服务重新上线再修改成健康状态。临时实例和非临时实例的转换两者可以进行转化但若是注册在Nacos上的非临时实例要转换成永久实例必须要先关闭Nacos服务删除文件修改之后再重启服务。spring.cloud.nacos.discovery.ephemeral: false #非临时实例五、环境隔离5.1 环境分类Namespace、Group、Service 三级隔离很多新手分不清这三者层级关系 5.2 环境隔离操作后台创建 namespaceyaml 指定 namespace 5.3 环境隔离意义开发 / 测试 / 生产环境隔离互不干扰5.1环境分类在现实业务环境中一般分为开发环境dev测试环境正式环境prod。5.2环境隔离操作现在Nacos上创建空间spring.cloud.nacos.discovery.nameSpace: 空间id5.3环境隔离意义Namespace命名空间最高层级强隔离不同命名空间服务 / 配置互不可见用于区分开发、测试、生产环境。Group分组同命名空间内逻辑隔离用来对同名服务分组实现灰度发布、版本隔离。Cluster集群同命名空间 同分组内的机房 / 可用区划分实例互相可见负载均衡优先同集群调用减少跨机房延迟实现机房容灾。总结1.Nacos是一个结合服务注册和配置中心的独立服务器软件功能强大便于开发人员使用2.Nacos注册中心动态实现了远程调用减少后期运维成本3.Nacos健康检查分为主动汇报和反向侦查注意已注册的临时实例不能直接修改成永久实例需要先停掉Nacos服务并删除nacos ⽬录下 /data/protocol/raft 信息4.NameSpace是最高层级的环境隔离处于不同命名空间的服务是互补可见的但若是处于不同集群的服务当该集群的服务下线时可以调用其他集群的服务5.开启权重分配和集群都需要基于负载均衡策略拓展Nacos 除了服务注册还可以做配置中心本文不展开后续单独写一篇 Nacos 配置管理
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →