学习背景与准备
在简单的电商环境下,搭建spring cloud alibaba项目,并学习nacos注册发现及配置、等功能。
Nacos服务发现
cloud项目搭建
导入依赖,包括cloud及cloud aliaba,首先是父工程:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
然后是cloud和alibaba cloud的依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
版本的选择:Hoxton.SR9与2.2.5.RELEASE。
nacos服务注册发现初试
①加依赖:仍在总pom文件中导入以下依赖。
<!-- 引入nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
②加注解:在服务提供方和消费方的启动类增加@EnableDiscoveryClient注解。在服务消费方的启动类中增加@LoadBalancer注解,表示启动ribbon。
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
}
③加配置。要为当前服务设置注册地址、注册名称等。在yaml配置文件中展开。
server:
port: 8000
spring:
cloud:
nacos:
discovery:
service: order-srv
server-addr: localhost:8848
上述配置的服务名称为order-srv,端口为8000。
④写代码。在消费端写代码对服务方继续调用。
@Resource
private RestTemplate restTemplate;
@GetMapping("/order/create")
public String createOrder(@PathParam("productId") Integer productId , @PathParam("userId")Integer userId){
String res = restTemplate.getForObject("http://store-srv/store/{productId}", String.class, productId);
// String res = restTemplate.getForObject("http://localhost:8081/store/{productId}", String.class, productId);
return "用户为" + productId + ",产品为" + userId + res;
}
大功告成!测试成功!
nacos配置项
配置项表示工程的yaml文件或properties文件,待上线的项目可能处于不同的运行环境,如数据库选择不同等,这时就需要灵活配置。nacos提供了yaml文件生效的场景,可以将配置文件与jar包分隔开来,基本操作如下所示:
①增加依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
②为当前服务设置dataId等配置:
spring:
application:
name: demotest
cloud:
nacos:
discovery:
service: demo-srv
config:
server-addr: localhost:8848
file-extension: yaml
这其中,name表示该服务的工程名,对应nacos中dataId值。
此外,要实现配置的类似热部署功能,需要在Controller类上增加@RefreshScope注解。
nacos注解的动态配置
这里设置一个情境,即同一个工程项目有开发dev、测试test、生产produce环境。那就需要多种配置文件。在nacos中,需要配置相应的dataid,命名规则为:工程名-运行环境.支持的文件拓展名,需要与项目工程中的实际配置保持一致。
如果要使用通用配置文件,则dataId中去掉文件拓展名即可。注意,通用配置的优先级低于其他三种,如下图。
共享配置:在配置文件中添加shared-configs属性,或者extension-configs。
nacos动态监听的长轮询机制原理
服务端会向nacos客户端注册信息,此处动态监听是指nacos客户端会监听服务端的配置信息,当配置信息发生改变时,会及时更新。其长轮询的动态更新机制如下:nacos客户端发出请求(pull拉),服务端会在30秒内给出回应,回应的触发事件为:若配置发生变化,则返回需要更新的打他Id、group,客户端拿到变更的groupKey后,再根据groupKey去获取配置项的最新值配置信息;否则超时30秒后直接返回。
Nacos领域模型
Nacos架构