Nacos服务注册和发现

发布于:2025-02-11 ⋅ 阅读:(75) ⋅ 点赞:(0)

Nacos服务注册和发现

1. Nacos服务注册

服务提供者将服务注册到nacos注册中心

  • 引入依赖
  • 配置Nacos地址
  • 重启

1.1 引入依赖

在pom.xml中引入Nacos依赖

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.2 配置Nacos

application.yml中添加nacos地址配置:

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.1.100:8848 # nacos地址

1.3 重启服务

服务在启动时,自动注册Nacos.

在这里插入图片描述

1.4 Nacos后台

在这里插入图片描述

2. Nacos服务发现

2.1 引入依赖

        <!--nacos 服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2.2 配置Nacos

application.yml中添加nacos地址配置:

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.1.100:8848 # nacos地址

2.3 服务发现

通过DiscoveryClient实现服务发现:

private void handleCartItems(List<CartVO> vos) {

        // 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
    	// 2.查询商品
        //2.1 服务发现:通过服务名称,获取服务实例
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
        if (CollUtils.isEmpty(instances)) {
            return;
        }
        //2.2服务发现:通过随机算法负载均衡获取调用的服务实例
        ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));

        //2.3通过RestTemplate发起http请求,得到http响应
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                serviceInstance.getUri()+"/items?ids={ids}",//服务发现:请求路径
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },
                Map.of("ids", CollUtils.join(itemIds, ","))
        );
        if (!response.getStatusCode().is2xxSuccessful()) {
            return;
        }
        List<ItemDTO> items = response.getBody();
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);
        if (CollUtils.isEmpty(items)) {
            return;
        }
        // 3.转为 id 到 item的map
        Map<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));
        // 4.写入vo
        for (CartVO v : vos) {
            ItemDTO item = itemMap.get(v.getItemId());
            if (item == null) {
                continue;
            }
            v.setNewPrice(item.getPrice());
            v.setStatus(item.getStatus());
            v.setStock(item.getStock());
        }
    }