Nacos 注册中心

Nacos 注册中心

docker 示例

  • 运行mysql, 先执行 nacos.sql

  • 运行 docker-compose
  • custom.env 配置数据库
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=192.168.150.101
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
  • docker compose -f docker-compose.yml up -d
version: "3.8"


services:

  mysql:

    image: mysql

    container_name: mysql

    ports:

      - "3306:3306"

    environment:

      TZ: Asia/Shanghai

      MYSQL_ROOT_PASSWORD: 123

    volumes:

      - "./mysql/conf:/etc/mysql/conf.d"

      - "./mysql/data:/var/lib/mysql"

      - "./mysql/init:/docker-entrypoint-initdb.d"

    networks:

      - hm-net

  hmall:

    build:

      context: .

      dockerfile: Dockerfile

    container_name: hmall

    ports:

      - "8080:8080"

    networks:

      - hm-net

    depends_on:

      - mysql

  nginx:


    image: nginx

    container_name: nginx

    ports:

      - "18080:18080"

      - "18081:18081"

    volumes:

      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"

      - "./nginx/html:/usr/share/nginx/html"

    depends_on:

      - hmall

    networks:

      - hm-net


  nacos:

    image: nacos/nacos-server:v2.1.0-slim

    container_name: nacos2

    env_file:

      - ./nacos/custom.env

    ports:

      - 8848:8848

      - 9848:9848

      - 9849:9849

    restart: always

    networks:

      - hm-net

networks:

  hm-net:

    name: hmall
  • 用户名密码 nacos:nacos

springboot 使用

  • 引入依赖
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
</dependency>
  • 设置配置地址

  • 服务发现
  • 示例
// 1.获取商品id  
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());  

        // 2.1 根据服务名称获取服务实例列表  
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");  
        if(instances.isEmpty()){  
            return;  
        }  
        // 2.2 根据策略选择一个实例  
        ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));  

        // 2.查询商品  
        // TODO 获取数据  
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);  
        // 2.1 利用 resttemplate 获取响应  
        ResponseEntity<List<ItemDTO>> ids = restTemplate.exchange(  
                serviceInstance.getUri()+ "/items?ids={ids}",  
                HttpMethod.GET,  
                null,  
                new ParameterizedTypeReference<List<ItemDTO>>() {  
                },  
                Map.of("ids", CollUtils.join(itemIds, ","))  
        );