Nacos注册中心
服务注册到Nacos
Nacos
是SpringCloudAlibaba的组件也遵循SpringCloud中定义的服务注册和服务发现规范,因此使用Nacos与使用Eureka对于微服务来说并没有太大区别
- 主要差异就是依赖不同,服务地址不同
第一步: 在父工程cloud-demo模块
的pom.xml文件中引入SpringCloudAlibaba的管理依赖spring-cloud-alibaba-dependencies
<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>
第二步: 在user-service和order-service模块
的pom文件中引入Nacos的客户端依赖spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第三步: 在user-service和order-service模块
的application.yml文件中配置注册的服务名称和Nacos地址(默认就是localhost:8848)
- 注册的服务实例默认会被分配到public的命名空间,分组名称是DEFAULT_GROUPE,也可以添加
discovery.namespace和group
配置手动指定命名空间和分组
spring:
application:
name: userservice/orderservic # 注册的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
namespace: xxx # 通过命名空间ID或名称指定注册服务实例所在的命名空间
group: xxx # 通过分组名指定注册服务实例所在的分组
第四步: 重启user-service和order-service服务
,登录Nacos的管理页面在服务列表
中查看所有注册的微服务信息
分级存储模型(集群/实例)
一个服务可以创建多个实例
, 这些实例可能分布于全国各地的不同机房,Nacos会将这些在同一个机房的实例划分为一个集群(包含不同服务的实例)
- 一个微服务可以包含多个集群,每个集群下有多个实例,形成分级存储模型(一级是微服务, 二级是集群, 三级是实例)
- 因为跨集群调用服务延迟较高, 所以微服务相互调用时应该尽可能先访问本地集群的服务(本地访问速度快),当本地集群不可访问时再去访问其他集群
第一步: 在user-service模块
的配置文件中添加集群配置属性spring.cloud.nacos.discovery.cluster-name
并重新启动该服务的8080/8081
两个实例
spring:
application:
name: user-service # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: HZ # 集群名称(杭州)
第二步: 使用IDEA创建一个userservice服务的实例(端口号设为8083)
, 修改user-service模块
的配置文件并将集群名称设为上海,然后启动该服务的8083实例
- 一个配置文件可以编辑多次,每次修改完配置文件后只会对下次要启动的实例生效,不会对启动的实例生效
spring:
application:
name: user-service # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: SH # 集群名称(上海)
第三步: 在Nacos控制台查看注册的微服务的集群及其实例个数
环境隔离
环境级别
实际开发中在不同的环境下需要使用不同的配置,如开发环境(dev),测试环境(test),生产环境(prod)
- 我们启动项目时传入
spring.profiles.active
属性的参数值dev/test/prod
决定引用哪个环境的配置文件
Nacos既是一个注册中心同时也是一个数据中心,为了做数据和服务的管理另外提供了命名空间(ID唯一)
来对不同环境的服务进行隔离
- Nacos中可以有多个命名空间,每个
namespace
下可以有多个Group
,每个groupe下又有多个服务实例
,不同环境下的服务实例互相不可见即无法访问
右键Edit Configuration...
修改Active.profiles属性值
可以快速更改服务实例启动时的环境,不用再修改配置文件
配置环境隔离
第一步: 创建新的命名空间,点击命名空间 ->新建命名空间 ->填写表单(设置命名空间名和描述,命名空间的ID可以自动生成)
第二步: 在order-service模块
的application.yml文件中添加spring.cloud.nacos.discovery.namespace属性
配置服务实例所属的命名空间
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: ea980a8c-c886-4a2c-8653-d29c62d518bb # 通过ID指定服务实例所属的命名空间
namespace: dev # 通过名称指定服务实例所属的命名空间
第三步: 重启order-service服务实例
,访问http://localhost:8080/order/101则会报找不到可用实例的异常
,因为在dev命名空间下没有userservice服务