一. 简言

SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶.基于对各种中间件的整合.具体中间件浩瀚繁多,迭代快.因此主要记录springCloud的整合逻辑,这个原因必须要保证boot和cloud这个大总管版本兼容!
本篇文章运维部署采用docker,请先学习docker高级部分比较容易懂!

注意新版本有许多依赖需要独立导入,否则你将陷入深坑!如openfeigin需要独立导入spring-cloud-starter-loadbalancer.配置bootstrap文件需要导入spring-cloud-starter-bootstrap依赖等一系列问题,这都是摸爬滚打总结出来的经验教训呐

本篇采用截至目前的最新的官方稳定依赖套装
springboot 2.6.3
spring-cloud 2021.0.1
spring-cloud-alibaba 2021.1

在这里插入图片描述

版本一定要兼容.约定>配置>编码

springboot 和cloud的版本选择依赖 详情地址
详细的boot和cloud的版本选择依赖 详情地址

重要!

springCloudAlibaba统御各大中间件版本依赖关系 详情地址
在这里插入图片描述

在这里插入图片描述
约定>配置>编码


二. 基本环境配置

2.1 父工程pom文件

2.1.1编码配置

在这里插入图片描述

2.1.2 注解支持

在这里插入图片描述

2.1.3 java编译版本

在这里插入图片描述

2.1.4 maven导入配置

在这里插入图片描述

在这里插入图片描述

2021.4 父pom稳定版本总控样例

  <?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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.vector.springcloud</groupId>
  <artifactId>cloud2021</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>cloud-provider-payment8001</module>
    <module>cloud-consumer-order80</module>
    <module>cloud-api-commons</module>
  </modules>
  <packaging>pom</packaging>

  <!-- 统一管理jar包版本 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.13.1</junit.version>
    <slf4j.version>2.0.0-alpha5</slf4j.version>
    <lombok.version>1.18.22</lombok.version>
    <mysql.version>8.0.26</mysql.version>
    <druid.version>1.2.9</druid.version>
    <mybatis.spring.boot.version>2.2.2</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
<!--  dependencyManagement中只是声明依赖,而不实现引入。-->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.6.3-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.6.3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2021.0.1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2021.1</version>
        <type>pom</type>
      </dependency>

      <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2021.1</version>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>



三. 微服务模块业务流程–微服务模块之间调用

约定>配置>编码

  • 建module
  • 改pom
  • 写yml
  • 主启动
  • 业务类

3.1 支付模块样例

3.1.1 父工程下建maven子模块

在这里插入图片描述

3.1.2 建yml

在这里插入图片描述

3.1.3. 建启动类

在这里插入图片描述

3.1.4 业务类

vue-     controller-service-dao-redis-mysql

  • 建module
  • 改pom
  • 写yml
  • 主启动
  • 业务类 …
    同理创建 消费者模块
3.2 工程聚合-继承-重构

模块继承,功能聚合.重构抽离重复实体.
下图存在重复实体
在这里插入图片描述

api-commons模块抽离公共代码
在这里插入图片描述

在这里插入图片描述

五.支配主流中间件

在这里插入图片描述

5.1 nacos注册中心

作用:发现服务模块,在naocs注册过的模块都可以被nacos管理.
nacos注册中心与配置中心 <=> Eureka +Config + Bus

nacos下载地址

5.1.1 docker下载与启动nacos客户端
# docker pull nacos/nacos-server:1.4.2
# docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.4.2

默认账号密码; nacos nacos
在这里插入图片描述

5.1.2 引pom依赖
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
5.1.3 配置yml连接
server:
  port: 9001

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

management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 主启动类写标签
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.2 nacos配置中心

作用:配置文件与jar发布部署相分离.可以通过nacos实时修改项目配置源.而不需要重新部署项目

  1. 建module
  2. 改pom
  3. 建yml
  4. 主启动
  5. 业务类

5.2.1 pom主要配置依赖

        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

springboot2.4修改了bootstrap文件引导方式,必须引入该依赖.否则naocs主动类起不来,也访问不到配置路径!!!

5.2.2 yml (springboot中配置文件的加载是存在优先级顺序的,优先级nacos高于bootstrap高于application)

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置 与nacos-ui界面一致
        group: DEFAULT_GROUP # 与nacos-ui的分组一致
#        namespace:  与nacos-ui  命名空间ID一致

# 默认寻找命名规则${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

