03_Nacos Client端使用
Spring Cloud Alibaba Nacos快速开始
Spring Cloud Alibaba版本选型:
#版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
父工程pom文件:
<?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"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.yyj.mall</groupId> <artifactId>spring-cloud-alibaba-nacos</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-alibaba-nacos</name> <packaging>pom</packaging> <modelVersion>4.0.0</modelVersion> <description>Demo project for vip-spring-cloud-alibaba</description> <modules> <module>mall-common</module> <module>mall-user</module> <module>mall-order</module> </modules> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version> </properties> <dependencies> <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> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <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> </dependencies> </dependencyManagement> </project>
微服务(Nacos Client)整合Nacos注册中心(Nacos Server)
配置服务提供者mall-order服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
1)引入依赖
当前项目pom中引入依赖
<!-- nacos服务注册与发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
配置nacos注册中心
server: port: 8020 spring: application: name: mall-order #微服务名称 #配置nacos注册中心地址 cloud: nacos: discovery: server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848
更多配置请参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
启动mall-order,nacos管理端界面查看是否成功注册:
测试,通过Open API查询实例列表:
配置服务消费者mall-user:
服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
1)引入依赖
当前项目pom中引入依赖
<!-- nacos服务注册与发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
配置nacos注册中心
server: port: 8040 spring: application: name: mall-user #微服务名称 #配置nacos注册中心地址 cloud: nacos: discovery: server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848
启动mall-user,nacos管理端界面查看是否成功注册
使用RestTemplate进行服务调用
给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成
@Configuration public class RestConfig { @Bean @LoadBalanced // 微服务名替换为具体的ip:port public RestTemplate restTemplate() { return new RestTemplate(); } }
调用逻辑
#使用微服务名发起调用 String url = "http://mall-order/order/findOrderByUserId/"+id; List<Order> orderList = restTemplate.getForObject(url, List.class);
测试:http://localhost:8040/user/findOrderByUserId/1,返回数据:
Nacos注册中心常见配置:
服务分级存储模型
注册中心的核心数据是服务的名字和它对应的网络地址,当服务注册了多个实例时,我们需要对不健康的实例进行过滤或者针对实例的㇐些特征进行流量的分配,那么就需要在实例上存储㇐些例如 健康状态、权重等属性。随着服务规模的扩大,渐渐的又需要在整个服务级别设定㇐些权限规则、 以及对所有实例都生效的㇐些开关,于是在服务级别又会设立㇐些属性。再往后,我们又发现单个 服务的实例又会有划分为多个子集的需求,例如㇐个服务是多机房部署的,那么可能需要对每个机 房的实例做不同的配置,这样又需要在服务和实例之间再设定㇐个数据级别。
Nacos 在经过内部多年生 产经验后提炼出的数据模型,则是㇐种服务-集群-实例的三层模型。这样基本可以满足 服务在所有场景下的数据存储和管理。
服务逻辑隔离
Nacos 数据模型 Key 由三元组(namespace-group-service)唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
修改yml配置
cloud: nacos: discovery: server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848 namespace: d03abad8-acbc-46a5-8f6c-b45bf8c84e6e # dev 开发环境
测试:http://localhost:8040/user/findOrderByUserId/1,报错,原因:mall-order和mall-user使用了不同的namespace,导致服务隔离。
group服务分组
不同的服务可以归类到同一分组,group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group参数配置。
临时实例和持久化实例
在定义上区分临时实例和持久化实例的关键是健康检查的方式。临时实例使用客户端上报模式,而持久化实例使用服务端反向探测模式。临时实例需要能够自动摘除不健康实例,而且无需持久化存储实例。持久化实例使用服务端探测的健康检查方式,因为客户端不
会上报心跳, 所以不能自动摘除下线的实例。在大中型的公司里,这两种类型的服务往往都有。㇐些基础的组件例如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册。而上层的业务服务,例如 微服务或者 Dubbo 服务,服务的 Provider 端支持添加汇报心跳的逻辑,此时就可以使用动态服务的注册方式。
版本对比
Nacos 1.x 中持久化及非 持久化的属性是作为实例的㇐个元数据进行存储和识别。
Nacos 2.x 中继续沿用了持久化及非持久化的设定,但是有了㇐些调整。在 Nacos2.0 中将是否持久化的数据抽象至服务级别, 且不再允许㇐个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性。
# 持久化实例 spring.cloud.nacos.discovery.ephemeral: false