SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery

1. Nacos简介

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
总的来说nacos就是服务注册中心和配置中心的组合

  • 可以替代Eureka做服务注册中心
  • 可以替代Config做服务配置中心

2. Nacos安装和运行

  • 前置条件:Java8+Maven环境已经配置完成

  • 从官网下载Nacos,下载地址:https://github.com/alibaba/nacos/releases

  • 解压安装包,直接运行bin目录下的startup.cmd,测试期间可以将启动模式设置为单机模式。
    SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery_第1张图片

  • 命令运行成功后直接访问http://localhost:8848/nacos,默认账号密码都是nacos

  • 进入nacos控制台
    SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery_第2张图片

3. Nacos Discovery 服务注册和发现

就像tomcat一样,Nacos服务启动后,我们只需要将我们的微服务注册到Nacos中即可。

3.1. Nacos服务提供者注册

新建Module - cloudalibaba-provider-payment9001
引入pom依赖:
在master的pom.xml中引入spring-cloud-alibaba-dependencies,用来进行版本控制,以免版本冲突:

<dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-dependenciesartifactId>
            <version>2.2.8.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        dependency>
    dependencies>
dependencyManagement>

服务提供者模块 - pom引入以下依赖:

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <version>0.2.2.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

配置yaml文件,配置服务注册中心地址,将微服务注册到nacos:

server:
  port: 9001

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

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

主启动类添加@EnableDiscoveryClient注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

业务类:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@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;
    }
}

为了演示nacos的负载均衡,参照9001创建第二个服务提供者 cloudalibaba-provider-payment9002

查看服务端是否注册成功:
启动9001和9002即可,在Nacos的控制台查看服务实例是否已经注册成功。
SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery_第3张图片

3.2. Nacos服务消费者注册和负载均衡

创建服务消费者Module - cloudalibaba-consumer-nacos-order83

引入pom依赖: spring-cloud-starter-alibaba-nacos-discovery

<dependencies>
        
	<dependency>
		<groupId>org.springframework.cloudgroupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
		<version>0.2.2.RELEASEversion>
	dependency>
	<dependency>
		<groupId>com.atguigu.springbootgroupId>
		<artifactId>cloud-api-commonsartifactId>
		<version>1.0-SNAPSHOTversion>
	dependency>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-webartifactId>
	dependency>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-actuatorartifactId>
	dependency>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-devtoolsartifactId>
	dependency>
	<dependency>
		<groupId>org.projectlombokgroupId>
		<artifactId>lombokartifactId>
	dependency>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-testartifactId>
	dependency>
dependencies>

配置application.yaml配置文件: 将当前微服务注册到nacos,并声明一个自定义变量,将服务提供者的微服务地址声明在配置文件中,便于业务代码和配置文件的解耦

server:
  port: 83

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

#将服务提供者的微服务信息声明在配置文件中,便于业务代码和配置文件的解耦
service-url:
  nacos-user-service: http://nacos-payment-provider #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)

创建主启动类: 添加@EnableDiscoveryClient注解

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

创建一个配置类: 利用RestTemplate进行远程服务调用

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

编写业务类: 首先获取服务调用地址,然后利用restTemplate进行远程调用,调用路径就是服务地址+服务提供者中controller的方法映射地址

@RestController
@Slf4j
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

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

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

负载均衡: nacos默认开启轮询模式的负载均衡策略

4. Nacos服务注册中心对比提升

4.1. Nacos生态

4.2. Nacos和CAP

Nacos与其他注册中心特性对比

nacos eureka consul coreDNS zooKeeper
一致性协议 CP+AP AP CP / CP
健康检查 TCP/HTTP/MySQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
springcloud集成 支持 支持 支持 不支持 不支持
dubbo集成 支持 不支持 不支持 不支持 支持
k8s集成 支持 不支持 支持 支持 不支持

4.3. Nacos服务发现实例模型

Nacos支持AP(分区可用性)和CP(分区一致性)模式的切换
SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery_第4张图片

C指的是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。Nacos支持CP+AP模式,即Nacos可以根据配置识别为CP模式或AP模式,默认是AP模式。

何时选择使用何种模式?
如果对数据一致性要求较高,且可以容忍一定时间的不可用,就选用CP模型。反之,如果可以容忍一定时延的数据不一致性,但不能容忍不可用现象发生,则要选用AP模型。
切换命令:

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

你可能感兴趣的:(springcloud,spring,cloud,学习,微服务)