在这里插入图片描述

application.yml

spring:
  profiles:
    active: dev

务必版本对应,查询地址
在这里插入图片描述

在这里插入图片描述
data id的配置文件名应当严格遵守官方文档规范!配置文件后缀必须与data id名称一致

5.2.3 主启动

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

}

5.2.4 调接口获取配置http://localhost:3377/config/info
在这里插入图片描述

5.3 命名空间,分组和DataID的关系

默认情况:

  • Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
  • Nacos默认的命名空间是public,Namespace主要用来实现隔离。(开发、测试、生产环境)
  • Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去.
  • Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT
  • Cluster是对指定微服务的一个虚拟划分。
  • Instance,就是微服务的实例

nacos集群配置及持久化操作

作用: 预防一台nacos挂机造成整个项目瘫痪.(至少3台)
默认Nacos使用嵌入式数据库derby实现数据的存储。但如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

轻量练习运行方式

sudo docker run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
--restart=always \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
nacos/nacos-server:1.4.2

docker单机部署nacos详见这位博主

nacos集群配置

七 openFeign服务调用

作用: 跨服务器实现功能模块之间的数据通信.
在这里插入图片描述
实质上封装了new RestTemplate()

它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡

在这里插入图片描述

  1. 接口+注解(微服务调用接口+@FeignClient)

  2. 引入pom

        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
                <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.2</version>
        </dependency>
  1. yml
  2. 主启动类 激活 @EnableFeignClients
    在这里插入图片描述
  3. 业务类
    在这里插入图片描述
    使用openfeign的前提是必须在服务注册中心都注册
    详细使用请看官网

八. sentinel

简介
在这里插入图片描述
官网地址

在这里插入图片描述
java -jar sentinel-dashboard-1.8.3.jar 前台启动
在这里插入图片描述
localhost:8080 账号密码均为:sentinel
在这里插入图片描述

1.pom

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.2</version>
        </dependency>

2.yml

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置Sentinel dashboard地址
        dashboard: localhost:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 主启动
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401
{
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}
  1. 业务类
@RestController
public class FlowLimitController
{

    @GetMapping("/testA")
    public String testA()
    {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB()
    {
        return "------testB";
    }
}
8.1 流控

在这里插入图片描述
在这里插入图片描述
qps并发量控制.御敌于门外
线程数控制.关门打狗.

在这里插入图片描述

8.2 熔断降级

降级规则

在这里插入图片描述

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

8.3 热点key和系统规则

热点key官网

系统规则

九.gateway新一代网关

gateway地址

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。
gateway模型: SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
作用: 1) 监控动态路由到各个服务,从nacos注册中心中实施感知某一服务状态,路由到正确位置.
2) Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等

在这里插入图片描述

在这里插入图片描述
Spring Cloud Gateway 具有如下特性:

  • 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 可以对路由指定 Predicate(断言)和 Filter(过滤器);
  • 集成Hystrix的断路器功能;
  • 集成 Spring Cloud 服务发现功能;
  • 易于编写的 Predicate(断言)和 Filter(过滤器);
  • 请求限流功能;
  • 支持路径重写。

pom

        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

yml

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
    discovery:
       #Nacos服务注册中心地址
      server-addr
  sentinel:
    transport:
      #配置Sentinel dashboard地址
      dashboard: 
      #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
      port: 8719
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**         # 断言,路径相匹配的进行路由

上述配置相当于在8001模块的端口,套一层9527网关.经网关路由匹配到8001.根据断言规则寻找对应接口

硬编码方式配置

      @Bean
      public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
         return routeBuilder.routes()
               .route("test1", r -> {
                  return r.host("*.somehost.org").and().path("/somepath")
                        .filters(f -> f.addRequestHeader("header1", "header-value-1"))
                        .uri("http://someuri")
                        .metadata(RESPONSE_TIMEOUT_ATTR, 200)
                        .metadata(CONNECT_TIMEOUT_ATTR, 200);
               })
               .build();
      }

十.Seata分布式事务

官方文档
一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题.
微服务架构以后,会存在多个数据源或数据库.订单库,库存库,电商库,消费者库等可能分机部署…这些库的交互需要保证数据一致性.

10.1 分布式事务处理过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2 使用seata-server 1.4+

在官网下载jar后
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

seata1.4加入很多第三方存储库.剩下由你探索
在这里插入图片描述
启动seata-server服务后.在编码中使用

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