文章目录
简介
Nacos 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理的平台。
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
Nacos注册中心
管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题。
假设一个场景来理解nacos 或注册中心的的必要性:
我们有会员服务和订单两个服务,每个服务都有多个节点。这时候我们会员服务去调用订单服务,怎么处理?我们怎么知道该调用哪个节点。
有的同学可能在这里会想到使用nginx来维护订单的节点信息,然后会员服务就可以请求到nginx,让nginx来代理到具体的订单服务,但是这里有一个问题,这里的维护是手动维护的,如果我们需要扩容的话需要随时去修改,而且维护的这些节点我们还不能保证一定是可用的,有可能已经宕机了的。
所以我们是不是需要维护一个能自动维护订单服务的所有节点信息以及能够检测节点是否存活的信息,所以就有了注册中心Nacos。
如下图示例:
Nacos Discovery 核心功能
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。 leader raft
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
Spring Cloud Alibaba Nacos 快速开始
Nacos Server 部署
下载地址:https://github.com/alibaba/Nacos/releases
如果大家只是在本地启动一个服务测试的话,直接下载.zip的包,如果你是在liunx上的话就下.tar.gz的包就行。
但是需要注意,你是使用什么版本就下载对应的版本,这样可以避免很多不必要的问题,我这里是1.4.2版本的。
我这里是在liunx环境下安装的,当然windos环境下修改的也一样。
解压后可以看到如下文件
因为启动脚本startup.sh中默认的是集群模式,所以需要修改为 standalone
当然也可以在启动的时候直接指定
bin/startup.sh ‐m standalone
这样就可以正常启动了,当然现在是单节点,而且也是没有使用数据库的方式,后面还有时间我在分享一下可以集群模式,使用数据库的方式吧。
访问路径是 http://127.0.0.1:8848/nacos 账号密码都是 nacos/nacos
将Order服务注册到Nacos Service
引入依赖
在父pom文件中添加如下依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 子模块 -->
<modules>
<module>order</module>
<module>stock</module>
</modules>
<!-- 原本这里是用来集成springboot的,但是该位置可以留出来,使用公司的自定义的父依赖-->
<!-- springboot依赖移动到了dependencyManagement中-->
<!-- <parent>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <version>2.6.3</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<!-- </parent>-->
<groupId>com.alibaba</groupId>
<artifactId>springcloudalibaba-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloudalibaba</name>
<description>Spring Cloud Alibaba</description>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<boot>2.6.3</boot>
<cloud>2021.0.1</cloud>
<cloud.alibaba>2021.0.1.0</cloud.alibaba>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring cloud Alibaba 版本管理器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud.alibaba}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 版本管理器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${cloud}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring boot 版本管理器-->
<dependency>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>${boot}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
当前order项目pom文件中添加如下依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloudalibaba-demo</artifactId>
<groupId>com.alibaba</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
添加配置文件
server:
port: 8010
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 这就是前面安装启动好的nacos service 的 ip:端口
然后创建启动类 启动
package com.alibaba.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
然后查看nacos控制台,就可以看到在服务管理 -> 服务列表上有对应的服务了。
对于nacos注册发现方面还有什么疑问的大家可以在评论区讨论。
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------
--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------