目录

一、springcloud alibaba概述

二、Nacos概述

        1、什么是Nacos 

        2、Nacos能做什么 

        3、官网 

        4、各种服务注册中心比较

三、Nacos的安装和运行

        1、 下载Nacos

        2、下载安装包后解压,打开bin文件,直接在cmd中运行startup.cmd 

        3、访问可视化界面 

 四、Nacos作为服务注册中心

        1、搭建基于Nacos的服务提供者

                (1)新建模块

                (2)修改pom文件

                (3)编写yml文件

                (4)主启动类

                (5)业务逻辑代码 

                (6)运行测试 

                (7)再按照相同的内容建9002模块 

        2、基于Nacos的服务消费者 

                (1)新建模块

                (2)修改pom文件 

                (3)编写yml文件

                (4)编写主启动类

                (5)编写业务逻辑代码 

                (6)运行测试

        3、各种注册中心对比

                (1)Nacos与其他注册中心对比 

                (2)何时选择使用何种模式

                (3) Nacos 支持AP和CP模式的切换


一、springcloud alibaba概述

        官方手册: 

        https://spring.io/projects/spring-cloud-alibaba#overview 

springcloud alibaba 版本依赖管理_java

 

        通过这张图也能看出cloud alibaba兴起是必然了吧。 

 

二、Nacos概述

        1、什么是Nacos 

        前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。 

        Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 

        一句话来描述:Nacos就是注册中心 + 配置中心的组合 

        Nacos ≈ Eureka+Config +Bus 

        2、Nacos能做什么 

                (1)替代Eureka做服务注册中心 

                (2)替代Config做服务配置中心 

        3、官网 

        https://github.com/alibaba/Nacos 

        文档:        https://nacos.io/zh-cn/index.html 

                          Spring Cloud Alibaba Reference Documentation 

  

        4、各种服务注册中心比较

 

springcloud alibaba 版本依赖管理_spring cloud_02

 

三、Nacos的安装和运行

        1、 下载Nacos

        https://github.com/alibaba/nacos/releases 

springcloud alibaba 版本依赖管理_云原生_03

 

        2、下载安装包后解压,打开bin文件,直接在cmd中运行startup.cmd 

springcloud alibaba 版本依赖管理_微服务_04

 

        

        3、访问可视化界面 

        命令运行成功后直接访问         http://localhost:8848/nacos

        

springcloud alibaba 版本依赖管理_分布式_05

 

 

 四、Nacos作为服务注册中心

        参考文档:        Spring Cloud Alibaba Reference Documentation

 

        1、搭建基于Nacos的服务提供者

                (1)新建模块

                新建普通maven模块        cloudalibaba-provider-payment9001

                9001建好之后再建一个一模一样的9002,方便后面做负载均衡的测试。

                (2)修改pom文件

springcloud alibaba 版本依赖管理_微服务_06

springcloud alibaba 版本依赖管理_java_07

 

springcloud alibaba 版本依赖管理_java_08

 

                        父模块中:

<!--spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

                        子模块中: 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.shang.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

 

 

                (3)编写yml文件

 

springcloud alibaba 版本依赖管理_分布式_09

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

 

               (4)主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

                (5)业务逻辑代码 

springcloud alibaba 版本依赖管理_分布式_10

 

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}

                (6)运行测试 

                启动9001服务 

springcloud alibaba 版本依赖管理_微服务_11

 

                (7)再按照相同的内容建9002模块 

                为测试消费者的负载均衡做准备。 

 

        2、基于Nacos的服务消费者 

                 Nacos里整合了Ribbon,所以天生能够实现负载均衡。

                (1)新建模块

                创建普通maven模块        cloudalibaba-consumer-nacos-order83 

                (2)修改pom文件 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.shang.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-nacos-order83</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.shang.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

 

                (3)编写yml文件

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848


#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

 

                (4)编写主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class,args);
    }
}

                (5)编写业务逻辑代码 

                config:

@Configuration
public class ApplicationContextBean
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

                controller:

@RestController
@Slf4j
public class OrderNacosController {

    @Autowired
    private RestTemplate restTemplate;

    //路径写在配置文件里
    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id)
    {
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }

}

 

                        (6)运行测试

springcloud alibaba 版本依赖管理_分布式_12

 

        访问        http://localhost:83/consumer/payment/nacos/13

 

springcloud alibaba 版本依赖管理_微服务_13

 

springcloud alibaba 版本依赖管理_云原生_14

 

          实现了9001和9002的轮询。

        3、各种注册中心对比

                (1)Nacos与其他注册中心对比 

 

springcloud alibaba 版本依赖管理_云原生_15

springcloud alibaba 版本依赖管理_spring cloud_16

 

                C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。 

 

                (2)何时选择使用何种模式

一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
 
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。 

 

               (3) Nacos 支持AP和CP模式的切换

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'