Spring全家桶--SpringCloud(初级)(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring全家桶--SpringCloud(初级)(一)

前言


源码地址:

https://github.com/YuyanCai/SpringCloudDemo


https://gitee.com/cai-yuyan/SpringCloudDemo


软件包:

链接:https://pan.baidu.com/s/1ZqyOC4j_bTWPbp9cPZMZcA

提取码:kqvs


一、微服务介绍


微服务是一种架构风格

一个应用拆分为一组小型服务

每个服务运行在自己的进程内,也就是可独立部署和升级

服务之间使用轻量级HTTP交互

服务围绕业务功能拆分

可以由全自动部署机制独立部署

去中心化,服务自治。服务可以使用不同的语言、不同的存储技术


SpringCloud=分布式微服务架构的站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶


1.1 分布式系统定义


随着业务量的增大,我们不可能把所有的功能都放在一台服务器上,所以我们用很多台服务器每个服务器上都放一点服务,把业务分散在多台主机上。分布在多个主机上也不行啊,怎么处理它们之间的关系呢?


没错,这个管理者就是我们今天的主角------》Dubbo


40.png


1.2 应用架构的演变

41.png


1.2.1 单一应用架构

42.png


1.2.2 垂直应用架构

43.png


1.2.3 分布式应用架构


RPC:分布式服务框架


主要解决不同服务器之间的远程调用问题


44.png


1.2.4 流动计算架构

分布式架构还存在问题就是资源调度问题,某个服务器请求突然多了,某个服务器很少请求。那么如何协调它们的资源呢,让闲着的帮忙的干点事


之后呢,出现了流动计算机架构。引入了调度中心能解决资源调度问题


45.png


1.3 RPC


1.3.1 什么是RPC?


将java对象转化为字节流的过程就叫序列化


将字节流转化为java对象的过程就叫反序列化


当java对象需要在网络上进行传输或者持久化存储到文件中,就需要对java对象进行序列化


对于一个RPC框架好坏的评判就是建立起网络连接的速度快不快,序列化与反序列化的速度快不快


简而言之RPC的核心模块就是:通讯,序列化


RPC(Remote Producedure Call)是指远程过程调用,是一种进程间的通信方式,它是一种技术思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。


46.png


1.3.2 实例


客户端A想调用客户端b的方法,那么要经过如下过程


47.png


1.4 Spring Cloud简介


是什么?符合微服务技术维度


SpringCloud=分布式微服务架构的站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶


48.png


SpringCloud俨然已成为微服务开发的主流技术栈,在国内开发者社区非常火爆。


1.4.1 什么是微服务


微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。


每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。


另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。


微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。


1.4.2 微服务架构优势


01复杂度可控


在将应用分解的同时,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。


由于体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌控,易于保持高可维护性和开发效率。


02独立部署


由于微服务具备独立的运行进程,所以每个微服务也可以独立部署。当某个微服务发生变更时无需编译、部署整个应用。


由微服务组成的应用相当于具备一系列可并行的发布流程,使得发布更加高效,同时降低对生产环境所造成的风险,最终缩短应用交付周期。


03技术选型灵活


微服务架构下,技术选型是去中心化的。每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈。


由于每个微服务相对简单,所以需要对技术栈进行升级时所面临的风险就较低,甚至完全重构一个微服务也是可行的。


04容错


当某一组件发生故障时,在单一进程的传统架构下,故障很有可能在进程内扩散,形成应用全局性的不可用。


在微服务架构下,故障会被隔离在单个服务中。若设计良好,其他服务可通过重试、平稳退化等机制实现应用层面的容错。


05扩展


单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。


1.4.3 Spring Cloud 都做了哪些事


Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。


Spring 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装、屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。


以下为 Spring Cloud 的核心功能:


分布式/版本化配置。

服务注册和发现。

路由。

服务和服务之间的调用。

负载均衡。

断路器。

分布式消息传递。


1.4.4 Spring Cloud 工具框架


Spring Cloud Config,配置中心,利用 git 集中管理程序的配置。


Spring Cloud Netflix,集成众多 Netflix 的开源软件。


Spring Cloud Bus,消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化 。


Spring Cloud for Cloud Foundry,利用 Pivotal Cloudfoundry 集成你的应用程序。


Spring Cloud Foundry Service Broker,为建立管理云托管服务的服务代理提供了一个起点。


Spring Cloud Cluster,基于 Zookeeper、Redis、Hazelcast、Consul 实现的领导选举和平民状态模式的抽象和实现。


Spring Cloud Consul,基于 Hashicorp Consul 实现的服务发现和配置管理。


Spring Cloud Security,在 Zuul 代理中为 OAuth2 rest 客户端和认证头转发提供负载均衡。


Spring Cloud Sleuth Spring Cloud,应用的分布式追踪系统和 Zipkin、HTrace、ELK 兼容。


Spring Cloud Data Flow,一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。


Spring Cloud Stream,基于 Redis、Rabbit、Kafka 实现的消息微服务,简单声明模型用以在 Spring Cloud 应用中收发消息。


Spring Cloud Stream App Starters,基于 Spring Boot 为外部系统提供 Spring 的集成。


Spring Cloud Task,短生命周期的微服务,为 Spring Boot 应用简单声明添加功能和非功能特性。


Spring Cloud Task App Starters。


Spring Cloud Zookeeper,服务发现和配置管理基于 Apache Zookeeper。


Spring Cloud for Amazon Web Services,快速和亚马逊网络服务集成。


Spring Cloud Connectors,便于 PaaS 应用在各种平台上连接到后端像数据库和消息经纪服务。


Spring Cloud Starters,项目已经终止并且在 Angel.SR2 后的版本和其他项目合并。


Spring Cloud CLI,插件用 Groovy 快速的创建 Spring Cloud 组件应用。


这个数量还在一直增加…


1.4.5 什么是 Spring Boot


Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。


用我的话来理解,就是 Spring Boot 不是什么新的框架,它默认配置了很多框架的使用方式,就像 maven 整合了所有的 jar 包,Spring Boot 整合了所有的框架(不知道这样比喻是否合适)。


Spring Boot 简化了基于 Spring 的应用开发,通过少量的代码就能创建一个独立的、产品级别的 Spring 应用。Spring Boot 为 Spring 平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。


Spring Boot 的核心思想就是约定大于配置,多数 Spring Boot 应用只需要很少的 Spring 配置。采用 Spring Boot 可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。


1.4.6 三者之间的关系


微服务是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。


Spring Boot 是一套快速配置脚手架,可以基于 Spring Boot 快速开发单个微服务。


Spring Cloud 是一个基于 Spring Boot 实现的服务治理工具包;Spring Boot 专注于快速、方便集成的单个微服务个体;Spring Cloud 关注全局的服务治理框架。


Spring Boot / Cloud 是微服务实践的最佳落地方案。


二、环境说明


以下示例版本版本选型


Cloud - Hoxton.SR1


Boot - 2.2.2.RELEASE


Cloud Alibaba - 2.1.0.RELEASE


Java - Java 8


Maven - 3.5及以上


MySQL - 5.7及以上


版本选择


49.png


三、父工程Project空间新建


archetype 英 [ˈɑːkitaɪp] 美 [ˈɑːrkitaɪp]

n. 典型


site 英 [saɪt] 美 [saɪt]

n. (建筑物、城镇等的)地点,位置,建筑工地;现场;发生地;场所;网站;站点

v. 使坐落在;为…选址


约定 > 配置 > 编码


创建微服务cloud整体聚合父工程Project,有8个关键步骤:


New Project - maven工程 - create from archetype: maven-archetype-site

聚合总父工程名字

Maven选版本

工程名字

字符编码 - Settings - File encoding

注解生效激活 - Settings - Annotation Processors

Java编译版本选8

File Type过滤 - Settings - File Type


3.1 父工程pom文件


我们用父工程做maven的版本依赖,在父工程中声明版本,后序maven工程继承父工程就不用写v,只写ga即可


<?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.caq.cloud</groupId>
    <artifactId>cloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>cloud-provider-payment8001</module>
        <module>cloud-api-commons</module>
        <module>cloud-customer-order80</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.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.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>
    <!-- 子模块继承之后,提供作用:
        锁定版本+子modlue不用写groupId和version -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</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>2.1.0.RELEASE</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>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.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>


3.2 dependencyManagement


Maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。


通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。


使用pom.xml中的dependencyManagement元素能让所有在子项目中引用个依赖而不用显式的列出版本量。


Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个

dependencyManagement元素中指定的版本号。


<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>mysq1</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.2</version>
        </dependency>
    <dependencies>
</dependencyManagement>


然后在子项目里就可以添加mysql-connector时可以不指定版本号,例如:


<dependencies>
    <dependency>
    <groupId>mysq1</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>


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


如果不在子项目中声明依赖,是不会从父项目


子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version


如果子项目指定了版本号, 那么使用子项目中指定的jar版本


四、支付模块构建


4.1 创建微服务模块套路


1.建Module

2.改POM

3.写YML

4.主启动

5.业务类


50.png

创建cloud-provider-payment8001微服务提供者支付Module模块:


建立后的目录结构如下:


51.png


1.建名为cloud-provider-payment8001的Maven工程


2.改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">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.caq.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-provider-payment8001</artifactId>
    <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>
            <version>1.1.10</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <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: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/db2022?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.caq.cloud.entities    # 所有Entity别名类所在包


4.主启动


package com.caq.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PaymentMain001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain001.class, args);
    }
}


