什么是Nacos
nacos是阿里巴巴集团开发一个服务发现、配置和管理的组件,相较于eureka,其功能更加强大,有服务健康监测、动态配置服务、动态 DNS 服务等功能。
Nacos实现
1、下载nacos服务端
其实nacos服务端就是一个jar包,去github下载就行,下载完后去bin目录运行。nacos默认的服务端口是8848,可以自己去配置中修改。
本机运行命令
startup.cmd -m standalone (要在管理员权限下启动)
2、客户端连接Nacos
首先导入nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改配置文件,配置服务名称和nacos服务器的地址。
spring:
cloud:
nacos:
discovery:
ephemeral: flase # 非临时实例
server-addr: localhost:8848
application:
name: userserver
Nacos根据集群负载均衡
在大型的公司中,一个userserver服务会对应多台服务器,这些服务器分配在全国各地,向华中地区,华北地区等等,华中地区的orderserver如果要访问userserver当然是访问本地的服务器这样延迟就会低好多。
1、划分集群
spring:
cloud:
nacos:
discovery:
cluster-name: huabei
2、开启nacos负载均衡策略
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
3、实现
开启三个userserver服务器,两个是huabei集群,一个是华中集群。
开启一个orderserver服务器,为huabei集群。
使用orderserver向userserver发起10次请求。结果是华huabei集群的两个userserver服务器都接受到了请求,但是huazhong集群的userserver没有接收到请求。
根据权重负载均衡
在nacos服务器端可以修改各个服务的权重,权重越高处理的请求也就越多。
由于服务器的性能不尽相同,可以给高性能的服务器分配较高的权重
Nacos服务健康监测
服务健康监测顾名思义就是监测这个服务器是否健康,能够正常工作。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
在nacos中的实例分为临时实例和持久实例,具体配置通过ephemeral参数实现。
- ephemeral为false时为持久实例,其健康监测模式是server模式,即服务端自动化检测,默认监测时间间隔为20s,当监测到实例关闭时,会设置实例为不健康状态,但是不会删除实例。
- ephemeral为true时是临时实例,对应client模式,客户端上传自己的健康状态给nacos,使用的是心跳的方式,每5s向nacos服务器发送一次健康次状态,当15s未发送将实例设置为不健康状态,超过30s删除实例。
环境隔离(namespace)
namespace用于环境隔离,不同namespace下的服务不能相互访问。
默认情况下具有一个public的命名空间,当然我们也可以自己创建命名空间。字节创建命名空间时有两个必填的信息。
- 命名空间名:和开发环境相关,如dev(开发)/test(测试)/prod(生产)
- 描述:描述就行了
- 命名空间ID:之后在application.yml中的spring.cloud.nacos.discovery.namespace中使用命名空间ID来指定命名空间,这个值要是唯一的。
在项目的配置文件中配置namespace。
nacos配置管理
在集群环境下nacos一个userserve服务就会有多个不同的服务器,这些服务器的配置需要得到统一的管理,如果挨个去修改会十分麻烦,而且每次修改配置都要重新启动服务器,这样十分麻烦,那么nacos就提供了统一配置管理和热更新的方式来解决这个问题。
nacos服务器中配置界面
现在有这样一种情况,一个游戏有中国服和日服。中国服和日服的语言包不一样但是版本是一样的。
1、导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、在nacos中添加配置文件
-
对所有userserver生效的配置文件:userserver.yaml($(spring.application.name).文件类型)
-
对特定环境生效的配置文件:userserver-chinese/japanese.yaml($(spring.application.name)-(profiles.active).文件类型)
3、在userserver服务中导入nacos配置
在springboot服务启动时,最先加载bootstrap.yaml配置文件,然后加载nacos中的配置文件,再加载application.yaml文件,最后生成spring容器并且创建bean。
所以对于服务的名称、环境、nacos服务的地址、nacos配置文件后缀名这些应该放在bootstrap.yaml配置文件中,这样注册的服务才能找到nacos服务器以及对应的配置文件。
bootstrap.yaml
spring:
application:
name: userserver #服务的名称
profiles:
active: chinese #环境
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
file-extension: yaml #后缀名
4、调用nacos配置文件内容
推荐用法创建一个NacosPatternProperties类专门来读取配置文件。
- NacosPatternProperties.class
@Component // 创建bean
@ConfigurationProperties(prefix = "pattern") //前缀名
@Data
public class NacosPatternProperties {
private String version; // 参数名称
private Boolean language_package; //参数名称
}
- 使用
@Resource
NacosPatternProperties nacosPatternProperties;
@GetMapping("/getProp")
public HashMap<String,Object> getProp(){
String language_package = nacosPatternProperties.getLanguage_package();
String version = nacosPatternProperties.getVersion();
HashMap<String,Object> map = new HashMap<>();
map.put("language_package",language_package);
map.put("version",version);
return map;
}
5、结果
profiles.active:chinese的服务
profiles.active:japanese的服务
7、热更新配置
nacos中的配置是热更新的,无需启动注册的服务就可以完成配置的更新。
在调用配置的类上面要加上@RefreshScope标签。