前言
随着软件工程的规模的迅速扩大,对响应的速度的要求的越来越高,软件的开发过程面临越来越大的挑战。为了提高开发的效率,和质量,以及对成本的压缩,对软件的模块化,以及希望像硬件模块一样,能即插即用,成为了迫切的需求。软件架构上的服务化是即它的体现,因为服务的粒度比较大,难以复用,在这种背景下,微服务的架构,应运而生。
微服务以进程的边界进行隔离,微服务与微服务之间的关系是契约的方式规定了它们之间的权利与责任,这样可以实现对微服务的开发的分工与合作。即不同的开发团队开发各自微服务,再进行相应的系统集成,从而完成了由对小模块的组装来生产出大系统的任务。
那么我们下面来了解什么是微服务,以及spring家族为了解决微服务提供的解决方案Spring Cloud。
一、什么是微服务?
微服务是由Martin Fowler(马丁福勒)提出的,Martin Fowler对在他的论文中提到对微服务的解释:通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务也可以使用不同的数据存储。对于Martin Fowler的论文有兴趣的学者可以点击https://martinfowler.com/articles/microservices.html进行浏览。
二、微服务发展历程各个阶段的特性
2.1 单体架构
特点:
① 所有功能集中在一个项目中。
② 所有功能都要打成war包部署到服务器。
③ 通过集群(session共享集群)来提高服务器的性能。
优点:
① 项目架构简单,前期开发的成本低,周期短,小型企业首先。
缺点:
① 全部的功能都集中在一个项目中完成,对于大型项目来说,开发难度高,不容易开发及扩展和维护。
2.2 垂直结构
特点:
① 以单体架构为单位进行系统的划分,划分成一个个系统。
② 项目与项目之间存在数据冗余,耦合度高。
③ 项目是以接口调用为主,存在数据同步问题。
优点:
① 项目架构简单,前期开发的成本低,周期短,小型企业首选。
② 垂直架构进行mvc分层设计,针对分层做相应的处理做到集群(10~1000)。
③ 不同的项目采用不同的技术实现。
缺点:
① 全部的功能都集中在一个项目中完成,对于大型项目来说,开发难度高,不容易开发及扩展和维护。
② 集群扩展有瓶颈集群(10~1000)针对分层做了优化。
2.3 soa面向服务架构
特点:
① 基于soa服务思想进行功能的抽取(重复代码问题解决),以服务为中心来管理项目。
② 各个系统之间要进行调用,所以出现ESB来管理项目(可以使用各种技术实现:webservice,rpc等)。
③ ESB是作为系统与系统之间桥梁,很难进行统一管理。
优点:
① 重复代码进行了抽取,提高了开发效率,提高了系统的可维护性。
② 可以针对某个系统进行扩展,做集群更容易。
③ 采用ESB来管理服务组件,有利于降低企业开发项目难度 。
缺点:
① 系统与服务的界限模糊的,不利于设计。
② ESB是作为系统与系统之间桥梁,没有统一标准,种类很多,不利于维护,抽取项目的粒度大,系统与服务之间解耦问题。
2.4 微服务架构
特点:
① 把系统的服务层完全独立出来,有利于资源的重复利用,提高开发效率。
② 微服务遵守单一原则。
③ 微服务与微服务之间的调用使用restful轻量级调用。
优点:
① 微服务拆分更细,有利于资源的重复利用,提高开发效率。
② 可以更加精准针对某个服务做方案。
③ 微服务去中心化,使用restful轻量级通信协议比使用ESB企业服务总线更容易维护。
④ 适应市场更容易,产品迭代周期更短。
缺点:
① 微服务量多,服务治理成本高,不利于系统维护.分布式系统架构且是微服务架构,技术成本高(容错,分布式事务等),对团队高挑战。
三、Spring Cloud入门
3.1 Spring Cloud和Spring Boot的区别
Spring boot专注于快速方便的单个个体微服务,可以独立于Spring cloud开发项目。
Spring cloud关注全局的微服务协调整理治理框架,它将Spring boot开发的一个个单体微服务整合并管理起来为各个微服务之间提供配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等集成服务(全局服务治理框架)。
3.2 Spring Cloud和Dubbo的区别
服务注册中心 | Zookeeper | SpringCloud Netflix Eureka |
服务调用方式 | RPC远程过程调用 | REST API(RESTFUL风格,应用程序接口) |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netflix Hystrix |
服务网关 | 无 | Spring Cloud Netflix Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
小结:Dubbo的定位始终是一款RPC框架,Spring Cloud的目标是微服务框架下的一栈式解决方案,Dubbo可以类比到Netflix OSS技术栈,而Spring Cloud继承了Netflix OSS作为分布式服务治理解决方案,Dubbo、Spring Cloud只能二选一。
参考书地址:https://springcloud.cc/spring-cloud-netlix.html
开发API说明英文文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR1/
开发API说明中文文档:https://springcloud.cc/spring-cloud-dalston.html
问题解决:http://springcloud.cn https://springcloud.cc
四、项目启动
4.1 环境以及软件(可选)
1、window10操作系统
2、JDK8
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
3、eclipse2019(J2EE版)https://www.eclipse.org/downloads/
4、MySQL-5.7
4.2 创建父工程
首先,我们选择Maven Project并创建Maven工程作为我们的父工程,点击Maven Project 进入创建,在创建Maven Project的过程中我们需要特别注意Packaging的类型,作为父工程我们需要选择Packaging类型为pom类型。
创建完Maven Project工程之后,我们需要在父工程配置pom.xml文件,在此我说一下父工程的作用:父工程只有一个pom.xml文件是值得我们注重的,它是子工程的依赖集成,子工程所需要的依赖可以配置在父工p程的pom.xml文件中,子工程具体操作会在后续说明。
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>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!---定义版本可变量<$.version>*</$.version>-->
<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>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<!---连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>microservicecloud-api</module>
<module>microservicecloud-provider-dept-8001</module>
</modules>
</project>
4.3 创建子工程—API公共工具模块
4.3.1 创建工程
PI公共工具模块,在这里充当一个持久化层和公共工具的集成。我们在这里放置常用的工具类和定义持久化类。
我们创建子工程时不再选择以往的Maven Project工程进行创建。我们要选择Maven Module进行创建,在创建时我们需要定义我们的子工程名字和选择父工程。具体创建步骤请看下图。
1、选择Maven Module工程
2、定义API公共工具模块的名称,选择父工程
完成上面步骤后点击next。3、选择Packaging类型
完成上面步骤后点击finish完成创建。
4.3.2配置pom文件
<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>
<parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId><!--定要注意这里是要继承的父工程的名字 -->
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->
<dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
这里说明一下,在子工程中我们所需要的jar还是要写在pom文件里面的。但是,如果我们子工程所需要的依赖在父工程中已经存在,那么子工程的pom的依赖不用写版本号。
4.3.3 创建持久化类
以创建Dept类为示例:
- 必须继承序列化接口Serializable
- 全参构造函数@AllArgsConstructor
- 空串构造函数@NoArgsConstructor
- setter和getter构造函数@Data
- 链式风格访问@Accessors(chain=true)
注意:Lombok插件需要安装,如已安装请忽略
@data注解是需要安装Lombok插件的,在安装Lombok插件之后@data注解才会生效。在这里我给出Lombok插件的安装教程。https://jingyan.baidu.com/article/22fe7cede363d83002617f3a.html
小结
写到这里我们基本上了解微服务和Spring Cloud的基本创建方法了。总体来说,微服务是把我们以前的一个Maven工程包含所有业务,拆分成一个父工程,多个子工程的多maven项目系统。我们可以把每一个子工程称之为子系统。每一个子工程只负责单一且专一的业务。每一个子工程独立运行。拥有明显的层次逻辑。这种开发方式下,如果在某一子工程出现问题并不会影响整一个系统的运行。所以一定程度上也是确保了系统的安全性。
此次文档是入门篇,我们会在后续的时间里继续对springcloud和微服务进一步的深入学习。