微服务架构

  • 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合:可以通过HTTP的方式进行互通。要学习微服务架构先了解一下过去的单体应用架构

单体应用架构

  • 所谓单体应用架构(all in one)是指,我们将一个应用的中的所有应用服务都封装在一个应用中
  • 无论是ERP、CRM或是其他什么系统,你都把数据库访问,web访问, 等等各个功能放到一个war包内
  • 这样做的好处是,易于开发和测试;也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了
  • 单体应用架构的缺点是,哪怕我要修改一个非常小的地方,我都需要停掉整个服务,重新打包、部署这个应用war包。特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,如何维护、如何分工合作都是问题

微服务架构

  • all in one的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后在负载均衡
  • 所谓微服务架构,就是打破之前all in one的架构方式,把每个功能元素独立出来。把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元索进行复制,而没有对整个应用进行复制
  • 微服务架构思想由Martin Fowler(马丁富勒)提出,他国际著名的OO专家,敏捷开发方法的创始人之一,现为ThoughtWorks公司的首席科学家。在面向对象分析设计、UML、模式、软件开发方法学、XP、重构等方面,都是世界顶级的专家,现为Thought Works公司的首席科学家
  • 关于微服务架构可以查阅他的论文:https://martinfowler.com/articles/microservices.html

如何构建

  • 一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元就是一个功能元素,它们各自完成自己的功能,然后通过http相互请求调用
  • 比如一个电商系统,查缓存、连数据库、浏览页面、结账、支付等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建了一个庞大的系统。如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可
  • 但是这种庞大的系统架构给部署和运维带来很大的难度。于是, Spring为我们带来了构建大型分布式微服务的全套、全程产品:
    • 构建一个个功能独立的微服务应用单元,可以使用SpringBoot, 可以帮我们快速构建一个应用
    • 大型分布式网络服务的调用,这部分由Spring Cloud来完成,实现分布式
    • 在分布式中间,进行流式数据计算、批处理,我们有spring cloud data flow.
    • Spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案

SpringBoot

SpringBoot简介

  • SpringBoot就是一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置, you can “just run”,能迅速的开发web应用,几行代码开发一个HTTP接口
  • 随着 Spring 不断的发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么易用简单,违背了最初的理念,甚至人称配置地狱。Spring Boot 正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用 Spring 、更容易的集成各种常用的中间件、开源软件
  • Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用
  • 简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架

SpringBoot项目创建

  • Spring官方提供了非常方便的工具让我们快速构建应用
  • 项目创建方式一:使用Spring Initializr 的 Web页面创建项目
    • 打开 https://start.spring.io/
    • 填写项目信息
    • 点击【Generate Project】按钮生成项目;下载此项目
    • 解压项目包,并用IDEA以Maven项目导入,一路下一步即可,直到项目导入完毕
    • 如果是第一次使用,可能速度会比较慢,包比较多、需要耐心等待一切就绪

  • 项目创建方式二:使用 IDEA 直接创建项目
    • 创建一个新项目
    • 在右侧选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现
    • 填写项目信息,注意包名最好改一下比较好
    • 选择初始化的组件(初学勾选 Web 即可)
    • 填写项目路径
    • 等待项目构建成功

使用Spring官网创建项目可能会出现网络连接问题,可以自定义URL使用http://start.aliyun.com 阿里云的链接进行项目创建

项目结构

  • 如果没有勾选Web,只需导入web依赖即可
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
  • 随便建立一个Controller进行测试
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello(){
return "hello";
}
}
  • 然后重新启动项目,访问http://localhost:8080/hello/hello

  • resources下有一个application.properties可以修改端口号和其他配置信息
1
2
# 更改项目的端口号
sever.port=8081
  • 还可以修改SpringBoot启动的Banner字符图,可以参考网站:https://www.bootschool.net/ascii/,复制字符图,在resources下新建一个banner.txt文件,然后粘贴进去,重启项目即可