Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。Nacos的主要作用是动态服务发现、配置管理和服务管理平台。
我本次使用的是1.4.1版本的Nacos,下载地址
linux版本:
链接:https://pan.baidu.com/s/1WbtenixWAoGMvsrz_S3_ew
提取码:xuyd
windows版本:
链接:https://pan.baidu.com/s/1NmWYz9jwxU-00jusMOLhfA
提取码:xuyd
下载之后放到指定目录解压即可,解压目录如下:
到nacos的bin目录下执行命令:
./startup.sh -m standalone
入门,目前不用集群启动,后续会有集群启动的教学。
启动成功之后,访问地址即可
http://ip:8848/nacos
账号密码都为nacos,登陆之后如下:
至此,nacos安装启动成功。
nacos的配置文件在conf目录下的application.properties文件。
1、引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>2.2.6.RELEASEversion>
dependency>
2、添加配置
spring:
cloud:
nacos:
server-addr: ip:port
3、启动服务
4、查看结果
如果如上图结果,即可证明集成(服务注册)成功。
1、Nacos的服务所属集群了解(非Nacos集群)
一级是服务
二级是集群
三级是实例
可以先看一下下面这个图:
由图可知,多个相同的服务可以存储到不同的集群里,常见的场景为地域划分,尽可能选择本地集群的服务,可以达到最优速度,跨集群调用的话,延迟较高,一般只有当本地的集群不可使用时,才会去访问其他集群
集群的配置也是通过配置文件来配置如下图所示:
spring:
cloud:
nacos:
server-addr: ip:port # nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
修改配置之后重新启动,可以在nacos控制台查看集群变化:
配置了集群,还需要配置负载均衡规则,否则不会起到实际作用。负载均衡配置如下:
在服务调用方配置被调用的服务的负载均衡规则。
userservice: # 服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
配置好之后,A服务如果集群是HZ,就会优先调用集群为HZ的userservice服务实例。
2、根据权重负载均衡
进入实例详情之后,编辑权重(默认是1)。如果两个实例一个是1,另一个修改为0.1,则访问时会以10比1的比例来分配。
关于权重,知道以下三点即可:
1、Nacos控制台可以设置实例的权重值,0~1之间
2、同集群内的多个实例,权重越高被访问的频率越高
3、权重设置为0则完全不会被访问
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
1、在控制台可以创建namespace,用来隔离不同的环境。
2、保存之后即可看见这个命名空间的id
3、修改order-service的application.yml,添加namespace
spring:
cloud:
nacos:
server-addr: ip:port # nacos服务地址
discovery:
cluster-name: HZ
namespace: 1b783dc8-11d3-4726-9343-d297ee4e8e50
4、此时启动orderservice,即可在dev的命名空间下看到服务实例。
public下面没有刚才启动的orderservice,此时如果orderservice去调用uservice的内容,则会报错找不到服务,因为他们的namespace不同,被隔离开了,无法进行服务调用。
步骤:
1、在Nacos中添加配置信息:
2、引入nacos配置依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
3、在bootstrap.yml下新增配置。这个文件是引导文件,优先级高于application.yml
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
测试:注意,此时需要多一个注解,@RefreshScope,此注解可以让微服务无需重启即可感知配置的变化。
我们在user-service中将pattern.dateformat这个属性注入到UserController中做测试:
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
// 注入nacos中的配置属性
@Value("${pattern.dateformat}")
private String dateformat;
// 编写controller,通过日期格式化器来格式化现在时间并返回
@GetMapping("now")
public String now(){
return LocalDate.now().format(DateTimeFormatter.ofPattern(dateformat, Locale.CHINA));
}
// ... 略
}
方式2:使用@ConfigurationProperties注解
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateFormat;
}
多环境共享:
微服务启动时会从nacos读取多个配置文件:
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
多个服务配置的优先级如下:
[服务名]-[环境].yaml >[服务名].yaml > 本地配置
多服务共享:
不同微服务之间可以共享配置文件,通过下面的两种方式来指定:
方式1:
spring:
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
shared-configs: #多微服务间共享的配置列表
- dataId: common.yaml # 要共享的配置文件id
方式二:
spring:
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
extends-configs: #多微服务间共享的配置列表
- dataId: extend.yaml # 要共享的配置文件id
多服务配置的优先级:
环境配置 >服务名.yaml > extension-config > extension-configs > shared-configs > 本地配置
总结:
微服务默认读取的配置文件:
1、[服务名]-[spring.profile.active].yaml,默认配置
2、[服务名].yaml,多环境共享
不同微服务共享的配置文件:
1、通过shared-configs指定
2、通过extension-configs指定