4.2 业务类小套路


5.业务类


1.业务类也有对应的套路:

2.建表SQL

3.entities(主实体类,JSON封装体)

4.dao(接口,mybatis映射文件)

5.service(service和impl)

6.controller


SQL:

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=utf8mb4


Entities:


实体类Payment:


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
    private Long id;
    private String serial;
}


JSON封装体CommonResult:


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T>{
    private Integer code;
    private String message;
    private T data;
    public CommonResult(Integer code, String message){
        this(code, message, null);
    }
}


DAO:


接口PaymentDao:


package com.caq.cloud.dao;
import com.caq.cloud.entities.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 */
@Mapper
//@Repository不用Spring的
public interface PaymentDao
{
    public int create(Payment payment);
    public Payment getPaymentById(@Param("id") Long id);
}


MyBatis映射文件PaymentMapper.xml,路径:


resources/mapper/PaymentMapper.xml
<?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.caq.cloud.dao.PaymentDao">
    <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
        insert into payment(serial)  values(#{serial});
    </insert>
    <resultMap id="BaseResultMap" type="com.caq.cloud.entities.Payment">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <id column="serial" property="serial" jdbcType="VARCHAR"/>
    </resultMap>
    <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
        select * from payment where id=#{id};
    </select>
</mapper>


Service:


接口PaymentService


package com.caq.cloud.service;
import com.caq.cloud.entities.Payment;
import org.apache.ibatis.annotations.Param;
/**
 */
public interface PaymentService
{
    public int create(Payment payment);
    public Payment getPaymentById(@Param("id") Long id);
}


实现类


package com.caq.cloud.service.impl;
import com.caq.cloud.dao.PaymentDao;
import com.caq.cloud.entities.Payment;
import com.caq.cloud.service.PaymentService;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 */
@Service
public class PaymentServiceImpl implements PaymentService
{
    @Resource
    private PaymentDao paymentDao;
    public int create(Payment payment)
    {
        return paymentDao.create(payment);
    }
    public Payment getPaymentById(Long id)
    {
        return paymentDao.getPaymentById(id);
    }
}


Controller:


package com.caq.cloud.controller;
import com.caq.cloud.entities.CommonResult;
import com.caq.cloud.entities.Payment;
import com.caq.cloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 *
 */
@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;
    @PostMapping(value = "/payment/create")
    public CommonResult<Payment> create(Payment payment) {
        int result = paymentService.create(payment);
        log.info("*****插入结果:" + result);
        if (result > 0) {
            return new CommonResult(200, "插入数据库成功",result);
        } else {
            return new CommonResult(444, "插入数据库失败", null);
        }
    }
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        Payment payment = paymentService.getPaymentById(id);
        if (payment != null) {
            return new CommonResult<Payment>(200, "查询成功433", payment);
        } else {
            return new CommonResult<Payment>(444, "没有对应记录",null);
        }
    }
}


