Bootstrap

【第5章】Spring Cloud之Nacos服务注册和服务发现


前言

本节通过实现一个简单的 echo service 演示如何在您的 Spring Cloud 项目中启用 Nacos 的服务注册和发现功能,如下图示:
在这里插入图片描述


一、提供者

1. 引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.配置 Nacos Server 地址

${NACOS_SERVER_ADDR}是配置的环境变量

server:
  port: 9002
spring:
  application:
    name: provider-service
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR}
        username: nacos
        password: nacos

在使用 Nacos 服务发现和配置功能时,一定要配置 username 和 password 属性,否则会出现用户未找到异常!

3. 开启服务注册

package org.example.nacos.provider;

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

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryProviderApplication {

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

}

二、消费者

1. 引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.配置 Nacos Server 地址

server:
  port: 9000
spring:
  application:
    name: consumer-service
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR}
        username: nacos
        password: nacos

3. 开启服务注册

package org.example.nacos.consumer;

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

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryConsumerApplication {

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

}

三、服务列表

在这里插入图片描述

四、服务发现

1. 获取服务列表

我们在消费者项目中获取nacos中的服务列表,并打印出来。

package org.example.nacos.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

/**
 * Create by zjg on 2024/7/15
 */
@RequestMapping("/nacos/")
@RestController
public class NacosDiscoveryController {
    @Autowired
    DiscoveryClient discoveryClient;
    @RequestMapping("discovery")
    public void discovery(){
        List<String> services = discoveryClient.getServices();
        services.forEach(System.out::println);
    }
    @RequestMapping("discovery/instance")
    public void discovery(@RequestParam("serviceId") String serviceId){
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
        instances.forEach(instance->{
            System.out.println(instance.getHost()+":"+instance.getPort());
        });
    }
}

新版本的@RequestParam(“serviceId”),用法略有改动,更加规范了,但是没那么灵活对开发者不是很友好!

2. 测试

2.1 获取所有服务

http://localhost:9000/nacos/discovery

consumer-service
provider-service

2.2 根据服务名获取服务信息

http://localhost:9000/nacos/discovery/instance?serviceId=provider-service

192.168.0.103:9002

五、更多配置项

配置项key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addr
服务名spring.cloud.nacos.discovery.service${spring.application.name}注册到Nacos上的服务名称,默认值为应用名称
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的IP地址类型spring.cloud.nacos.discovery.ip-type双栈地址可以配置IPv4和IPv6两种类型,如果网卡同类型IP地址存在多个,希望制定特定网段地址,可使用spring.cloud.inetutils.preferred-networks配置筛选地址
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key
SecretKeyspring.cloud.nacos.discovery.secret-key
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT Nacos集群名称
接入点spring.cloud.nacos.discovery.endpoint地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成LoadBalancerspring.cloud.loadbalancer.nacos.enabledfalse
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledfalse可以设置成true来开启 watch
是否启用Nacosspring.cloud.nacos.discovery.enabledtrue默认启动,设置为false时会关闭自动向Nacos注册的功能
用户名spring.cloud.nacos.discovery.usernamenacos
密码spring.cloud.nacos.discovery.passwordnacos

总结

回到顶部
中文文档
官方案例

;