Nacos
"Nacos"是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴集团开发和维护。它提供了服务注册、发现、配置管理和动态路由等功能,能够帮助开发人员更好地构建云原生应用和微服务架构。这里由于打开的时候默认走的是集群模式,在现在测试所以打开的时候增加单机模式的条件由于打开的时候默认走的是集群模式,所以打开的时候增加单机模式的条件.
sh
startup.cmd -m standalon
注册实现
首先导入依赖
不同于eureka。他并没有包含在cloud里面,需要在父工程引入依赖:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端:
xml
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
然后在修改配置文件就行了,由于是集成在cloud里面的,所以直接写明地址就可以直接在客户端查看的,需要保证nacos的提前打开
注意一个就是不能直接在网页输入服务名直接访问,他需要借助resTemplate和Feign才可以在注册中心里面取访问,原理是他是在项目中把服务名划分出来,并且当访问项目url的时候他会进行一个拦截器然后去转换,这个可以去看HttpClientInterpreter
分级存储
实际上需要了解概念,命名空间,分组,服务,集群,实例,从大到小的进行一个包含关系,这些都可以在yml文件里面进行配置
yaml
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ //设置集群名称
namespace: id //归宿命名空间,一般都可以在客户端页面进行创建就可以了
group: public 1 //默认走的是public 的分组,可以自己进行添加
因此,补充一个多个概念命名空间是可以服务隔离的,一般情况下,nacos会优先在本地的集群里面取找对应的实例,如果没找到才会跑到其他集群里面,但是命名空间之间是相互隔离的,也就是说在不同命名空间的实例无法进行远程调用。但是需要去设置NacosRule,这里用的都是里面的集群里面进行轮询,这部分内容建议用到再去找,知道这么写概念就行。
权重设置
这里的设置在网页端设置可以,一般设置在0-1之间,简单来说就是同一个容器里面的出现
配置管理
热更新
统一管理配置进行热更新,也就是当项目中需要更改实例的配置的时候一般情况都是修改项目配置文件,因此为了减少修改次数就进行一个统一管理,只需要在页面端添加配置管理,增加yml文件,并在配置内容写需要热更新的属性就行,不需要粘贴整个文件
在项目中,由于项目获取配置文件先走的是application.yml,那么为了让他提前加载nacos相关的配置文件 ,一般会在项目中建立新的配置文件bootstrap.yml里面进行nacos相关的配置文件,并且导入相关依赖,这样就可以提前加载nacos文件
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap文件,三要素不能缺少,这样可以去加载在网页之前设置好的配置内容,可用@Value进行验证
yml
spring:
application:
name: userservice #服务名称
profiles:
active: dev #服务环境,这里是生产环境
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml #文件后缀
java
@RefreshScope //这个是热更新的注解,在这个类上使用就可以了
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}") //调用配置文件里面的数据记得是${}
private String time;
@GetMapping("/now")
public String now() { //这里面的LocalDateTime和LocalDate别弄错了,一个是带时分秒的
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(time));
}
拓展另一种加载配置文件的方式
采用注解方式加载
java
@Component
@Data
@ConfigurationProperties(prefix = "pattern") //记得加前缀
public class Pattern{
private String dateformat
}
//然后在另一个类里面创建,创建后直接对象.属性就可以加载成功
多环境配置共享
对于开发,测试等环境当需要改变的时候,微服务启动的时候一定会加载yml文件,那么对于需要加载的文件
优先级: 服务名-生产环境.yml > 服务名称.yml > 本地配置
也就是说先去加载nacos的配置,并且加载声明服务生产环境的优先
集群搭建
注意先开nacos再开nginx
这里不做主从数据库搭建,对于nginx代理这块就是去修改conf文件的属性就行,
yml
#上传到nginx的名字url,然后代理下面的ip
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80; 监听的端口
server_name localhost;
#nacos-cluster; //访问的nacos默认走上面的url
location /nacos {
proxy_pass http:
}
}
然后就是nacos的配置
导入数据库
修改配置文件cluster.conf.example,重命名为cluster.conf ,
yml
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
增加
然后修改application.properties文件,添加数据库配置
yml
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
application.properties里面修改端口(单机的情况) 访问http://localhost/nacos
最后把项目里面对nacos的服务端地址改成80端口的就行了。
Nacos和Eureka对比
- eureka只支持AP
- nacos支持CP和AP两种 nacos是根据配置识别CP或AP模式,如果注册Nacos的client节点注册时是ephemeral=true即为临时节点,那么Naocs集群对这个client节点效果就是AP,反之则是CP,即不是临时节点
- 在临时节点的条件下nacos会主动检测如果注册表变化那么会主动push到服务的ribbon缓存当中,心跳也是变成主动获取。并且节点挂掉后不会自动剔除。
yml
spring.cloud.nacos.discovery.ephemeral=true
保护方式不同
Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enable-self-preservation: false)
Nacos保护方式:当域名健康实例 (Instance) 占总服务实例(Instance) 的比例小于阈值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。