使用Nacos代替eureka,步骤与eureka类似
- 引入父工程依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 引入子项目的依赖,并去除eureka的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置springboot文件
spring:
cloud:
nacos:
server-addr: localhost:8848
Nacos服务分级存储模型
启动:
startup.cmd -m standalone
服务-集群-实例。
在服务调用时,尽可能访问本地集群,跨集群调用延迟很高。本地集群不可访问时,再去访问其他集群。
如何配置集群:
- 在springboot配置文件中增加集群配置
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: Bocai
如希望负载均衡的策略为优先调用本地集群的实例,则需要修改策略
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
NacosRule特点:
-
优先访问本地集群
-
本地集群内的多个服务采用随机方式
-
如果本地集群中的所有服务都无法访问,则会跨集群访问。
A cross-cluster call occurs,name = userservice # 一次跨集群的访问发生了
环境隔离
namespace——命名空间
一个命名空间中的服务可以互相调用,但是不同的namespace中的不能调用。
java.lang.IllegalStateException: No instances available for userservice
//找不到userservice可用的实例
- 设置一个开发环境
cloud:
nacos:
server-addr: localhost:8848
discovery:
namespace: c043e4a4-9940-470a-a313-a438392f8d7a # 命名空间
eureka与nacos
- nacos将实例分为临时实例和非临时实例。临时实例的心跳检测与eureka类似,每隔一定时间进行一次检测,将坏掉的服务剔除。非临时实例,则nacos主动发送请求来查看服务状态,即使服务挂掉也不会主动剔除。
- 都说服务的提供者将自身注册到eureka/nacos,然后服务的消费者定时进行拉取。nacos如果发现有服务坏掉,则会立即推送消息给消费者(push)
ephemeral: false #非临时实例
Nacos统一配置管理
在Nacos-配置管理中新建一个配置
一般明明规范为:xx(哪一个服务)-xx(哪一个环境).yaml,如:userService-dev.yaml
将核心配置填写在配置内容中,一般为一些可能会发生变化的配置,在开发环境中怎么样,项目上线了怎么样。
一般流程:
- 项目启动
- 读取本地配置文件application.yml
- 创建spring容器
- 加载bean
现在需要先读取nacos配置文件在读取本地文件,但是nacos的地址写在本地文件中,因此引入优先级更高的bootstrap.yml
配置文件
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名