Nacos注册中心

发布于 2022-04-22  4.4k 次阅读


一,Nacos概述

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

在应用上Nacos的功能就是注册中心+配置中心,通俗的来说就是Eureka+Config+Bus,它的功能更加强大也更加完善

  • 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
  • 架构大图:通过清晰架构,让您快速进入 Nacos 世界
  • 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
  • 生态大图:系统梳理 Nacos 和主流技术生态的关系
  • 优势大图:展示 Nacos 核心竞争力
  • 战略大图:要从战略到战术层面讲 Nacos 的宏观优势

二,Nacos服务端的安装

Nacos提供了 Linux/Unix/Mac/Windows的安装

下载地址:https://github.com/alibaba/nacos/releases

一,Linux安装Nacos

前置准备:省略

  • 安装jdk环境
  • 安装maven环境

下载nacos:

① 上传到linux系统中

② 解压

tar -zxvf nacos-server-2.0.3.tar.gz

③ 启动(执行文件在nacos/bin目录中)

sh startup.sh -m standalone #单机启动

④  访问

http://192.168.68.134:8848/nacos

二,Windowns安装nacos(省略)

三,Nacos的使用

一,Nacos服务提供者注册

Nacos有两大依赖:

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更
  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现

父工程依赖:

<dependencyManagement>
    <dependencies>
        <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>
    </dependencies>
</dependencyManagement>

① 导入maven依赖(有父工程就不需要写版本号) 

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

    <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>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

② application配置

server:
  port: 9100
spring:
  application:
    name: nacos-pyment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.68.134:8848 #nacos服务端地址
management:
  endpoints:
    web:
      exposure:
        include: "*"

③ main启动类

@SpringBootApplication
@EnableDiscoveryClient //nacos客户端
public class NacosClientMain {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientMain.class,args);
    }
}

④ controller调用

@RestController
public class nacoscontroller {

    @Value("${server.port}")
    String port;

    @GetMapping(value = "/pyment/nacos/{id}")
    public String getnacos(@PathVariable("id") Integer id){

        return "nacos registory serverport:"+port+"--->"+id;
    }}

查看nacos服务端是否有改服务:

二,nacos服务消费者注册和调用

Nacos默认就支持负载均衡,底层负载均衡整合了Ribbon:

Nacos服务的调用和负载均衡和SpringCloud的eureka是一样的,都使用http进行调用(Ribbon+RestTemplate),当然也可以使用OpenFeign

① 导入maven依赖

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

    <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>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

② application配置

server:
  port: 9103
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.68.134:8848 #nacos服务端地址
service-url: #这个是自定义,通过@Value在代码中调用
  nacos-user-service: http://nacos-pyment-provider
management:
  endpoints:
    web:
      exposure:
        include: "*"

③ main启动类

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

④ config配置resttemplate

@Configuration
public class ApplicationConfig {

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

⑤ controller调用服务提供端

@RestController
public class OrderNacosController {

    @Resource
    RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    String httpaddr;

    @GetMapping(value = "/consumer/nacos/{id}")
    public String pymentinfo(@PathVariable("id") Integer id){

      return  restTemplate.getForObject(httpaddr+"/pyment/nacos/"+id,String.class);
    }
}

Nacos服务端:

消费端调用服务端:

四,Nacos对比其他服务注册中心

Nacos注册中心是全生态的:

它不仅整合springcloud,dubbo还整合K8s,docker等编排运维工具,而其他注册中心做不到这一点

nacos和其他注册中心的对比:

Nacos最大的特点是同时支持AP和CP

Nacos的CP和AP适用于不同的场景:

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

CP和AP切换命令:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
  • 这个不能随便切,建议保持默认的AP即可
  • 集群环境下所有的服务都要切换
  • 可以使用postman模拟也可以使用CRUL命令,必须使用put请求。用get和post均无效

路漫漫其修远兮,吾将上下而求索