目录
1.windows安装Nacos
1.1.下载安装包
1.2解压到任意非中文目录下:
1.3启动
2.图解nacos
3.服务注册
3.5nacos集群
3.6权重配置
3.8临时实例
3.9Nacos配置中心
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
本文使用nacos-server-1.4.1.zip版本
目录说明:
bin:启动脚本
conf:配置文件
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
修改其端口号:server.port=XXXX(任意不冲突的端口)
在bin目录打开cmd
执行Windows命令:
startup.cmd -m standalone
3.1父工程添加依赖
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.6.RELEASE
pom
import
3.2每个服务添加依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
3.3每个服务添加nacos配置
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
3.4将服务跑起来,看nacos控制页面有没服务。
NacosRule:
Ribbon的默认实现 ZoneAvoidanceRule
并不能实现根据同集群优先来实现负载均衡,我们把规则改成 NacosRule 即可。我们是用 orderservice 调用 userservice,所以在 orderservice 配置规则。
@Bean
public IRule iRule(){
//默认为轮询规则,这里自定义为随机规则
return new NacosRule();
}
或者在对应的服务yml中配置效果一样的
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。
微服务配置
本地多开模拟集群
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
本地配置的是orderServer 8082和userServer 8081 8084是在HZ 8083在SH
通过http://localhost:8082/order/108 访问8081和8084有日志输出,8083没有,说明实现了区域集群管理。
当8081,8084服务挂掉,通过http://localhost:8082/order/108 看到8083有日志输出,且页面没有出错,说明当没有相同区域的服务可用时会跨区域使用。
order服务会抛出异常:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下 NacosRule 是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos 提供了权重配置来控制访问频率,0~1 之间,权重越大则访问频率越高,权重修改为 0,则该实例永远不会被访问。
在 Nacos 控制台,找到 user-service 的实例列表,点击编辑,即可修改权重。
3.7环境隔离
public和dev是两个namespace,相互是隔离不可见的
将orderServer yaml中配置,重启
Nacos 的服务实例分为两种类型:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
设置好后重新启动orderServer,后关闭orderserver
nacos会等待,不会直接删除服务,orderserver恢复后会自动注册上来。
3.9.1Nacos除了可以做注册中心,同样可以做配置管理来使用。
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好。
在nacos 之前的springboot启动加载配置文件的过程是:
加入 Nacos 配置,它的读取是在 application.yml 之前的:
如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。
因为我部署的nacos热配置在userserver中,所以要在uerserver的pom文件中添加依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
然后,在 user-service resources中添加一个 bootstrap.yml 文件,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
在 user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置并使用:
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
//格式化时间
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
方式一:在 @Value
注入的变量所在类上添加注解 @RefreshScope
方式二:使用 @ConfigurationProperties
注解读取配置文件,就不需要加 @RefreshScope
注解。
3.9.2配置共享
其实在服务启动时,nacos 会读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml[spring.application.name].yaml
,例如:userservice.yaml这里的 [spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
添加一个环境共享配置:
java代码中添加:
访问结果:
加载文件不同就不能获取userservice-dev.yaml里的配置,只能获取共享的配置
结果:
不管是 dev,还是 test 环境,都读取到了 envSharedValue 这个属性的值。
上面的都是同一个微服务下,那么不同微服务之间可以环境共享吗?
答案是肯定的。
通过下面的两种方式来指定:
spring:
cloud:
nacos:
config:
file-extension: yaml # 文件后缀名
extends-configs: # 多微服务间共享的配置列表
- dataId: common.yaml # 要共享的配置文件id
spring:
cloud:
nacos:
config:
file-extension: yaml # 文件后缀名
shared-configs: # 多微服务间共享的配置列表
- dataId: common.yaml # 要共享的配置文件id
3.9.3配置优先级
当 nacos、服务本地同时出现相同属性时,优先级有高低之分。
多种配置的优先级:
详细学习请看nacos官方文档:
什么是 Nacos