服务注册与发现

  • 1.故事背景
  • 2.服务注册
  • 2.1服务注册原理
  • 2.2服务注册实现
  • 3服务发现
  • 3.1 服务发现原理
  • 3.2 服务发现实现
  • 3.3 @LoadBalanced注解
  • 总结提升

1.故事背景

上文我们讲到了Nacos的配置中心,介绍了什么是Nacos的配置中心,以及它的相关概念和使用方法。接下来我们来讲解Nacos的另外一个重要功能 服务注册与发现,本文将会从概念和实操两个方面,详细介绍如何使用Nacos的服务注册与发现

2.服务注册

在微服务架构中,服务提供者需要将自己的服务注册到服务注册中心,以便服务消费者能够发现并调用这些服务。Nacos作为服务注册中心,提供了服务注册的功能。

2.1服务注册原理

服务注册的原理如下:

  • 服务提供者启动时,将自己的服务实例信息(如服务名称、IP地址、端口号等)通过RESTful API方式发送给Nacos服务端。
  • Nacos服务端接收到服务提供者发送的注册请求后,将服务实例信息存储在注册中心的数据库中,同时将这些信息缓存到内存中,以便快速查询。
  • Nacos服务端将注册信息存储在两个地方:一个是持久化的存储(如MySQL、Derby等数据库),用于服务实例的持久化存储;另一个是内存中的缓存,用于快速的服务实例查询。
  • 注册成功后,服务提供者会定时向Nacos发送心跳请求,以表明自己的服务实例还在运行中。Nacos服务端根据心跳信息更新服务实例的状态,以便服务消费者能够获取到最新的服务实例信息。
  • 服务消费者通过Nacos服务端的RESTful API查询服务注册中心获取到最新的服务实例信息(如服务名称、IP地址、端口号等),从而能够调用服务提供者。

2.2服务注册实现

  1. 进入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.3.RELEASE</version>
</dependency>
  1. 配置Nacos地址,服务名,端口号
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos服务器地址
  application:
    name: service-provider # 服务名
server:
  port: 8080 # 端口号
  1. 使用@EnableDiscoveryClient注解,在服务注册项目的启动类上使用@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

3服务发现

在微服务架构中,服务消费者需要从服务注册中心获取服务提供者的信息,以便能够调用相应的服务。Nacos作为服务注册中心,提供了服务发现的功能。

3.1 服务发现原理

服务发现的原理如下:

  • 服务消费者启动时,通过RESTful API方式向Nacos服务端发送服务发现请求,请求包括服务名称、版本号、环境等信息。
  • Nacos服务端接收到服务发现请求后,从注册中心的缓存或持久化存储中查询符合请求条件的服务实例信息,并返回给服务消费者。
  • 服务消费者根据返回的服务实例信息,选择一个合适的服务提供者进行调用。Nacos还提供了负载均衡策略,可以根据配置的负载均衡算法进行服务实例的选择。
  • 服务消费者在调用服务提供者时,可以直接使用服务实例的网络地址(如IP地址、端口号)进行调用,从而实现服务间的通信。

3.2 服务发现实现

  1. 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId> <!-- 添加LoadBalancer的依赖 -->
</dependency>
  1. 配置nacos地址
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos服务器地址
  1. 使用@LoadBalanced注解在服务发现项目的业务逻辑中,使用@LoadBalanced注解来实现负载均衡
@RestController
public class MyController {
    @Autowired
    @LoadBalanced // 使用@LoadBalanced注解
    private RestTemplate restTemplate; // 使用RestTemplate进行服务调用

    @GetMapping("/get")
    public String getServiceUrl() {
        String result = restTemplate.getForObject("http://service-provider/get", String.class); // 使用服务名进行调用
        return result;
    }
}

3.3 @LoadBalanced注解

这里我们详细讲一讲@LoadBalanced注解,此注解的主要作用如下:

  • 负载均衡:@LoadBalanced注解用于开启Ribbon负载均衡功能,使得客户端在进行服务调用时可以自动选择具体的服务提供者进行负载均衡调用。通过负载均衡,可以将请求均匀地分发到多个服务提供者上,从而实现对多个服务实例的负载均衡。
  • 客户端负载均衡策略:@LoadBalanced注解可以用于指定客户端负载均衡策略。例如,可以使用@LoadBalanced注解的value属性来指定使用的负载均衡策略,如@LoadBalanced(value = “myLoadBalancer”),其中"myLoadBalancer"为自定义的负载均衡策略的名称。
  • 服务名称作为请求地址:当使用@LoadBalanced注解时,可以将服务名称作为请求地址,而不是具体的服务URL。这样,Ribbon会根据服务名称自动选择具体的服务实例进行负载均衡调用。例如,可以将请求地址设置为"http://service-provider/service-name",其中"service-provider"为服务名称,Ribbon会自动根据服务名称选择具体的服务实例进行请求。
  • 它可以帮助我们简化服务消费者中的负载均衡调用代码,提高系统的可扩展性和可用性。

总结提升

通过本篇文章相信您已经对Nacos服务注册与发现有了一定的了解。通过使用Nacos的服务注册与发现功能,可以方便地管理和调用微服务,提高了微服务架构的稳定性、可靠性和灵活性。快去按照我的代码去进行尝试吧!!