服务发现与注册

简介: 注册与发现

服务发现与注册,是注册中心吗?

是。

但注册中心只是 各微服务治理方案中服务发现与注册的实现而已。

比如 eureka,nacos,zk等都是可以作为 dubbo与 spring cloud 的注册中心。

现在聊一下spring cloud  中 服务的注册与发现的抽象:

AbstractAutoServiceRegistration

这是一个抽象类。

  1. 注入。

nacos中

@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)

public NacosAutoServiceRegistration nacosAutoServiceRegistration(

     NacosServiceRegistry registry,
     AutoServiceRegistrationProperties autoServiceRegistrationProperties,
     NacosRegistration registration) {

  return new NacosAutoServiceRegistration(registry,
        autoServiceRegistrationProperties, registration);
}

这个类通过@Bean 注入到spring 容器中。

  1. 启动

AbstractAutoServiceRegistration 实现了ApplicationListener接口,监听了WebServerInitializedEvent事件。源码如下:

public void onApplicationEvent(WebServerInitializedEvent event) {

   this.bind(event);
}

-->

public void bind(WebServerInitializedEvent event) {

   ApplicationContext context = event.getApplicationContext();
   if (!(context instanceof ConfigurableWebServerApplicationContext) || !"management".equals(((ConfigurableWebServerApplicationContext)context).getServerNamespace())) {

       this.port.compareAndSet(0, event.getWebServer().getPort());
       this.start();
   }

}

-->

public void start() {

   if (!this.isEnabled()) {

       if (logger.isDebugEnabled()) {

           logger.debug("Discovery Lifecycle disabled. Not starting");
       }


   } else {

       if (!this.running.get()) {

           this.context.publishEvent(new InstancePreRegisteredEvent(this, this.getRegistration()));
           this.register();
           if (this.shouldRegisterManagement()) {

               this.registerManagement();
           }


           this.context.publishEvent(new InstanceRegisteredEvent(this, this.getConfiguration()));
           this.running.compareAndSet(false, true);
       }


   }

}

  1. 注册

在上面的源码中。this.register() --> 就是服务的注册服务。

this.register()

-->this.serviceRegistry.register(this.getRegistration());

其中 serviceRegistry 的接口定义如下:

public interface ServiceRegistry<R extends Registration> {

   void register(R registration);

   void deregister(R registration);

   void close();

   void setStatus(R registration, String status);

   <T> T getStatus(R registration);
}

该接口具体的实现在各个注册中心中。已nacos为例为:NacosServiceRegistry。各个注册中心的实现不一样,请查看注册中心源码。

4.发现。

服务发现以springcloudalibaba为例:

在springboot启动时,注入了一个配置类

DubboServiceDiscoveryAutoConfiguration其中有一个方法实现了对HeartbeatEvent事件的监听

-->

@EventListener(HeartbeatEvent.class)

public void onHeartbeatEvent(HeartbeatEvent event) {

      ...//省略
           List<ServiceInstance> serviceInstances = getInstances(serviceName);      ...//省略
}

-->该方法调用了spring cloud的统一服务类DscoveryClient类中的服务发现接口

private List<ServiceInstance> getInstances(String serviceName) {

  return discoveryClient.getInstances(serviceName);
}

-->

假如配置的nacos为服务注册中心,那么实现类为 NacosDiscoveryClient。

那么 这个HeartbeatEvent事件由谁发布的呢?

NacosDiscoveryClientConfiguration的配置类中,注入了一个配置类

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled",
     matchIfMissing = true)

public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties,
     ObjectProvider<TaskScheduler> taskScheduler) {

  return new NacosWatch(nacosDiscoveryProperties, taskScheduler);
}

-->NacosWatch类中有一个方法

@Override
public void start() {

  if (this.running.compareAndSet(false, true)) {

     this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(

           this::nacosServicesWatch, this.properties.getWatchDelay());
  }

}

-->

public void nacosServicesWatch() {


  // nacos doesn't support watch now , publish an event every 30 seconds.
  this.publisher.publishEvent(

        new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement()));

}

这个类实现了SmartLifecycle接口(当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应的方法(start()方法))


因此,nacos的服务发现是在spring容器加载为所有bean之后,通过NacosWatch发布HeartbeatEvent 事件,DubboServiceDiscoveryAutoConfiguration中的中实现监听这个事件来完成的。



剧终!!!



参考:https://blog.csdn.net/qq_42651904/article/details/121876171





相关文章
|
监控 Java 对象存储
解密微服务注册中心:深入了解Eureka
在现代软件开发中,微服务架构已经成为一种流行的方式来构建可扩展、灵活和可维护的应用程序。然而,要使微服务体系结构正常运行,必须有一种方法来有效地管理和监控微服务的部署和通信。这就是微服务注册中心的作用,而Eureka正是其中一种备受欢迎的选择。
|
存储 缓存 负载均衡
微服务注册中心 Eureka解析
随着时代的发展,应用服务的架构也随之进行不停的变迁,从单一的架构到面向服务的SOA、以及正在流行的微服务架构,甚至正在火热的服务网格,无论何种架构,适合于技术的需要以及业务的发展才是最重要的。因此,无论是以Spring Cloud和Dubbo第一代的微服务框还是以Service Mesh下一代的微服务框架,对于服务的治理仍然是微服务架构中最核心、最重要的一部分,服务治理最基础的组件是注册中心。
163 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
负载均衡 监控 算法
Eureka的作用、搭建Eureka注册中心、服务注册及服务发现
Eureka的作用、搭建Eureka注册中心、服务注册及服务发现
123 0
|
开发框架 Dubbo 网络协议
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
2146 0
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
|
负载均衡 Java 数据库连接
搭建Eureka注册中心集群 ,实现负载均衡
问题:微服务RPC远程服务调用最核心的是什么 高可用,试想你的注册中心只有一个only one, 它出故障了那就呵呵( ̄▽ ̄)"了,会导致整个为服务环境不可用,所以 解决办法:搭建Eureka注册中心集群 ,实现负载均衡+故障容错
搭建Eureka注册中心集群 ,实现负载均衡
|
SpringCloudAlibaba 负载均衡 Java
【微服务】- Nacos - 注册中心
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。
227 0
【微服务】- Nacos - 注册中心
|
负载均衡 算法 Java
SpringCloud真不难—Eureka注册中心、Ribbon负载均衡、Nacos注册中心(二)
SpringCloud真不难—Eureka注册中心、Ribbon负载均衡、Nacos注册中心(二)
400 0
SpringCloud真不难—Eureka注册中心、Ribbon负载均衡、Nacos注册中心(二)
下一篇
无影云桌面