第五节:Nacos服务搭建和负载均衡规则
1、认识NacosNacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。2、安装参照官网:https://nacos.io/zh-cn/docs/quick-start.html0.版本选择您可以在Nacos的release notes及博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为2.0.3。1.预备环境准备Nacos
1、认识Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
2、安装
参照官网:https://nacos.io/zh-cn/docs/quick-start.html
0.版本选择
您可以在Nacos的release notes及博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为2.0.3。
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
2.下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
从 Github 上下载源码方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
下载编译后压缩包方式
您可以从 最新稳定版本 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
4.服务注册&发现和配置管理
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
5.关闭服务器
Linux/Unix/Mac
sh shutdown.sh
Windows
shutdown.cmd
或者双击shutdown.cmd运行文件。
效果:
登录账号密码默认都是nacos
3、服务注册发现
3.1 添加SpringCloudAlibaba依赖管理
最外层pom文件
<!-- nacos依赖关系-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
3.2 引入服务发现jar包
在user-service和order-service去除eureka,添加nacos
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3 配置
去除eureka配置,添加nacos配置
spring:
cloud:
nacos:
server-addr: 192.168.0.105:8848
3.4 启动项目
4、服务多级存储模型
nacos会将服务划分层级,第一级是组、二级是服务、第三级是集群、第四级是实例。
比如通过一个服务划分为不同的组,每个组下的服务可以按地区划分为不同的集群。这样,nacos会优先调用相同组下相同集群的服务。
4.2 配置集群
spring:
cloud:
nacos:
server-addr: 192.168.0.105:8848
discovery:
cluster-name: BJ #集群名称
userservice下有2个集群,分别是sh和BJ
4.3 验证
orderservice也配置为sh集群。
设置负载均衡策略:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
然后验证,所有的请求都打到了相同的集群下。
5、Nacos负载均衡规则
同样的使用的是Ribbon的规则,不过Nacos实现了自己的类。继承自AbstractLoadBalancerRule
主要方法如下:
@Override
public Server choose(Object key) {
try {
String clusterName = this.nacosDiscoveryProperties.getClusterName();
String group = this.nacosDiscoveryProperties.getGroup();
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = loadBalancer.getName();
NamingService namingService = nacosServiceManager
.getNamingService(nacosDiscoveryProperties.getNacosProperties());
List<Instance> instances = namingService.selectInstances(name, group, true);
if (CollectionUtils.isEmpty(instances)) {
LOGGER.warn("no instance in service {}", name);
return null;
}
List<Instance> instancesToChoose = instances;
if (StringUtils.isNotBlank(clusterName)) {
List<Instance> sameClusterInstances = instances.stream()
.filter(instance -> Objects.equals(clusterName,
instance.getClusterName()))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(sameClusterInstances)) {
instancesToChoose = sameClusterInstances;
}
else {
LOGGER.warn(
"A cross-cluster call occurs,name = {}, clusterName = {}, instance = {}",
name, clusterName, instances);
}
}
Instance instance = ExtendBalancer.getHostByRandomWeight2(instancesToChoose);
return new NacosServer(instance);
}
catch (Exception e) {
LOGGER.warn("NacosRule error", e);
return null;
}
}
1、可以看出,nacos会先找到同组下的实例
2、如果没有同组的服务,那么就返回null
2、有同组的服务,然后在同组下实例中选择相同cluster的实例。
3、如果没有相同cluster的服务,那么就用同组下的随机返回一个
4、有同cluster的服务,就用相同cluster的机器中随机返回一个。
6、Nacos使用权重负载均衡
服务启动后,在详情中点击编辑,修改权重。
比如,8081端口的权重修改为10,其他两个修改为1, 那么启动后被访问的概率就是10:1:1
总结
Nacos控制台可以设置实例的权重值,权重越高被访问的频率越高,权重设置为0则完全不会被访问。
7、Nacos环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
比我我们生产环境,开发环境,测试环境,为了防止互相访问,需要做环境隔离。
7.1 新建namespace
新建dev表示开发环境。
7.2 修改项目的namespace
cloud:
nacos:
server-addr: 192.168.0.105:8848
discovery:
cluster-name: sh
namespace: 8924617a-1794-4b76-9e56-120e1a7c05dc #dev
7.3 启动服务
全部到了dev环境下。
7.3 总结:
每个namespace都有唯一id,服务设置namespace时要写id而不是名称,不同namespace下的服务互相不可见。
8、Nacos注册中心
消费者
nacos服务消费者不是每次请求都会去注册中心拉取服务列表,会定时30s拉取一次,然后缓存到本地。
服务提供者列表发生变更还会有主动推送。
提供者
服务提供者会划分为临时实例和非临时实例,默认是临时实例
临时实例会采用心跳检测30s,不可访问则会主动剔除。
非临时实例naocs注册中心会主动询问,不可访问也不会主动剔除。
通过ephemeral来设置
cloud:
nacos:
server-addr: 192.168.0.105:8848
discovery:
cluster-name: sh #集群名称
namespace: 8924617a-1794-4b76-9e56-120e1a7c05dc
ephemeral: false #true 临时 false 非临时
9、Nacos和Eureka比较
共同点:
1、都支持服务注册和服务拉取
2、都支持服务提供者心跳方式做健康检测
不同点:
1、Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
2、临时实例心跳不正常会被剔除,非临时实例则不会被剔除
3、Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
4、Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
更多推荐
所有评论(0)