谷粒商城-全栈-11 分布式组件-SpringCloud Alibaba 简介及 Nacos 注册中心

使用SpringBoot+Vue+element-ui+逆向工程搭建全套后台管理系统,基于Docker环境,通过前后分离方式,以商品系统为例,进行微服务全栈开发。另,本博文是尚硅谷开发的惊天大作谷粒商城实战教程的学习笔记。

一、SpringCloud Alibaba

1、简介

Spring Cloud Alibaba是Spring Cloud的一个子项目。致力于提供微服务开发的一站式解决方案,项目包含开发分布式应用服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务;Spring Cloud Alibaba基于Spring Cloud,符合Spring Cloud标准;Spring Cloud Alibaba是阿里的微服务解决方案,只需要添加一些注解和少量配置,就可以将Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:

file

Nacos 和 Eureka比较

Spring Cloud Nacos
优点:
1)开箱即用,适用于dubbo,spring cloud等

2)AP模型,数据最终一致性

3)注册中心,配置中心二合一(二合一也不一定是优点),提供控制台管理

4)纯国产,各种有中文文档,久经双十一考验

缺点:
1)刚刚开源不久,社区热度不够,依然存在bug

Spring Cloud Eureka:
优点:
1)Spring Cloud 官方推荐

2)AP模型,数据最终一致性

3)开箱即用,具有控制台管理

缺点:
1)客户端注册服务上报所有信息,节点多的情况下,网络,服务端压力过大,且浪费内存

2)客户端更新服务信息通过简单的轮询机制,当服务数量巨大时,服务器压力过大。

3)集群伸缩性不强,服务端集群通过广播式的复制,增加服务器压力

4)Eureka2.0 闭源(Spring Cloud最新版本还是使用的1.X版本的Eureka)

2、Spring Cloud Alibaba 包含组件

这幅图是 Spring Cloud Alibaba 系列组件,其中包含了阿里开源组件,阿里云商业化组件,以及集成Spring Cloud 组件。
file

阿里开源组件:

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

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

更多组件请参考 Roadmap

3、技术搭配方案

结合 SpringCloud Alibaba 我们最终的技术搭配方案:

  • SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
  • SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
  • SpringCloud - Ribbon: 负载均衡
  • SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)
  • SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
  • SpringCloud - Gateway: API网关(webflux编程模式)
  • SpringCloud - Sleuth: 调用链监控
  • SpringCloud Alibaba - Seata:原 Fescar,即分布式事务解决方案

4、引入SpringCloud Alibaba 包依赖管理

修改项目的 gulimall-common 的 pom.xml 文件,引入 SpringCloud Alibaba 包依赖管理。

<!-- SpringCloud Alibaba 包依赖管理, 注意:这里的版本号为2.1.0,引入后依赖就不需要传版本号 -->
  <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>

二、nacos作为注册中心

将微服务注册到nacos中,可以参考官方文档示例:Nacos Discovery Example

1、引入nacos注册发现

修改项目的 gulimall-common 的 pom.xml 文件,引入 Nacos Discovery Starter。

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>

pom.xml

<?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>gulimall</artifactId>
    <groupId>com.atguigu.gulimall</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>gulimall-common</artifactId>
  <description>每一个微服务的公共的依赖,bean,工具类等</description>

  <properties>
    <mybatisplus.version>3.2.0</mybatisplus.version>
    <commons.lang.version>2.6</commons.lang.version>
    <lombok.version>1.18.4</lombok.version>
    <httpcore.version>4.4.12</httpcore.version>
    <joda.time.version>2.9.9</joda.time.version>
    <commons.io.version>2.5</commons.io.version>
    <servlet-api.version>2.5</servlet-api.version>
    <mysql.version>8.0.17</mysql.version>
  </properties>

  <dependencies>
    <!-- mybatis-plus -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>${mybatisplus.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.0.6.RELEASE</version>
      <scope>compile</scope>
    </dependency>

    <!-- lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpcore</artifactId>
      <version>${httpcore.version}</version>
    </dependency>

    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>${commons.lang.version}</version>
    </dependency>

    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>${joda.time.version}</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>${commons.io.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>${servlet-api.version}</version>
      <scope>provided</scope>
    </dependency>

    <!-- 导入mysql 驱动-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>

    <!-- nacos注册发现 -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

  </dependencies>

  <!-- SpringCloud Alibaba 包依赖管理,引入后依赖就不需要传版本号 -->
  <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>
</project>

2、修改对应微服务模块的application.yml

在相关微服务模块的 /src/main/resources/application.yml配置文件中配置 Nacos Server 地址,并且设置该application.name,否则注册服务里边发现不了。

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.10.10:3306/gulimall_pms
    driver-class-name: com.mysql.cj.jdbc.Driver
  #  配置nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-product
mybatis-plus:
  mapper-location: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto  # id主键自增
server:
  port: 6000

3、启动类添加注册与发现注解

启动类添加 @EnableDiscoveryClient 注解,开启服务注册与发现功能。

为com.atguigu.gulimall.product.GulimallProductApplication添加注册发现功能

package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

// 添加注册发现功能
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

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

}

4、启动 Nacos Server

首先需要获取 Nacos Server,支持直接下载。
直接下载:Nacos Server 下载页

启动 Server,进入解压后文件夹或编译打包好的文件夹,找到如下相对文件夹 nacos/bin,并对照操作系统实际情况之下如下命令。

Linux/Unix/Mac 操作系统,执行命令 sh startup.sh -m standalone
Windows 操作系统,执行命令 cmd startup.cmd

本人nacos server路径:

cd /Users/kaiyiwang/javaweb/guli/develop/nacos/bin
➜  bin  sh startup.sh -m standalone

访问后台:http://127.0.0.1:8848/nacos/ 默认账号和密码是 :nacos/nacos

file

5、注册更多的服务

gulimall-coupon,gulimall-member,gulimall-order,gulimall-ware 剩余4个也开启微服务注册。

三、小结

Nacos使用三步:
1、导包 nacos-discovery
2、写配置,指定 nacos地址,指定应用的名字
3、开启服务注册发现功能@EnableDiscoveryClient

feign使用三步:
1、导包 openfeign
2、开启@EnbableFeignClients 功能
3、编写接口,进行远程调用


相关文章:
Spring Cloud Alibaba 新一代微服务解决方案
《Spring Cloud Alibaba(2019)》从入门到精通

为者常成,行者常至