一、nocos注册中心
1、win安装:2、服务注册到Nacos3、Nacos服务分级存储模型
配置集群实例属性 4、集群负载均衡
1.添加配置,加入集群将Bean进行更改,将轮巡改为随机2.将 轮巡 改为 优先选择集群(测试) 5、根据权重负载均衡(测试)6、环境隔离 - namespace 二、Eureka/nocos对比三、Nacos配置管理
1、统一配置管理的服务
1.创建配置2.启动时,读取yaml的顺序:3.引入 nacos-config 依赖4.添加 bootstrap.yml 【其中必须是yaml】5. 测试:使用代码来验证是否拉取成功 2、配置热更新
方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope方式二:使用 @ConfigurationProperties 注解读取配置文件,就不需要加 @RefreshScope 注解。 3、配置共享
添加一个环境共享配置:测试: 运行两个 UserApplication,使用不同的profile配置的优先级: 4、搭建Nacos集群
1. 搭建mysql集群并初始化数据库表2. 下载解压nocos3. 修改集群配置节点信息、数据库配置4. 分别启动多个nacos节点5. nginx反向代理idea代码中application.yml文件配置如下:而后在浏览器访问:http://localhost/nacos即可。
一、nocos注册中心Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka
功能更加丰富,在国内受欢迎程度较高。
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
解压文件nacos-server-1.4.1.zip
目录分析:
target:是一个jar包,而nocos是基于JAVA语言实现。
conf:配置文件。例如端口默认8848
bin:可执行文件。可以直接startup.
cmd下启动:startup.cmd -m standalone 【模式:单机启动】
- 第一步:在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖
com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.6.RELEASE pom import
- 注释掉order-service和user-service中原有的eureka依赖。添加nacos的客户端依赖:
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
- 修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务端地址3、Nacos服务分级存储模型
配置集群实例属性Nacos服务分级存储模型
① 一级是服务,例如userservice
② 二级是集群,例如杭州或上海
③ 三级是实例,例如杭州机房的某台部署了userservice的服务器
2. 如何设置实例的集群属性
① 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可
修改application.yml,添加如下内容:
spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
需要给Order配置集群属性,目的是为了:当order远程调用user服务时,能选择本地集群。【能选择同一个名字的集群】(实例配置好了集群,是为了能选择实例集群)。
1.添加配置,加入集群 cloud:
nacos:
server-addr: localhost:8848 #nacos 服务端地址
discovery:
cluster-name: HZ
将Bean进行更改,将轮巡改为随机
@Bean
public IRule iRule(){
//默认为轮询规则,这里自定义为随机规则
return new NacosRule();
}
2.将 轮巡 改为 优先选择集群(测试)
优先选择集群,在集群中,在进行随机访问。
userservice:
ribbon:
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
5、根据权重负载均衡(测试)
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
实例的权重控制
① Nacos控制台可以设置实例的权重值,0~1之间
② 同集群内的多个实例,权重越高被访问的频率越高
③ 权重设置为0则完全不会被访问.
当版本升级的时候,可以将8081服务器的权重调为0,那么81不在接受用户的请求了,可以做一些版本的升级,那么可以放出0.1来,让少量的客户进来测试,如果没有问题,可以继续扩大权重。从而让用户无感知的,进行服务器的升级。
6、环境隔离 - namespace层次:NameSpace—Group—Service/Date—DEFAULT_GROUP—实例
创建命名空间
修改服务的命名空间:
二、Eureka/nocos对比
Nacos与eureka的共同点
① 都支持服务注册和服务拉取
② 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
① Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
② 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
③ Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
④ Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方法
该服务会记录核心的配置,当其他微服务启动的时候,会读取配置管理的服务,和本地的配置服务相结合使用。
当配置发生了更改,不用逐个服务去更改,而是找到【服务配置中心】,进行修改即可。
当修改了【配置中心】的信息后,该服务会通知各个服务,从而各个服务去完成配置的读取。
2.启动时,读取yaml的顺序:注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好
首先我们需要了解 Nacos 读取配置文件的环节是在哪一步,在没加入 Nacos 配置之前,获取配置是这样:
加入 Nacos 配置,它的读取是在 application.yml 之前的:
这时候如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。
因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。
3.引入 nacos-config 依赖
首先,在 user-service 服务中,引入 nacos-config 的客户端依赖:
4.添加 bootstrap.yml 【其中必须是yaml】com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
然后,在 user-service 中添加一个 bootstrap.yml 文件,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
根据 spring.cloud.nacos.server-addr 获取 nacos地址,再根据
s
p
r
i
n
g
.
a
p
p
l
i
c
a
t
i
o
n
.
n
a
m
e
−
{spring.application.name}-
spring.application.name−{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
在这个例子例中,就是去读取 userservice-dev.yaml
在 user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置并使用:
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
//格式化时间
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
启动服务后,访问:http://localhost:8081/user/now
2、配置热更新我们最终的目的,是修改 nacos 中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
有两种方式:1. 用 @value 读取配置时,搭配 @RefreshScope;2. 直接用 @ConfigurationProperties 读取配置
方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope@RefreshScope
方式二:使用 @ConfigurationProperties 注解读取配置文件,就不需要加 @RefreshScope 注解。
@ConfigurationProperties
在 user-service 服务中,添加一个 PatternProperties 类,读取 patterrn.dateformat 属性
package cn.itcast.user.config;
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
public String dateformat;
}
-----controller------
package cn.itcast.user.web;
@Autowired
private PatternProperties patternProperties;
@GetMapping("now2")
public String now2(){
//格式化时间
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.dateformat));
}
3、配置共享
其实在服务启动时,nacos 会读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
这里的 [spring.application.name].yaml 不包含环境,因此可以被多个环境共享
添加一个环境共享配置:我们在 nacos 中添加一个 userservice.yaml 文件:
在 user-service 中读取共享配置
在 user-service 服务中,修改 PatternProperties 类,读取新添加的属性:
在 user-service 服务中,修改 UserController,添加一个方法:
修改 UserApplication2 这个启动项,改变其profile值:
这样,UserApplication(8081) 使用的 profile 是 dev
UserApplication2(8082) 使用的 profile 是test
启动 UserApplication 和 UserApplication2
访问地址:http://localhost:8081/user/prop,结果:
可以看出来,不管是 dev,还是 test 环境,都读取到了 envSharedValue 这个属性的值。
上面的都是同一个微服务下,那么不同微服务之间可以环境共享吗?
通过下面的两种方式来指定:
extension-configs
shared-configs
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
配置的优先级:
4、搭建Nacos集群
1. 搭建mysql集群并初始化数据库表
2. 下载解压nocos
3. 修改集群配置节点信息、数据库配置
第一:
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
4. 分别启动多个nacos节点第二:
然后修改application.properties文件,添加数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
然后分别修改三个文件夹中的application.properties,server.port=8845、46/47
5. nginx反向代理修改conf/nginx.conf文件,配置如下:
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
idea代码中application.yml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址



