栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

第五节:Nacos服务搭建和负载均衡规则

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第五节: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文件

        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            2.2.7.RELEASE
            pom
            import
        
3.2 引入服务发现jar包

在user-service和order-service去除eureka,添加nacos


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

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 instances = namingService.selectInstances(name, group, true);
			if (CollectionUtils.isEmpty(instances)) {
				LOGGER.warn("no instance in service {}", name);
				return null;
			}

			List instancesToChoose = instances;
			if (StringUtils.isNotBlank(clusterName)) {
				List 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的机器中随机返回一个。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号