文章目录
一、微服务
微服务,又叫微服务架构,是一种软件架构方式。它将应用构建成一系列按业务领域划分模块的、小的自治服务。
微服务架构提倡将一个单一的应用程序拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间使用轻量级通信机制(通常是 HTTP RESTFUL API)进行通讯。
特点:
- 解耦:同一个系统的服务大部分都可以解耦,可以轻易的构建、扩展
- 组件化:微服务可以看做相互独立的组件,可以轻易替换和升级
- 错误隔离:某个服务发生了故障,整个系统可以继续工作
- 混合技术栈:可以使用不同的语言和技术来为同一个应用构建不同的服务
二、SpringCloud
1.什么是SpringCloud
SpringCloud:分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体
它提供了一套简单易用的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务系统的构建
Spring Cloud 包括 Spring Cloud Gateway、Spring Cloud Config、Spring Cloud Bus 等近 20 个服务组件,这些组件提供了服务治理、服务网关、智能路由、负载均衡、熔断器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。
SpringCloud有两代实现:
- 第一代实现:Spring Cloud Netflix
- 第二代实现:Spring Cloud Alibaba
2. SpringCloud的版本
为了避免SpringCloud版本号与子项目版本号混淆, SpringCloud版本采用 了名称而非版本号的命名,这些版本的名字采用了伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序。例如Ange|是第一个版本, Brixton是第二个版本。
当SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后, 会发布一个"service releases"版本,简称SRX版本,比如Greenwich.SR2就是SpringCloud发布的Greenwich版本的第2个SRX版本。
从2020年开始SpringCloud改回用年号命名版本号 ,比如Spring Cloud 2020.0.1
3.SpringBoot与SpringCloud的区别与联系
- 分工不同
SpringBoot是基于Spring的快速开发框架,专注于快速、方便的开发单个微服务
SpringCloud是微服务的大管家,负责将SpringBoot开发的微服务管理起来。 - 依赖数量不同
SpringBoot属于轻量级框架,构建工程所需要的依赖少
SpringCloud是一系列微服务框架的集合体,每个组件都需要独立的依赖项 - Spring Cloud 是基于 Spring Boot 实现的
- Spring Cloud 不能脱离 Spring Boot 单独运行
SpringCloud不能独立的创建工程或模块,不能脱离Spring Boot 单独运行
Spring Boot 能够用于开发单个微服务,但它并不具备管理和协调微服务的能力
SpringBoot与SpringCloud的版本对应关系:
官方网站:http://spring.io/projects/spring-cloud
如果项目中使用Spring Cloud Alibaba,也需要配置Alibaba 的版本
git:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
JSON版版本对应关系:https://start.spring.io/actuator/info
4.阿里微服务架构案例
5.SpringCloud 的组件
目前停更、依旧火热的组件
三、SpringCloud环境搭建
1.创建微服务cloud整体聚合父工程Project
New Project -> maven工程 -> create from archetype: maven-archetype-site
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.heng</groupId>
<artifactId>cloud2020test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Maven</name>
<!-- 统一管理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>
<!-- 1、只是声明依赖,并不实际引入,子项目按需声明使用的依赖 -->
<!-- 2、子项目可以继承父项目的 version 和 scope -->
<!-- 3、子项目若指定了 version 和 scope,以子项目为准 -->
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
(1)更改<packaging> 为pom是什么意思
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元
pom的意思是项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的
配置<packaging>pom</packaging>的意思是使用maven分模块管理,都会有一个父级项目,pom文件一个重要的属性就是packaging(打包类型),一般来说所有的父级项目的packaging都为pom
packaging默认类型jar类型,如果不做配置,maven会将该项目打成jar包。
项目的打包类型:pom、jar、war
packing默认是jar类型,
pom ---------> 父类型都为pom类
jar ---------> 内部调用或者是作服务使用
war ---------> 需要部署的项目
(2)DependencyManagement的作用
Maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。
使用pom.xml中的dependencyManagement元素能让所有在子项目中引用个依赖而不用显式的列出版本量。
当子项目声明依赖,并且没有指定具体的版本,Maven会向父工程寻找,直到找到dependencyManagement元素,然后它会使用这个元素中指定的版本号。
注意:如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
注意:dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
3.创建微服务模块
- 建Module
- 改POM
- 写YML
- 主启动
- 业务类