SpringCloud Nacos服务注册和配置中心

SpringCloud Nacos服务注册和配置中心_java在这里插入图片描述

简介

1. 为什么叫Nacos :

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

Nacos 就是注册中心 +  配置中心的组合

Nacos 官网  :https://nacos.io/zh-cn/

GitHub:https://github.com/alibaba/Naco


  • Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

  • Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。SpringCloud Nacos服务注册和配置中心_java_02

安装并运行nacos

在docker上安装nacos

拉取nacos镜像:

docker pull nacos/nacos-server

运行nacos:

docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

在浏览器输入:http://ip地址:8848/nacos/ 账号和密码都是nacos。

SpringCloud Nacos服务注册和配置中心_java_03SpringCloud Nacos服务注册和配置中心_java_04

Nacos作为服务注册中心演示

官方文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

提供者
  1. 新建模块cloudalibaba-provider-payment9001
  2. pom
<dependencies>
    <!--SpringCloud Alibaba nacos-->
    <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>
        <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>
  1. yml
server:
  port: 9001


spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 120.92.164.250:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)


management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {

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

}

  1. 新建controller包,包下新建PaymentController
@RestController
public class PaymentController {

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


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

}

  1. 启动9001

SpringCloud Nacos服务注册和配置中心_java_05在这里插入图片描述

消费者 (整合Feign)
  1. 新建  cloudalibaba-consumer-nacos-order83
  2. pom
<dependencies>
        <!--SpringCloud Alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.angenin.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>
            <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>
        <!-- openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
  1. 建yml
server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 120.92.164.250:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)


#消费者要访问的微服务名称(成功注册进nacos的服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider
  1. 主启动类
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class OrderNacosMain83 {

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

}
  1. 新建 feign包 ,包下新增接口  PaymentFeignService
@Component
@FeignClient(value = "nacos-payment-provider")
public interface PaymentFeignService {

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id);

}

  1. 新建controller
@RestController
public class OrderNacosController {

    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping("/consumer/payment/feign/nacos/{id}")
    public String paymentInfo2(@PathVariable("id") Integer id){
        return paymentFeignService.getPayment(id);
    }

}
  1. 启动SpringCloud Nacos服务注册和配置中心_java_06

服务注册中心对比

Nacos全景图SpringCloud Nacos服务注册和配置中心_java_07Nacos和CAP(同时支持 cp + ap)SpringCloud Nacos服务注册和配置中心_java_08SpringCloud Nacos服务注册和配置中心_java_09

AP 和 CP的切换

A :  可用性 B:一致性 C:分区容错性

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

如何选择模式:

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

Nacos默认AP。

切换CPSpringCloud Nacos服务注册和配置中心_java_10


Nacos作为服务配置中心演示

  1. 新建cloudalibaba-config-nacos-client3377
  2. pom
<dependencies>
    <!-- nacos config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--SpringCloud Alibaba nacos-->
    <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>
        <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>
  1. yml

SpringCloud Nacos服务注册和配置中心_java_11

bootstrap.yml:

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 120.92.164.250:8848 #Nacos服务注册中心地址(本机的写localhost)
      config:
        server-addr: 120.92.164.250:8848 #Nacos作为配置中心地址(本机的写localhost)
        file-extension: yml #指定yml格式配置

application.yml

spring:
  profiles:
    active: dev #表示开发环境

  1. 启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }

}

  1. 新建controller 包,ConfigClientController类
@RefreshScope   //支持Nacos的动态刷新功能
@RestController
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;


    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }

}

  1. 在Nacos中添加配置信息

官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

SpringCloud Nacos服务注册和配置中心_java_12`

SpringCloud Nacos服务注册和配置中心_java_13SpringCloud Nacos服务注册和配置中心_java_14SpringCloud Nacos服务注册和配置中心_java_157. 启动3377 浏览器输入:http://localhost:3377/config/info

SpringCloud Nacos服务注册和配置中心_java_16实时刷新

SpringCloud Nacos服务注册和配置中心_java_17在这里插入图片描述

Nacos作为配置中心——分类配置

实际开发中,通常一个系统会准备

  • dev开发环境
  • test测试环境
  • prod生产环境

SpringCloud Nacos服务注册和配置中心_java_18在这里插入图片描述

Namespace+Group+DataID三者的关系
  1. 介绍

类似Java里面的package名和类名 最外层的nameSpace是可以用于区分部署环境的,Group和DataID逻辑是那个区分两个目标对象

SpringCloud Nacos服务注册和配置中心_java_19在这里插入图片描述


Data ID 区分

SpringCloud Nacos服务注册和配置中心_java_20在这里插入图片描述

Group 区分

SpringCloud Nacos服务注册和配置中心_java_21SpringCloud Nacos服务注册和配置中心_java_22Namespace方案

SpringCloud Nacos服务注册和配置中心_java_23SpringCloud Nacos服务注册和配置中心_java_24SpringCloud Nacos服务注册和配置中心_java_25