前面已经介绍了一种注册中心组件Eureka了,现在再介绍一个新的。
一.准备
Nacos(Dynamic Namingand Configuration Service)是由阿里巴巴提供的开源一款云原生应用配套工具,其不仅仅是一个注册中心组件。
1.下载
大家可以去Nacos官网去下载:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网
下载后解压,我们就能得到下面的文件了:
下面介绍文件中的内容是什么:
1)bin:Nacos启停脚本
其中startup.sh是Linux的启动脚本,shutdown.sh是Linux的停止脚本。
2)conf:Nacos的配置文件
3)target:存放Nacos应用的jar包
2.修改模式
Nacos默认启动方式是集群模式,我们可以将其改成单机模式。
1)打开startup.cmd,找到下面圈出的哪一行
2)将cluster改成standalone
保存就修改成功了。
通过 127.0.0.1:8848/nacos 就可以访问了:
3.端口号冲突
默认的端口号是8848,如果这个端口号被其他应用占用了,就会发生报错。我们可以使用下面的方法来去解决这个问题。
1)关闭占用8848端口的进程
通过在cmd上输入:
netstat -ano|findstr "8848"
我们就可以得到PID(30680):
通过PID我们就可以将这个进程杀死:
taskkill /pid 4968 -f
2)修改端口号
在conf文件下,找到下面圈出的文件:
在文件中找到端口号修改即可:
二.服务注册和服务发现
1.引入spring-cloud-alibaba的依赖
在父项目中引入下列依赖:
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<!--注意是放在<dependencyManagement>下-->
<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>
2.引入Nacos相关依赖
在服务提供者和服务消费者中引入下列依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.修改配置文件
服务提供者和服务消费者都要加入下面的内容:
spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
4.修改远程调用的代码
这个代码在服务消费者中:
@Resource
RestTemplate restTemplate;
@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){
OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);
String url="http://product-service/product/"+orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
orderInfo.setProductInfo(productInfo);
return orderInfo;
}
启动服务后可以在Nacos上查看:
三.负载均衡
Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。
1.权重
在Nacos服务列表点击下面内容就可设置权重了:
开启Nacos负载均衡策略,下面的配置加在服务消费者处:
spring:
cloud:
loadbalancer:
nacos:
enabled: true
2.同集群优先访问
同集群优先访问就是优先让同集群的服务提供者提供服务。
这一要使用同集群优先访问也要开启Nacos负载均衡。
为集群设置名称,这个服务消费者和提供者可以写:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
cluster-name: Canton
四.健康检查
1.检查机制
Nacos提供了两种健康检查机制:
1)客户端主动上报机制:
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒。nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除。
2)服务端反向探测机制:
nacos主动探知客户端健康状态,默认间隔为20秒。健康检查失败后实例会被标记为不健康,不会被立即删除。
注意:Nacos中的健康检查机制不能主动设置,健康检查机制是和Nacos的服务实例类型强相关的。
2.服务实例类型
Nacos的服务实例分为两种类型:
1)临时实例:如果实例宕机超过⼀定时间,会从服务列表剔除,采取的是客户端主动上报机制,默认类型。
2)非临时实例(永久实例):如果实例宕机,不会从服务列表剔除,采取服务器端反向探测机制。
通过修改配置文件可以设置非临时实例,加在服务消费者处:
spring:
cloud:
nacos:
discovery:
ephemeral: false
当我们修改后,重启服务,发现会报错,启动失败了。
报错信息:
Current service DEFAULT_GROUP@@order-service is persistent service, can't register ephemeral instance.
原因:Nacos会记录每个服务实例的IP和端口号,当发现IP和端口都没有发生变化时,Nacos不允许⼀个服务实例类型发生变化,比如从临时实例,变为非临时实例就不行。
解决办法:
1)关闭Nacos;2)删除Nacos下的/data/protocol/raft
五.环境隔离
Nacos提供了namespace(命名空间)来实现环境的隔离,不同的namaspace的服务不可见。
1.创建namespace
2.配置namespace
写在配置文件中,服务消费者和提供者都可以写:
spring:
cloud:
nacos:
discovery:
namespace: 命名空间ID
六.配置中心
配置中心就是对这些配置项进行统⼀管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件。
(更新!)今天在写项目的时候我要用云服务器上的Redis,这个时候就要配置IP地址,但是我不想让别人知道我的IP地址(因为我要提交到Gitee上)。所以可以使用配置中心配置这些敏感信息,这样别人就不知道我的IP地址了。
1.添加配置
在Nacos官网配置:
2.引入依赖
在服务提供者中引入NacosConfig依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0</version>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3.配置bootstrap.yml
该配置文件放在服务提供者的resources中。
Nacos要求必须使用bootstrap.yml或bootstrap.properties配置文件来配置NacosServer地址。
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
其实spring.application.name要与Nacos配置管理的DataID(上图中有)一致;spring.cloud.nacos.config.server-addr为NacosServer地址。
此外还可以设置命名空间:
spring:
cloud:
nacos:
config:
namespace: 命名空间ID
4.编写程序获取配置
@RefreshScope
@RestController
public class NacosController {
@Value("${nacos.config}")
private String nacosConfig;
@RequestMapping("/getConfig")
public String getConfig(){
return "从Nacos获取配置项nacos.config:"+nacosConfig;
}
}
七.Nacos与Eureka的区别
Eureka | Nacos | |
功能 | 服务发现和注册 | 服务发现和注册、配置中心、流量管理、DNS服务 |
CAP理论 | AP原则 | 可以切换AP和CP模式,默认AP |
服务发现 | 基于拉模式。EurekaClient会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次 | 基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接 |
八.Nacos配置MySQL数据库
我们前面在配置中心配置的信息在Nacos重启后就没了,如果我们需要这个配置信息,我们可以配置数据库,将配置信息存在数据库中,这样就是实现了数据的持久化。
具体的操作方法大家可以看官网写的,官网写的很详细:nacos配置mysql数据库 | Nacos 官网