4.3 支付模块测试

我们用postman来模拟请求


52.png


53.png


4.4 热部署Devtools


开发时使用,生产环境关闭


1.Adding devtools to your project


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


2.Adding plugin to your pom.xml


下段配置复制到聚合父类总工程的pom.xml


<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.Enabling automatic build


File -> Settings(New Project Settings->Settings for New Projects) ->Complier


下面项勾选


Automatically show first error in editor

Display notification on build completion

Build project automatically

Compile independent modules in parallel


54.png


4.Update the value of


键入Ctrl + Shift + Alt + / ,打开Registry,勾选:


compiler.automake.allow.when.app.running


actionSystem.assertFocusAccessFromEdt


5.重启IDEA

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SpringCloudAlibaba Java Spring
阿里内部最新教材:Spring+SpringBoot+SpringCloud全家桶第五版
给大家分享的就是一份来自阿里的Spring+SpringBoot+SpringCloud全家桶实战手册!本手册包含了spring源码+springboot+springcloudAlibaba全彩笔记!
|
SQL Java Spring
Spring 全家桶之 Spring Data JPA(二)(下)
Spring 全家桶之 Spring Data JPA(二)
Spring 全家桶之 Spring Data JPA(二)(下)
|
SQL 存储 Java
Spring全家桶--SpringBoot之入门JPA
Spring全家桶--SpringBoot之入门JPA
Spring全家桶--SpringBoot之入门JPA
|
存储 负载均衡 网络协议
Spring全家桶--SpringCloud(初级)(二)
Spring全家桶--SpringCloud(初级)(二)
138 0
Spring全家桶--SpringCloud(初级)(二)
|
负载均衡 监控 算法
Spring全家桶--SpringCloud(初级)(三)
Spring全家桶--SpringCloud(初级)(三)
203 0
Spring全家桶--SpringCloud(初级)(三)
|
消息中间件 监控 搜索推荐
Spring全家桶--SpringCloud(中级)(三)
Spring全家桶--SpringCloud(中级)(三)
142 0
Spring全家桶--SpringCloud(中级)(三)
|
存储 消息中间件 监控
Spring全家桶--SpringCloud(中级)(二)
Spring全家桶--SpringCloud(中级)(二)
130 0
Spring全家桶--SpringCloud(中级)(二)
|
监控 负载均衡 Java
Spring全家桶--SpringCloud(中级)(一)
Spring全家桶--SpringCloud(中级)(一)
280 0
Spring全家桶--SpringCloud(中级)(一)
|
Java 调度 数据库
Spring全家桶--SpringCloud(高级)(三)
Spring全家桶--SpringCloud(高级)(三)
169 0
Spring全家桶--SpringCloud(高级)(三)
|
存储 Dubbo Java
Spring全家桶--SpringCloud(高级)(一)
Spring全家桶--SpringCloud(高级)(一)
301 0
Spring全家桶--SpringCloud(高级)(一)