Spring Cloud Of Microservice Technology


什么是微服务

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

微服务架构囊括了多个技术维度,大概从以下这些方面:

2020 年以前主流的微服务技术

  • 服务注册与发现:EUREKA
  • 服务调用:NETFLIX OSS RIBBON
  • 服务熔断:HYSTRIX
  • 负载均衡:NETFLIX FEIGN
  • 服务消息队列
  • 配置中心管理:Spring Cloud Config
  • 服务网关:NETFLIX OSS Zuul
  • 服务监控
  • 全链路追踪
  • 自动化构建部署
  • 服务定时任务调度操作

服务开发:Spring Boot

Spring Boot 和 Spring Cloud 版本选择

Spring Boot 一般以数字作为版本号,Spring Cloud 在 2020.0.5 GA 版本之前,都是以伦敦地铁站的英文单词,且首字母大写按照字母表升序,2020.0.5 GA 版本之后开始以数字为版本号。

至于 Spring Boot 和 Spring Cloud 版本的对应关系,可以参考官方文档:https://spring.io/projects/spring-cloud#overview

目前是这样的:

更详细的版本映射,可以利用 Spring 官方提供的一个 api:https://start.spring.io/actuator/info

该 api 返回一个 JSON 字符串,我们利用 JSON 工具对其进行转化:

那么如果要和 Spring Cloud Alibaba 进行集成该如何确定版本关系呢?我们可以去 Spring Cloud Alibaba 的 Github 的 wiki 上看到相关信息:https://github.com/alibaba/spring-cloud-alibaba/wike

找到版本说明:

学习环境搭建

到此可以确定我们的技术选型:

  • Spring Cloud Hoxton.SR12
  • Spring Cloud Alibaba 2.2.7.RELEASE
  • Spring Boot 2.3.12.RELEASE
  • JDK 1.8 +
  • Maven 3.5 +
  • MySQL 5.7 +

Spring Cloud 停更组件

1、停更

停更不停用:

  • 被动修复 bug
  • 不在接收合并请求
  • 不在发布新版本

2、升级

项目构建

Maven 聚合工程 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>io.github.naivekyo</grou
        pId>
    <artifactId>Spring_Cloud_Study</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <mysql.version>5.1.49</mysql.version>
        <druid.version>1.2.8</druid.version>
        <mybatis.version>2.2.0</mybatis.version>
        <lombok.version>1.18.24</lombok.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            
            <!-- spring boot 2.3.12.RELEASE -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.12.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Hoxton.SR12-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Alibaba 2.2.7.RELEASE -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.7.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- mysql driver -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!-- druid spring boot starter -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- mybatis spring boot starter -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.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>

有几个要点:

  • 打包方式:<packaging>pom</packaging>
  • 锁定依赖 :dependencyManagement
  • Spring Boot 的 Maven 插件
  • 跳过单元测试:通过 IDEA Maven 插件上的 Toggle 'Skip Tests' Mode 按钮,来禁用 Maven 生命周期中的 test

热部署(可选)

Spring Boot 提供了一个 DevTools 工具用于热部署。

(1)首先需要将下面的依赖添加到我们的服务模块中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

(2)然后添加一段 Maven 的插件配置到父工程的 pom 文件中:

<build>
    <finalName>工程的名字(可选)</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

(3)开启 IDEA 的自动编译功能

(4)热部署快捷键:ctrl + F9

其实这个热部署工具的本质还是重启服务,所以就算不使用也可以,更改了后台代码后重启服务即可


Author: NaiveKyo
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source NaiveKyo !
  TOC