1. 什么是 Nacos
什么是 Nacos官方网站:什么是 Nacos
官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心+配置中心+服务管理 平台
Nacos 的关键特性包括:
服务发现和服务健康监测
动态配置服务
动态 DNS 服务
服务及其元数据管理
2. Nacos注册中心
管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题;
2.3
核心功能
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
秒没有收到心跳,直接剔除该
实例
(
被剔除的实例如果恢复发送心跳则会重新注册
)
主流的注册中心
CAP C 一致性 A可用性 P 分区容错性
雪崩保护:
保护阈值: 设置0-1之间的值 0.6
临时实例: spring.cloud.nacos.discovery.ephemeral =false, 当服务宕机了也不会从服务列表中剔除
下图代表永久实例:
健康实例、 不健康实例;
健康实例数/总实例数 < 保护阈值`
1/2<0.6
结合负载均衡器 权重的机制, 设置的越大
3 Nacos Server部署
下载源码编译
源码下载地址:
https://github.com/alibaba/nacos/
可以用迅雷下载
下载安装包,
下载地址:
https://github.com/alibaba/Nacos/releases
3.1
单机模式
官方文档:
https://nacos.io/zhcn/docs/deployment.html
解压,进入
nacos
目录
单机启动
nacos
,执行命令
bin / startup . sh ‐ m standalone也可以修改默认启动方式
访问
nocas
的管理端:
http://localhost:8848/nacos
,默认的用户名密码是
nocas/nocas
3.2 集群模式
官网文档:
https://nacos.io/zhcn/docs/clustermodequickstart.html
听句劝! Nacos集群搭建可以看看这篇教程 - 腾讯云开发者社区-腾讯云 (tencent.com)
4. Spring Cloud Alibaba Nacos快速开始
4.1 Spring Cloud Alibaba版本选型
地址:
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
4.2 搭建Nacos-client服务
1
)引入依赖
新建项目目录如图:
在父项目引入依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>stock-nacos</module>
<module>order-nacos</module>
</modules>
<groupId>com.wang</groupId>
<artifactId>SpringCloudAlibabaLearn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloudAlibabaLearn</name>
<packaging>pom</packaging>
<description>SpringCloudAlibabaLearn</description>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<spring.cloud.version>Hoxton.RELEASE</spring.cloud.version>
<spring.boot.version>2.3.12.RELEASE</spring.boot.version>
</properties>
<dependencies>
<!-- SpringBoot场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring-cloudyAlibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot的版本管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud的版本管理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 打包-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
在子模块引入
依赖:
<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>
两个子模块application.yml
server:
port: 8022
#应用名称nacos会当做服务名称
spring:
application:
name: order-nacos
cloud:
nacos:
server-addr: localhost:8848
discovery:
username: nacos
password: nacos
namespace: public
更多配置:
https://github.com/alibaba/springcloudalibaba/wiki/Nacosdiscovery
5.编写代码
5.1order-nacos模块:
controllter:
package com.wang.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @BelongsProject: SpringCloudAlibabaLearn
* @BelongsPackage: com.wang.controllter
* @Author: wang fei
* @CreateTime: 2023-01-16 16:48
* @Description: TODO
* @Version: 1.0
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/pay")
public String pay(){
String msg = restTemplate.getForObject("http://localhost:8023/stock/reduce", String.class);
return "success" + " " + System.currentTimeMillis();
}
}
OrderApplication:
package com.wang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @BelongsProject: SpringCloudAlibabaLearn
* @BelongsPackage: com.wang.controller
* @Author: wang fei
* @CreateTime: 2023-01-16 16:54
* @Description: TODO
* @Version: 1.0
*/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
// @LoadBalanced //负载均衡
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}
5.2
stock
-nacos模块:
controllter:
package com.wang.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @BelongsProject: SpringCloudAlibabaLearn
* @BelongsPackage: com.wang.controller
* @Author: wang fei
* @CreateTime: 2023-01-16 16:51
* @Description: TODO
* @Version: 1.0
*/
@RestController
@RequestMapping("/stock")
public class StockController {
@GetMapping("/reduce")
public String reduce() {
System.out.println("库存减少");
return "reduce";
}
}
StockApplication:
package com.wang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @BelongsProject: SpringCloudAlibabaLearn
* @BelongsPackage: com.wang.controller
* @Author: wang fei
* @CreateTime: 2023-01-16 16:54
* @Description: TODO
* @Version: 1.0
*/
@SpringBootApplication
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class, args);
}
}
6.运行结果
启动ancos
启动SpringBoot
访问: http://2.0.0.1:8848/nacos/index.html