nacos解析-基于spring cloud的服务注册原理

本文基于nacos-2.0.3版本

前面文章介绍了nacos的配置管理,从本文开始介绍nacos的服务注册与发现。
下面的网页详细介绍了如何基于spring cloud实现服务注册与发现:

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

通过上面网页的介绍,可以知道,nacos的服务注册最关键的是注解@EnableDiscoveryClient,本文接下来以该注解为起点,介绍服务注册原理。

1、@EnableDiscoveryClient

EnableDiscoveryClient的代码很简单,引入了EnableDiscoveryClientImportSelector类,还有一个配置是否自动注册服务的属性,默认为true。

@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
	/**
	 * If true, the ServiceRegistry will automatically register the local server.
	 * @return - {@code true} if you want to automatically register.
	 */
	boolean autoRegister() default true;
}

接下来看一下EnableDiscoveryClientImportSelector类的原理。

2、EnableDiscoveryClientImportSelector

EnableDiscoveryClientImportSelector也比较简单,它检查了EnableDiscoveryClient的autoRegister属性值,如果是true,则引入AutoServiceRegistrationConfiguration类。

		boolean autoRegister = attributes.getBoolean("autoRegister");
		if (autoRegister) {
			List<String> importsList = new ArrayList<>(Arrays.asList(imports));
			importsList.add(
					"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
			imports = importsList.toArray(new String[0]);
		}
		else {
			Environment env = getEnvironment();
			if (ConfigurableEnvironment.class.isInstance(env)) {
				ConfigurableEnvironment configEnv = (ConfigurableEnvironment) env;
				LinkedHashMap<String, Object> map = new LinkedHashMap<>();
				map.put("spring.cloud.service-registry.auto-registration.enabled", false);
				MapPropertySource propertySource = new MapPropertySource(
						"springCloudDiscoveryClient", map);
				configEnv.getPropertySources().addLast(propertySource);
			}
		}

3、AutoServiceRegistrationConfiguration

AutoServiceRegistrationConfiguration类仅仅用于激活配置类AutoServiceRegistrationProperties。
AutoServiceRegistrationProperties用于配置服务是否自动注册等,配置的前缀是spring.cloud.service-registry.auto-registration

与配置相关的类还有一个是NacosDiscoveryProperties,该类用于配置nacos的基本信息,比如服务权重,服务名,服务地址,group,心跳间隔时间等,配置前缀是spring.cloud.nacos.discovery

4、NacosServiceRegistry

当web容器启动完毕后,会发布WebServerInitializedEvent事件。而NacosAutoServiceRegistration负责监听该事件。监听到事件后,将启动服务注册。服务注册调用NacosAutoServiceRegistration.register()方法。

NacosAutoServiceRegistration继承了抽象类AbstractAutoServiceRegistration,监听事件其实是这个抽象类做的,该抽象类提供了处理事件以及注册服务的方法,子类可以重写抽象类的方法,以完成特殊处理。

register()方法里面接着调用NacosServiceRegistry.register()方法。

NacosServiceRegistry负责注册/注销服务,设置或者查询服务状态是否正常。

下面是NacosServiceRegistry.register()方法的代码:

	//Registration表示nacos服务端实例,保存了服务端的IP、端口、服务权重等
	public void register(Registration registration) {
		//代码删减
		//获取NamingService
		//NamingService相当于nacos的客户端
		NamingService namingService = namingService();
		//serviceId是应用名,可以使用spring.application.name或者spring.cloud.nacos.discovery.service指定
		String serviceId = registration.getServiceId();
		//默认是DEFAULT_GROUP
		String group = nacosDiscoveryProperties.getGroup();
		//创建nacos实例对象,代表了服务端实例
		Instance instance = getNacosInstanceFromRegistration(registration);

		try {
			//注册服务
			namingService.registerInstance(serviceId, group, instance);
			log.info("nacos registry, {} {} {}:{} register finished", group, serviceId,
					instance.getIp(), instance.getPort());
		}
		catch (Exception e) {
			//代码删减
		}
	}

register()方法里面调用namingService对象向服务端注册服务。
namingService也就是NacosNamingService对象,NacosNamingService相当于nacos提供给应用程序使用的客户端,可以通过注解的方式在应用程序中直接获得实例。通过NacosNamingService可以完成对服务的管理。
NacosNamingService支持集群注册,如果配置了多个nacos服务器地址,NacosNamingService遍历每个地址,并向其注册服务,如果其中有一个没有注册成功,那么会调用该地址,继续向下一个地址注册。
NacosNamingService底层与配置管理一样,也是使用RESTful风格将数据发送到服务端。

注册服务的url地址为:
http://127.0.0.1:8848/nacos/v1/ns/instance/
方法:POST

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。 动态配置服务 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。 Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。 动态 DNS 服务 动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。 Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表. 服务及其元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值