资讯详情

Spring Cloud & Spring Cloud Alibaba 知识点总结

欢迎访问:http://lss-coding.top/ 我自己的博客平台

. 微服务架构简介

1.1 微服务架构概述

2014 年 3 月 Martin Fowler 提出微服务架构

微服务框架是一种架构模式,它提倡将单个应用程序分为一组小服务,服务相互协调,为用户提供最终价值。在其独立过程中,服务与服务之间采用轻量级通信机制相互合作(通常基于 HTTP 协议的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。此外,应尽量避免统一集中的服务管理机制。对于具体服务,应根据业务上下文选择合适的语言和工具。

image-20211007170948318

以前的单一应用不利于互联网技术的发展和发展,所以一个拆分为微服务。

1.2 Spring Cloud 简介

COORDINATE ANYTHING:DISTRIBUTED SYSTEMS SIMPLIFIED

Building distributed systems doesn’t need to be complex and error-prone.Spring Cloud offers a simple and accessible programming model to the most common distributed system patterns,helping developers build resilient,reliable,and coordinated applications. Spring Cloud is buit on top of Spring Boot,making it easy for developers to get started and become productive quickly.

  • Spring Cloud 是分布式微服务架构的体现。

  • Spring Cloud = 分布式微服务架构的一站式解决方案是各种微服务架构着陆技术的集合,俗称微服务全家桶

  • Spring Cloud 被称为微服务开发的主流技术栈,在国内开发者社区非常受欢迎。

  • 京东的微服务体系

  • 阿里的微服务系统

  • 京东物流

1.3 Spring Cloud 技术栈

2. Boot 和 Cloud 版本选择

  • Spring Boot 版本是用数字命令的

  • Spring Cloud 以英国伦敦地铁站的名称命名,地铁站的名称是字母 A-Z 以依次类推的形式发布迭代版

    Spring Cloud 它是一个由许多子项目组成的综合性项目,每个子项目都有不同的发布节奏。为了管理 Spring Cloud 依赖于每个子项目的版本,发布了包括某个项目在内的清单 Spring Cloud 子项目版本对应版本。为了避免 Spring Cloud 版本号与子项目版本号混淆,Spring Cloud 版本以名称而不是版本号命名。这些版本的名称是伦敦地铁站的名称,根据字母表的顺序对应版本的时间顺序。例如 Angel 是第一个版本,Brixton 是第二个版本。

    当 Spring Cloud 发布内容积累到临界点或重大点 BUG 解决后,将发布一个 ‘service releases’ 版本,简称 SRX 版本,比如 Greenwich.SR2 就是 Spring Cloud 发布的 Greenwich 版本的第 2 个 SRX 版本。

Spring Boot 和 Spring Cloud 的依赖关系

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

更详细的版本对应依赖

网址:https://start.spring.io/actuator/info

使用官网时,给出相应版本

https://docs.spring.io/spring-cloud/docs/current/reference/html/

3. Cloud 停止/升级/替换各种组件

4. 编码构建微服务架构

4.1 构建父工程 Project

4.2 重写 pom.xml 文件

<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>org.lss</groupId>
  <artifactId>springcloud</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--表示是一个父工程-->
  <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.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.2.6</druid.version>
    <mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version>
  </properties>

  <!--子模块继承之后,提供作用:定版本+子module 不用写 groupId 和 version-->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.4.6-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.5.4</version>
      </dependency>
      <!-- spring cloud 2020.0.3-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2020.0.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2021.1</version>
        <type>pom</type>
        <scope>import</scope>
      </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>
    </dependencies>

  </dependencyManagement>
</project>

4.3 dependencyManagement 和 dependencies 区别

maven 使用 这个 dependencyManagement 元素来提供了一种管理依赖版本号的方式,通常会在一个组织或者项目的最顶层的父 pom 中看到 dependencyManagement 元素。

使用 pom.xml 中的 dependencyManagement 元素能让所有子项目中引用一个依赖而不用显式的列出版本号。Maven 会沿着父子层次向上走,直到找到一个拥有 dependencyManagement 元素的项目,然后它就会使用这个 dependencyManagement 元素中指定的版本号。

在子项目中使用依赖就不需要指定版本号了,这样做的好处是:如果有多个子项目都引用同一个依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改;另外如果某个子项目需要另一个版本,则需要声明 version 即可。

**注意:**dependencyManagement 里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写入了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和scope 都读取自父 pom;如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。

4.4 构建一个支付模块

​ 创建完成之后,可以在 父工程的 pom.xml 文件中看到子模块的信息

<groupId>org.lss</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
  <module>cloud-provider-payment8001</module>
</modules>

​ 子模块中也可以看到关于父工程的信息

<parent>
    <artifactId>springcloud</artifactId>
    <groupId>org.lss</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--因为引入了父工程,所以这里没有 artifactId 和 version-->
<artifactId>cloud-provider-payment8001</artifactId>

<?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>springcloud</artifactId>
        <groupId>org.lss</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>cloud-provider-payment8001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <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.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</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>

</project>

**3. 写 yml **

server:
  port: 8001

# 服务名称
spring:
  application:
    name: cloud-payment-service
  datasource:
    # 数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/studentgrade?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root
    
mybatis:
  mapper-locations: classpath:mapper/*.xml
  # 所有实体类别名类所在包
  type-aliases-package: com.lss.springcloud.pojo

@SpringBootApplication
public class PaymentMain8001 { 
        

    public static void main(String[] args) { 
        

        SpringApplication.run(PaymentMain8001.class,args);

    }

}

  1. 创建表
CREATE TABLE `payment`(
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
	`serial` VARCHAR(200) DEFAULT '',
	PRIMARY KEY (`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
  1. 创建实体类
  • 表的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable { 
        

    private Long id;
    private String serial;

}
  • 用于前后端分离返回信息的实体类
/** * 用于前后端分离的时候给前端返回状态信息 * 返回前端的通用 json 字符串 */@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult<T> { 
                // 状态码 private Integer code; // 信息 private String message; // 数据 private T data; public CommonResult(Integer code,String message){ this(code,message,null); }}
  1. 接口层 mapper
@Mapperpublic interface PaymentMapper { 
                // 插入一条数据 int save(Payment payment); // 根据 id 查询一条数据 Payment getPaymentById(@Param("id") Long id);}

在 resources 文件夹下创建一个 mapper 文件夹(位置:因为在 yml 配置文件中指定了mapper的位置),用于放接口的映射

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.lss.springcloud.mapper.PaymentMapper">	    <!--useGeneratedKeys="true" 返回值-->        <insert id="save" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">                insert into payment (sarial) values(#{serial});        </insert>        <!--结果集映射,因为当表多的时候,java 的类型的 userName 表中的类型的 user_name 所以做一个映射-->        <resultMap id="BaseResultMap" type="com.lss.springcloud.pojo.Payment">                <id column="id" javaType="id" jdbcType="BIGINT"/>                <id column="serial" javaType="serial" jdbcType="VARCHAR"/>        </resultMap>        <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">                select * from payment where id= #{id}        </select></mapper>
  1. service
  • service 接口
public interface PaymentService { 
                // 插入一条数据 int save(Payment payment); // 根据 id 查询一条数据 Payment getPaymentById(@Param("id") Long id);}
  • service 接口的实现类
@Servicepublic class PaymentServiceImpl implements PaymentService { 
                @Autowired        private PaymentMapper paymentMapper;        @Override        public int save(Payment payment) { 
                        return paymentMapper.save(payment);        }        @Override        public Payment getPaymentById(Long id) { 
                        return paymentMapper.getPaymentById(id);        }}
  1. controller
@RestController@Slf4jpublic class PaymentController { 
                @Autowired        private PaymentService paymentService;        @PostMapping(value = "/payment/save")        public CommonResult save(Payment payment) { 
                        int result = paymentService.save(payment);                log.info("==========插入结果:" + result);                if (result > 0) { 
                                return new CommonResult(200, "插入数据成功", payment);                } else { 
                                return new CommonResult(444, "插入数据失败", null);                }        }        @GetMapping(value = "/payment/get/{id}")        public CommonResult gatPaymentById(@PathVariable("id") Long id) { 
                       Payment payment = paymentService.getPaymentById(id);                log.info("==========查询结果:" + payment);                if (payment != null) { 
                                return 
        标签: zh1032d胀差变送器装置

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台