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

SpringCloud Alibaba

github官网下载地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

官网地址:https://spring.io/projects/spring-cloud-alibaba#overview

官方参考手册:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

1、主要功能

  1. 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  2. 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  3. 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  4. 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  5. 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  6. 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  7. 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  8. 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

2、组件

  1. Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  2. Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  3. RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
  4. Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  5. Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  6. Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  7. Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

3、核心Maven依赖

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

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

1、简介

GitHub地址:https://github.com/alibaba/Nacos

中文官网地址:https://nacos.io/zh-cn/

1.1、为什么叫Nacos

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

1.2、Nacos是什么

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

Nacos就是注册中心 + 配置中心的组合 【等价于】 Nacos = Eureka+Config +Bus

1.3、Nacos能干什么

  1. 替代Eureka做服务注册中心
  2. 替代Config做服务配置中心

1.4、下载地址

官网下载地址:https://github.com/alibaba/nacos/releases/tag/2.1.1

选择历史版本:https://github.com/alibaba/nacos/tags?after=1.3.1

指定下载历史版本:https://github.com/alibaba/nacos/releases/tag/1.1.4

服务注册中心对比

服务注册与发现框架 CAP模型 控制台管理 社区活跃的
Eureka AP 支持
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

2、win安装与运行

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;
  3. Maven 3.2.x+;

其实不管是Linux还是win系统都可以运行的,各自都准备了不同的启动文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VCiGZ74-1667777914116)(image/103、下载nacos.png)]

2.2、本地解压

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPZQ3amN-1667777914117)(image/104、解压.png)]

2.3、运行Nacos

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2YjHwOD-1667777914118)(image/105、启动Naocs.png)]

2.4、访问控制台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WqZFshVG-1667777914118)(image/106、访问控制台.png)]

2.5、Windows关闭进程

shutdown.cmd

或者双击shutdown.cmd运行文件。

3、Linux安装与运行

必须要有前置环境才能运行

3.1、解压下载下载包

需要在官网上下载到.gz文件再进行下面的命令进行解压

unzip -xvf nacos-server-2.1.1.tar.gz
# 或
tar -xvf nacos-server-2.1.1.tar.gz

# 进入nacos文件
cd nacos/bin

3.2、启动服务器

注:Nacos的运行需要以至少2g、4g、60g*3的机器配置下运行。

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tA0k807b-1667777914118)(image/107、Linux启动.png)]

3.3、杀死进程

sh shutdown.sh

4、Nacos作为服务注册中心演示

4.1、基于Nacos的服务提供者模块cloudalibaba-provider-payment9001

4.1.1、修改pom.xml配置文件

父级pom.xml依赖中必须有阿里巴巴的

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

4.1.2、添加YAML配置文件

server:
  port: 9001

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

# 向外暴露端口
management:
  endpoints:
    web:
      exposure:
        include: '*'

4.1.3、添加服务中心启动类

package com.zcl.springcloud;

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

/**
 * 描述:Nacos服务注册中心启动类
 *
 * @author zhong
 * @date 2022-09-26 15:34
 */
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

4.1.4、创建基本的业务接口

package com.zcl.springcloud.controller;

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;

/**
 * 描述:控制器
 *
 * @author zhong
 * @date 2022-09-26 15:35
 */
@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;
    }
}

4.1.5、启动项目测试

  1. 启动Nacos服务

  2. 启动本模块9001

  3. 查看nacos控制台信息

    服务名称在YAML配置文件里面配置了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8yhLwDxs-1667777914119)(image/108、nacos服务注册中心.png)]

  4. 访问控制器接口:http://localhost:9001/payment/nacos/1

4.2、新建cloudalibaba-provider-payment9002服务提供者【实现负载均衡】

如下步骤都参考4.1步骤实现,修改本模块的端口即可

4.2.1、创建模块

4.2.2、添加pom.xml依赖

4.2.3、添加YAML配置文件

4.2.4、添加启动类

4.2.5、创建基础控制器接口

4.3、拷贝虚拟端口映射

  1. 拷贝虚拟端口

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-866YmaBv-1667777914119)(image/109、拷贝虚拟端口.png)]

  2. 修改启动端口

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoSTAckm-1667777914120)(image/110、修改端口映射.png)]

  3. 访问Nacos控制台

    点击微服务名称的详情进入查看

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rlGpk5SR-1667777914120)(image/111、Nacos服务详情.png)]

4.4、基于Nacos的服务消费者

4.4.1、新建cloudalibaba-consumer-nacos-order83消费者模块

4.4.2、添加pom.xml依赖

<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.zcl.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</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>

nacos默认是引入了ribbon实现了负载均衡的,由于上面创建了两个消费者9001、9002可以在下面的演示观察到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avVoZXis-1667777914126)(image/112、nacos引入ribbon负载均衡.png)]

4.4.3、添加YAML配置文件

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

service-url是自定义的配置文件,后面进行OpenFeign远程调用的时候会读取到

4.4.4、创建项目启动类

package com.zcl.springcloud;

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

/**
 * 描述:nacos项目启动类
 *
 * @author zhong
 * @date 2022-09-26 16:07
 */
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

4.4.5、业务实现

1、添加RestTemplate配置类

package com.zcl.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 描述:RestTemplate 远程调用配置类
 *
 * @author zhong
 * @date 2022-09-26 16:09
 */
@Configuration
public class ApplicationContextBean {
    
    

    /**
     * 开启远程调用和负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    
    
        return new RestTemplate();
    }
}

2、添加控制器接口

package com.zcl.springcloud.controller;

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;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * 描述:消费者控制器接口
 *
 * @author zhong
 * @date 2022-09-26 16:12
 */
@RestController
public class OrderNacosController {
    
    
    @Resource
    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);
    }

}

4.4.6、启动项目测试

  1. 查看nacos控制台

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Cr5txJF-1667777914127)(image/113、nacos服务实例.png)]

  2. 访问当前模块的端口远程访问服务提供者,查看是否有实现负载均衡

4.5、服务注册中心对比

4.5.1、Nacos生态图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYmUWagM-1667777914127)(image/114、Nacos生态图.png)]

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

Nacos Eureka Consul CoreDNS ZooKeeper
一致性协议 CP+AP AP CP / CP
健康检查 TCP/HTTP/MySQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Cloent Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8s集成 支持 不支持 支持 支持 不支持

4.5.3、服务实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6auf8Xt-1667777914128)(image/115、Nacos服务实例.png)]

4.5.4、Nacos 支持AP和CP模式的切换

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

何时选择使用何种模式?

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。

当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例

如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

通过如下命令完成AP和CP的模式转换

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

猜你喜欢

转载自blog.csdn.net/baidu_39378193/article/details/127724293