【Spring Cloud Alibaba】Nacos的服务注册和发现(discovery)的使用

499 阅读7分钟

【Spring Cloud Alibaba】系列文章

标题链接
【Spring Cloud Alibaba】Nacos的安装与介绍以及Nacos集群的安装masiyi.blog.csdn.net/article/det…
【Spring Cloud Alibaba】Nacos config的使用和高阶用法masiyi.blog.csdn.net/article/det…
【Spring Cloud】Gateway的配置与使用masiyi.blog.csdn.net/article/det…
【Spring Cloud Alibaba】OpenFeign的使用masiyi.blog.csdn.net/article/det…

上次我们讲了Nacos的Config,这次我们讲Nacos的服务注册和发现

Nacos是一个开源的分布式系统服务发现、配置管理和服务管理平台。它提供了服务注册和发现功能,使得在分布式系统中可以方便地实现服务之间的通信和调用。

服务注册是指将服务实例的信息注册到Nacos服务器上,以便其他服务或客户端能够发现和调用它。在Nacos中,服务提供者通过向Nacos注册中心发送注册请求,将自己的服务实例信息(如IP地址、端口号、健康状态等)注册到注册中心上。注册中心将这些信息存储起来,并提供查询接口供其他服务或客户端使用。

服务发现是指服务消费者通过查询Nacos注册中心获取可用的服务实例信息,从而实现服务的调用。服务消费者可以通过Nacos提供的API或客户端库进行服务发现,根据自己的需求和策略从注册中心获取到合适的服务实例信息,然后进行服务调用。

Nacos的服务注册和发现具有以下特点:

  1. 动态性:Nacos支持服务实例的动态注册和注销,当服务实例上线或下线时,Nacos能够及时更新注册中心的信息。
  2. 健康检查:Nacos能够通过定期的健康检查来判断服务实例的状态,如果服务实例异常或不可用,Nacos会将其从注册中心中移除,以保证其他服务不会调用到不可用的服务。
  3. 多环境支持:Nacos支持多环境的服务注册和发现,可以将不同环境(如开发环境、测试环境、生产环境)的服务实例信息分开管理。
  4. 服务路由与负载均衡:Nacos支持服务路由和负载均衡策略的配置,可以根据需求将请求分发到不同的服务实例上,实现负载均衡和服务治理。

总结来说,Nacos的服务注册和发现功能提供了一种简单可靠的方式来管理和调用分布式系统中的服务。它能够方便地实现服务之间的通信和调用,并提供了动态性、健康检查、多环境支持以及路由与负载均衡等特性,帮助开发人员构建可靠的分布式系统。

Nacos的服务注册和发现用到的组件是discovery

代码链接 https://gitee.com/WangFuGui-Ma/spring-cloud-alibaba/tree/master/nacos/discovery

🙈第一步,导入jar包

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>

spring-cloud-starter-alibaba-nacos-discovery是有两个groupId的,一个是spring官方的,一个是阿里巴巴的,用哪个都可以

在这里插入图片描述

🙈第二步,编写生产者

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {


    @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
        return "Hello Nacos Discovery " + string;
    }

}

这是一个使用Nacos的服务注册和发现功能的示例代码,其中提供了一个RESTful接口 /echo/{string},用于返回一个带有字符串参数的消息。

在这段代码中,使用了@RestController注解将该类声明为一个RESTful控制器,@RequestMapping注解用于指定请求映射路径和请求方法。

接口的路径为/echo/{string},其中{string}是一个路径变量,可以通过@PathVariable注解获取到URL中的参数值。

方法echo()接收一个字符串参数string,并将其拼接到返回的消息中。

当该服务实例启动并成功注册到Nacos注册中心后,其他服务或客户端就可以通过Nacos的服务发现功能,找到并调用该接口,获取返回的消息。

这样,通过Nacos的服务注册和发现功能,可以实现服务之间的动态通信和调用。

🙈第三步,生产者启动类


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author masiyi
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(NacosProviderApplication.class, args);
	}

}

添加@EnableDiscoveryClient注解,以支持服务发现

  • @EnableDiscoveryClient 是 Spring Cloud 提供的注解之一,用于启用服务发现功能,并将当前应用程序注册为服务提供者或服务消费者。使用该注解后,应用程序就可以通过服务注册中心发现和访问其他注册的服务。
  • 如果您的应用程序使用 Spring Cloud Netflix Eureka 或 Consul 作为服务注册中心,则必须在应用程序的启动类上添加 @EnableDiscoveryClient 注解,以启用服务发现功能。
  • 但是,如果您使用的是其他的服务注册中心,例如 Spring Cloud Alibaba Nacos,那么不需要添加 @EnableDiscoveryClient 注解,因为 Spring Cloud Alibaba 的服务发现客户端已经实现了自动配置和自动注册。在这种情况下,即使不添加 @EnableDiscoveryClient 注解,应用程序也可以通过 Nacos 发现和访问其他注册的服务。
  • 因此,如果您使用的是 Spring Cloud Alibaba Nacos 作为服务注册中心,并且已经将 spring-cloud-starter-alibaba-nacos-discovery 依赖添加到应用程序中,则不需要显式添加 @EnableDiscoveryClient 注解。

生产者application.yml

spring:
  application:
    name: service-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

server:
  port: 8071

🙈第四步,编写消费端

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    private final RestTemplate restTemplate;

    @Autowired
    public ConsumerController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }
}

在这段代码中,使用了@RestController注解将该类声明为一个RESTful控制器。构造函数中注入了RestTemplate实例。

echo()方法用于向服务提供者发送GET请求,并通过RestTemplategetForObject()方法获取到服务提供者返回的消息。请求的URL是通过拼接字符串http://service-provider/echo/{str}构建的,其中service-provider是服务提供者的注册名,{str}是路径变量,它会被传递给服务提供者的接口作为参数。

通过Nacos的服务注册和发现功能,RestTemplate会自动从注册中心获取服务提供者的实例地址,并将请求发送到其中一个实例上。这样,消费者就可以通过调用该控制器的接口,间接调用服务提供者的接口,实现了服务之间的通信。

🙈第五步,消费端启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author xiaojing
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

	@LoadBalanced
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(NacosConsumerApplication.class, args);
	}


}

消费端application.yml

spring:
  application:
    name: service-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

server:
  port: 8081

🙈第六步,依次启动生产端和消费端

访问消费端的接口

http://localhost:8081/echo/你好

在这里插入图片描述

当你访问消费端的接口http://localhost:8081/echo/你好时,会触发ConsumerController中的echo()方法。

这个方法会使用RestTemplate来发送GET请求到服务提供者的接口。请求的URL会被构建为http://service-provider/echo/你好,其中service-provider是服务提供者的注册名,你好是路径变量。

通过Nacos的服务注册和发现功能,RestTemplate会自动从注册中心获取服务提供者的实例地址,并将请求发送到其中一个实例上。服务提供者接收到请求后,会返回Hello Nacos Discovery 你好作为响应。

因此,当你访问消费端的接口时,你会在浏览器或其他HTTP客户端中看到返回的结果是Hello Nacos Discovery 你好。这表明消费端成功调用了服务提供者的接口,并获取到了正确的响应。

Nacos官网地址: https://nacos.io/zh-cn/docs/quick-start.html

Nacos作为一个服务注册和发现的组件,为微服务架构提供了便捷的服务管理和调用机制。在本文中,我们通过一个简单的示例演示了Nacos的服务注册和发现的过程。

在这里插入图片描述