nacos 实例的示例代码

以下是基于 Nacos 的服务注册、发现以及通过实例名称进行通信的示例代码,结合了搜索结果中的信息

1. 服务提供者(注册到 Nacos)

服务提供者需要将自身信息注册到 Nacos Server,以便被其他服务发现。

引入依赖

在服务提供者的 pom.xml 文件中添加以下依赖:

xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件

application.yml 文件中配置 Nacos 的地址和服务名称:

yaml

server:
  port: 8081
spring:
  application:
    name: user-service  # 服务名称
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
示例接口

创建一个简单的 REST 接口:

java

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/info")
    public String getUserInfo() {
        return "User Info from user-service";
    }
}

2. 服务消费者(发现并调用服务)

服务消费者通过 Nacos 发现服务提供者的实例,并进行调用。

引入依赖

在服务消费者的 pom.xml 文件中添加相同的依赖:

xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件

application.yml 文件中配置 Nacos 的地址:

yaml

server:
  port: 8082
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
使用 RestTemplate 调用服务

使用 @LoadBalanced 注解结合 RestTemplate 实现服务发现和负载均衡:

java

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

@Service
public class UserServiceClient {
    @Autowired
    private RestTemplate restTemplate;

    public String getUserInfo() {
        String url = "http://user-service/user/info";  // 使用服务名称作为 URL
        return restTemplate.getForObject(url, String.class);
    }
}

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private UserServiceClient userServiceClient;

    @GetMapping("/info")
    public String getOrderInfo() {
        String userInfo = userServiceClient.getUserInfo();
        return "Order Info with User Data: " + userInfo;
    }
}

3. 手动使用 Nacos API 进行服务发现

如果需要更灵活地控制服务发现过程,可以使用 Nacos 提供的 Java API

java

try {
    // 创建 Nacos 服务发现客户端实例
    NamingService namingService = NacosFactory.createNamingService("127.0.0.1:8848");
    // 获取服务实例列表
    List<Instance> instances = namingService.getAllInstances("user-service");
    // 根据负载均衡策略选择一个实例
    Instance instance = selectInstance(instances);  // 自定义负载均衡策略
    // 构建请求 URL 并调用服务
    String url = "http://" + instance.getIp() + ":" + instance.getPort() + "/user/info";
    // 这里省略实际的 HTTP 调用代码
} catch (NacosException e) {
    e.printStackTrace();
}

4. 负载均衡策略

在上述代码中,selectInstance 方法可以根据需要实现不同的负载均衡策略,例如随机选择或轮询

java

public Instance selectInstance(List<Instance> instances) {
    int index = new Random().nextInt(instances.size());
    return instances.get(index);
}

5. 健康检查与动态更新

Nacos 会定期对服务实例进行健康检查,并动态更新实例列表.

服务消费者可以通过监听机制或定期轮询获取最新的实例列表,确保调用的实例是健康的。

通过以上代码示例,您可以实现基于 Nacos 的服务注册、发现以及通过实例名称进行通信的完整流程。