目录
一、认识和安装Nacos
认识Nacos
Nacos是阿里巴巴的产品,现在是springCloud中的一个组件,相比Eureka功能更加丰富,在国内受欢迎程度较高。
Nacos安装
链接:https://pan.baidu.com/s/14lIotaIp7mnNANAZjfciwA
提取码:GY66
启动Nacos并登录( 启动命令:.\startup.cmd -m standalone ;用户名密码默认均为nacos)
二、Nacos快速入门
服务注册到Nacos
1、 在cloud-demo 父工程中添加spring-cloud-alibaba的依赖管理:
<!-- nacos管理依赖-->
<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>
2、注释掉order-service和user-service中原有的eureka依赖
3、添加nacos的客户端依赖
<!--nacos客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4、修改user-service中的application.yml文件,注释eureka地址,添加nacos地址
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
5、启动测试
三、Nacos服务分级存储模型
① 一级是服务
② 二级是集群,例如不同区域(上海、杭州…)
③ 三级是实例,例如某区域机房的某台部署了user service的服务器
部署集群(容灾)
服务跨集群调用问题
服务集群属性配置
1、修改application.yml(springcloud下),添加内容,启动不同的集群服务
discovery:
cluster-name: HZ #集群名称,ZH (杭州)
2、Nacos控制台可以看到集群变化
能否实现order-service远程调用user-service时优先选择本地集群???
1、设置order-service集群属性并启动(修改yml文件)【 部署同集群(HZ)】
多次访问查询业务,查看日志发现不同的服务均被访问,因此order-service发起远程调用时并未优先选择同集群的服务【依然采用轮询机制方案】
服务在选择实例时规则是由负载均衡的规则决定的
四、NacosRule负载均衡
根据集群负载均衡
(此时可实现优先访问本地集群)
在order-service中设置负载均衡的IRule为NacosRule
userservice: #要配置的微服务的名称
ribbon:
NFLoadBalancerClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
NacosRule负载均衡特点
优先选择本地集群,本地集群内的多个服务则再采用随机方式进行负载均衡
根据权重负载均衡
将user-service的权重都设置为1
在实际部署中会出现这样的场景:
● 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
1、在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮
2、将权重设置为0.1,测试可以发现8081被访问到的频率大大降低
注意:当设置权重为0时,则此服务不会被访问
(可进行版本升级)
五、环境隔离——namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离(Nacos默认public为命名空间)
1、新建命名空间
2、修改服务命名空间(在order-service的application.yml,添加namespace)
成功添加到dev环境中
注意:此时order-service已不能访问user-service,不同namespace下的服务不可见
(服务若要实现访问应处于相同的环境下)
六、Nacos配置管理
统一配置管理
配置获取步骤
新建配置管理(有热更新需求的)
eg:日期模板
微服务配置拉取
①:引入Nacos的配置管理客户端依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
②:在user-service中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
spring:
application:
name: userservice #服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 #Nacos地址
config:
file-extension: yaml #文件后缀名
检验是否可成功拉取到配置
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
配置拉取成功!!!
配置热更新
Nacos中的配置文件变更后,微服务无需重启就能感知。不过需要通过两种配置实现
配置自动刷新
● 方式一: 在@Value注入的变量所在类上结合注解@RefreshScope刷新
● 方式二: 使用@ConfigurationProperties注解,自动刷新
【注意事项】
●不是所有的配置都适合放到配置中心,维护起来比较麻烦;
●建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
配置共享
多环境配置共享(eg:某配置属性在开发、生产、测试等环境下值相同)
微服务启动时会从nacos中读取多个配置文件:
● [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
● [spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化, [spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
多种环境配置的优先级:
● 服务名-profile.yaml > 服务名称.yaml > 本地配置
搭建Nacos集群
Nacos生产环境下一定要部署为集群状态
步骤:
● 搭建数据库,初始化数据库表结构
● 下载nacos安装包
● 配置nacos
● 启动nacos集群
● nginx反向代理