Nacos初探(3)-- 服务发现原理解析

上面已经大概了解了一下Nacos服务注册的逻辑,接下来来看看服务是如何被发现已经消费的。一、服务发现前目前在Spring Cloud,基本都是使用Feign去调用服务,Feign其实也是Ribbon的一个封装,主要功能,是将我们通常http请求服务这个过程帮我们封装起来,使我们使用时更加的简便,通过一个注解就能实现对服务的调用,对于ribbon的源码解析,参考这篇文章:https://...
摘要由CSDN通过智能技术生成

上面已经大概了解了一下Nacos服务注册的逻辑,接下来来看看服务是如何被发现已经消费的。

一、服务发现前

目前在Spring Cloud,基本都是使用Feign去调用服务,Feign其实也是Ribbon的一个封装,主要功能,是将我们通常http请求服务这个过程帮我们封装起来,使我们使用时更加的简便,通过一个注解就能实现对服务的调用,对于ribbon的源码解析,参考这篇文章:

https://blog.csdn.net/forezp/article/details/74820899

文章讲的非常清楚了,这里大概总结一下,ribbon最最底层也是实现spring cloud common包下的

org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList

接口,主要是ServiceInstanceChooser 下的继承接口:

org.springframework.cloud.client.loadbalancer.LoadBalancerClient

这是Ribbon实现负载均衡的父类接口,接下来一系列的接口实现最终会落到如何获取serverList这个问题是,答案在这个接口:

com.netflix.loadbalancer.ServerList

接下来,就是服务发现组件的事情了,比如,eureka对于这个接口的实现就是

DiscoveryEnabledNIWSServerList

而,Nacos的实现就是:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList,这也是我们的重点。

二、服务发现

上面主要是讲述了一下,服务发现的身世,Springcloud是如何走到获取服务列表这一步的,期间经过了ribbon的负载均衡,最后落到了Nacos的实现类NacosServerList中。来看代码

public class NacosServerList extends AbstractServerList<NacosServer> {

	@Autowired
	private NacosDiscoveryProperties discoveryProperties;

	private String serviceId;

	public NacosServerList() {
	}

	public NacosServerList(String serviceId) {
		this.serviceId = serviceId;
	}

	@Override
	public List<NacosServer> getInitialListOfServers() {
		return getServers();
	}

	@Override
	public List<NacosServer> getUpdatedListOfServers() {
		return getServers();
	}

	private List<NacosServer> getServers() {
		try {
			List<Instance> instances = discoveryProperties.namingServiceInstance()
					.getAllInstances(serviceId);
			return instancesToServerList(instances);
		}
		catch (Exception e) {
			throw new IllegalStateException(
					"Can not get service instances from nacos, serviceId=" + serviceId,
					e);
		}
	}

	private List<NacosServer> instancesToServerList(List<Instance> instances) {
		List<NacosServer> result = new ArrayList<>(instances.size());
		for (Instance instance : instances) {
			if (instance.isHealthy()) {
				result.add(new NacosServer(instance));
			}
		}

		return result;
	}

	public String getServiceId() {
		return serviceId;
	
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值