使用Nacos作为分布式注册中心,实现服务注册与发现

上篇博文我们介绍了Nacos的基本概念以及进行了安装,相信大家已经对Nacos有了基本认识,其实说白了Nacos就是分布式注册中心和分布式配置中心的集合体。这篇博文我们介绍Nacos的第一个特性,服务的注册与发现,也就是分布式注册中心的核心功能。

什么是服务注册与发现

服务注册与发现是来自于微服务架构的产物。在传统的架构系统中,服务的数量较少,一般使用静态配置的方式实现服务信息的配置。而伴随着微服务架构的发展,服务实例的数量和网络地址都是动态变化的,此时对系统运维提出了巨大的挑战。面对成百上千的服务实例,为保障系统能够正常的运行,必须需要有一个中心化的组件来完成对各个服务的整合、管理等。服务提供者能够通过注册中心注册服务,服务消费者通过注册中心调用服务,完成整个请求调用。

在微服务架构中服务注册与发现组件是必不可少的,常用的服务协调器有:Eureka、Zookeeper、Etcd,Consule等。相信大家对其中一些组件有一定的认识,甚至使用经验。

服务注册与发现的原理

服务注册与发现是是针对于三大角色的:①:服务提供者 ②:服务消费者 ③:注册中心

针对他们之间的关系描述就是服务的注册与发现的运行原理:

1、各微服务在服务启动的时候,服务提供者将服务的网络地址(IP地址和端口),服务名称,服务自身状态以及访问协议等信息注册到注册中心,注册中心存储该数据
2、服务消费者从注册中心查询到服务提供者的实例信息,并通过该地址调用服务提供者的接口
3、各个微服务与注册中心通过一定的机制通信(例如心跳检测机制),如果注册中心与某微服务长时间无法通信,就会注销该实例,即该服务对应的实例会被注册中心剔除
4、微服务网络地址发生变化(例如增加实例或IP变动等),会重新注册到注册中心,这样,服务消费者就无需人工修改提供者的网络地址了

如下图所示:

在这里插入图片描述

了解了服务注册与发现的原理,我们看一下nacos是如何实现的服务注册与发现。

服务注册

创建项目

我们先了解一下 Spring Cloud 应用如何接入 Nacos Discovery。

  1. 首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。

     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
     </dependency>
    
  2. 在nacos-discovery-provider8081 项目的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址

     spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
  3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

     @SpringBootApplication
     @EnableDiscoveryClient
     public class ProviderApplication {
    
     	public static void main(String[] args) {
     		SpringApplication.run(Application.class, args);
     	}
     }
    
  4. 完成以上配置后,编写Controller

   @RestController
   public class HelloWorldController {
   
       @GetMapping("/hello")
       public String hello() {
           return "hello Nacos Discovery";
       }
   }

5.启动应用,支持 IDE 直接启动和编译打包后启动。

  1. IDE直接启动:找到 nacos-discovery-provider8081项目的主类 ProviderApplication,执行 main 方法启动应用。
  2. 打包编译后启动:在 nacos-discovery-provider8081 项目中执行 mvn clean package 将工程编译打包,然后执行 java -jar nacos-discovery-provider8081.jar启动应用。

验证

验证之前,我们需要启动nacos服务,以及服务提供者,例如:

在这里插入图片描述

此时我们可以看到,nacos-discovery-provider已经成功注册到nacos了。

Nacos管理页面查看我们的服务

在这里插入图片描述

Nacos接口查询服务

我也可以通过Nacos提供的接口的查询服务。在浏览器中输入此地址 http://127.0.0.1:8848/nacos/v1/ns/catalog/instances?serviceName=nacos-discovery-provider&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=,并点击跳转,可以看到服务节点已经成功注册到 Nacos Server。

在这里插入图片描述

通过管理页面以及接口返回的信息,我们可以看到服务注册中心保存了服务提供者的哪些相关信息。

服务发现

创建项目

  1. 首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。

     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
     </dependency>
    
  2. 在nacos-discovery-consumer8082 项目的 /src/main/resources/application.properties 配置文件中添加基本配置信息

    server.port=8082
    spring.application.name=nacos-discovery-consumer
    
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
  3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }
    
  4. 完成以上配置后,编写TestController。

@RestController
public class TestController {

    @Autowired
    LoadBalancerClient loadBalancerClient;

    @GetMapping("/test")
    public String test() {
        // 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");
        String url = serviceInstance.getUri() + "/hello/" + "xiaoliang";
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(url, String.class);
    }
}
  1. 启动应用,支持 IDE 直接启动和编译打包后启动。

    1. IDE直接启动:找到 nacos-discovery-consumer8082 项目的主类 ConsumerApplication,执行 main 方法启动应用。

    2. 打包编译后启动:在 nacos-discovery-consumer8082 项目中执行 mvn clean package 将工程编译打包,然后执行 java -jar nacos-discovery-consumer8082.jar启动应用。

验证

  1. 同上,在Nacos管理页面同样可以看到我们服务消费者,不再贴图

  2. 在浏览器地址栏中输入 http://127.0.0.1:8082/test,点击跳转,可以看到浏览器显示了 nacos-discovery-provider8081 返回的消息 “Hello xiaoliang , Welcome to Nacos Discovery!!!”,证明服务已经生效。

在这里插入图片描述

总结

1、nacos实现服务的注册与发现非常的简单,只需要引入jar包,并配置nacos服务地址即可。

2、服务消费者调用服务提供者时,我们是通过LoadBalancerClient接口来获取的服务实例。下篇博文,我们解锁多种服务调用的姿势,并对服务的负载均衡进行深入的介绍。

代码示例

本文示例读者可以通过查看下面仓库的中的nacos-discovery-provider8081nacos-discovery-consumer8082项目:

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章