Spring Cloud知识点全总结(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring Cloud知识点全总结

一.Spring Cloud 框架概述


1.基本介绍


SpringCloud是目前国内使用最广泛的微服务框架之一。官网地址:https://spring.io/projects/spring-cloud

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

如下图:


7ad2a054791941609b6fb2cf85a3f23b.png


Spring Boot最擅长的事情就是自动装配,而Spring Cloud就是把那些官方原生开源的一些组件给整合进来了,并且基于Spring Boot做了自动装配。那你只要拿过来就能用,而无需复杂的配置。之后我会逐一地去学习这些组件。


2.Spring Cloud与Spring Boot的版本兼容


下图就是我刚刚在官网截的一张版本兼容的示意图,也可以到官网自己去查看:


157ac7e9dbe14bf6a59cefcb5e0b3cdc.png


左边的每一个Spring Cloud版本,右边都有一个对应的Spring Boot版本。比如说,你们公司用了Spring Cloud的Greenwich版本,那你的Spring Boot就必须是2.1.x的版本。如果你用了其他的版本,你也要选择右边对应的Spring Boot版本号。如果使用的版本不一致,将来运行时可能会报错。


我接下来学习的使用的版本是Hoxton的版本,所以使用的Spring Boot版本就要用2.2.x或者时2.3.x的版本。


二.Spring Cloud 框架入门使用


前言:


从这里开始,会理论与操作相结合来学习Spring Cloud框架。我本篇用到的案例代码我会上传到CSDN的资源中去,我已经开启了免费下载,欢迎大家下载学习。


6e5bcb9d7a5143d48880b046e76b058c.png


1.服务拆分


先来了解一下服务拆分的细节和注意事项,服务拆分说起来很简单。一个单体架构,我们按照功能模块进行拆分,变成多个服务就行了。比如下图的4个模块,我们就拆分为4个服务。当然。我们在实际生产中,单个模块的功能可能会越来越多,我们还会继续拆分。


c90c22842ef14b7aad34580d721cc0dd.png

33316539da494569bafe5161e02e2e84.png


但是单体应用开发的多了,很多人可能会产生一种思维定势,容易犯一些错。这里总结一下:比如说,我现在有一个需求,是查询订单,同时把订单里面关联的用户信息,商品信息都给它查出来。如果是以前的开发模式,我们肯定是写一个方法去查询订单,在订单的查询过程中得到了用户Id,然后去数据库里面把用户查出来,得到了商品Id我再去把商品查出来。那么这个功能全部写到了订单的模块里面。这种写法是完全违背了我们的微服务的原则的。微服务拆分的目的就是单一职责,只做与自己相关的事情。订单模块就做订单业务,就不要去做用户查询等非订单模块的操作。我们的每一个微服务都不能去开发重复的业务,如果在你的微服务中出现了重复的业务,这就证明你的某些地方可能做得有问题。


为了做好这些,我们还会有一些要求。比如说我们微服务的数据要独立,一个微服务不要访问其他的微服务的数据库 。每个微服务都会有自己的数据库,用户功能的数据库里就存放的是用户相关的信息,别的都不存。订单模块的数据库里面存放的自然就是订单信息。这个时候你在做订单相关的业务时,如果要查用户信息,它自己的数据库里面没有。这就降低了业务的耦合。


微服务在拆分的时候还要注意一些事情,就是微服务可以将自己的业务暴露为接口,供其他的微服务使用。比方说我的用户有用户查询功能,如果订单需要,那我就暴露成一个接口,需要的时候发请求就可以访问其他微服务了。


2.案例准备


下面我们就通过一个案例来具体学习:


大家提前在下载的资料里找到cloud-demo(资料文件夹里面14k大小的那个压缩包,不是代码文件夹的那个完整版哦!),解压后会得到一个cloud-demo的项目。我们把它用idea打开就行了。


下面我先来介绍一下这个项目的结构:


72369f524844440abc52181535e22e40.png


我们这个项目会有上图的结构,父工程叫做cloud-demo,负责管理整个项目的依赖,下面有两个模块,分别是order-service和user-service。order-service里面做订单相关的内容(比如根据id查询订单),user-service里做用户相关的功能(比如根据id查询用户),这两个模块就是将来我们的两个微服务。并且我还为这两个服务准备了各自的表。(将来我们生产环境时,一定会把他们部署到不同的数据库服务器里面,只是这里我们学习,就在同一台数据库里了。)


大家的资源里面会有如下的俩个sql文件:


5081cd77df274fa29da0493c42509c98.png


下面我们先来做一些项目开始的准备工作:


(1)随便打开一个你安装的数据库可视化工具,然后分别创建两个数据库cloud_order和cloud_user。

(2)两个数据库分别运行导入上面的两个sql,把表导入进去。


我们来看一下这个cloud_demo父工程的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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.haiexijun.demo</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0</version>
    <modules>
        <module>user-service</module>
        <module>order-service</module>
    </modules>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>11</java.version>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
        <mysql.version>8.0.25</mysql.version>
        <mybatis.version>2.1.1</mybatis.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- springCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>


这里有两点要注意的就是你拿到项目之后要根据自己电脑里面装的java版本和mysql的版本在pom.xml文件里面的properties里更改对应的版本号。我的电脑的java版本时jdk11,mysql的版本是8.0.25。


下面是子工程里的pom.xml ,我这里也列在下面给大家看看:


user-service子项目:


<?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>cloud-demo</artifactId>
        <groupId>com.haiexijun.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>user-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


order-service子项目:


<?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>cloud-demo</artifactId>
        <groupId>com.haiexijun.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>order-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


然后我们来看一下这俩个子项目的具体内容:

先从来看user-service的yml配置文件:


server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: zc20020106
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  type-aliases-package: com.haiexijun.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.haiexijun: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS


启动类上要加上@MapperScan注解(日常mybatis研发,需要在每个interface配置@Mapper,为了开发简便使用@MapperScan可以指定要扫描的Mapper类的包的路径)


package com.haiexijun.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;
@MapperScan("com.haiexijun.user.mapper")
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}


然后下面是web包下的controller类的相关代码:


package com.haiexijun.user.web;
import com.haiexijun.user.pojo.User;
import com.haiexijun.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}


service层的代码:


package com.haiexijun.user.service;
import com.haiexijun.user.mapper.UserMapper;
import com.haiexijun.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    public User queryById(Long id) {
        return userMapper.findById(id);
    }
}


pojo和mapper:


package com.haiexijun.user.pojo;
import lombok.Data;
@Data
public class User {
    private Long id;
    private String username;
    private String address;
}
package com.haiexijun.user.mapper;
import com.haiexijun.user.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
    @Select("select * from tb_user where id = #{id}")
    User findById(@Param("id") Long id);
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
5月前
|
Java 开发工具 git
实现基于Spring Cloud的配置中心
实现基于Spring Cloud的配置中心
|
5月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
5月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
15020 33
|
5月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
543 15
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
117 3
|
5月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
192 5
|
5月前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
5月前
|
存储 安全 Java
实现基于Spring Cloud的分布式配置管理
实现基于Spring Cloud的分布式配置管理