Spring Cloud Alibaba-Nacos(十二)

254 阅读1分钟

简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理官方文档

搭建步骤

  • nacos.client(springboot)

    • 引依赖
        <!--子工程引入-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--父工程管理version-->
        <properties>
            <springcloudalibaba.version>0.9.0.RELEASE</springcloudalibaba.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${springcloudalibaba.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
         </dependencyManagement>
    
    • 加注解
    • 加配置
    # yml对缩进有严格的要求,务必一致
    spring:
      cloud:
        nacos:
          discovery:
            # 指定nacos server的地址
            server-addr: localhost:8848
      application:
        # 服务名称尽量用-,不要用_,不要用特殊字符
        name: user-center
    
  • nacos.server

    • 从spring-cloud-alibaba-dependencies找到client版本
    <nacos.client.version>1.0.0</nacos.client.version>
    
    tar -xvf nacos-server-$version.tar.gz
    cd ./nacos/bin
    sh startup.sh -m standalone
    

使用

原生写(可以通过整合ribbon,feign优化)

...
      private final DiscoveryClient discoveryClient;
...
       List<ServiceInstance> instances = discoveryClient.getInstances("lock-center");
        String url = instances.stream()
                .map(instance -> instance.getUri() + "/lock/test/{id}")
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("没有当前实例"));
        List<String> urls = instances.stream()
                .map(instance -> instance.getUri() + "/lock/test/{id}")
                .collect(Collectors.toList());
        int i = ThreadLocalRandom.current().nextInt(urls.size());
        log.info("请求的URl:{}",urls.get(i));
        TblCar tblCar = restTemplate.getForObject(urls.get(i), TblCar.class, 4000002L);

领域模型

  • 层级
    • Namespace:实现隔离,默认public
      • Namespace不同的服务无法互相调用
    • Group:不同服务可以分到同一组,默认DEFAULT-GROUP
    • Service:微服务
    • Cluster:对指定微服务的虚拟划分,默认DEFAULT
    • Instance:微服务实例

元数据

  • 级别
    • 服务级别
    • 集群级别
    • 实例级别
  • 设置
    • 控制台
    • yml
      # yml对缩进有严格的要求,务必一致
      spring:
        cloud:
          nacos:
            discovery:
              metadata:
                version: v1