好久不见,甚是想念!!!!冲冲冲
一.微服务架构概述
系统架构
系统架构与设计将系统分为集中式系统和分布式系统。集中式系统也就是单体应用,就是把所有的程序,功能,模块都集中到一个项目中去,部署在一台服务器上,从而对外提供服务;分布式系统是把所有的程序拆分成不同的子系统,部署在多台不同的服务器上,这些子系统相互协作共同对位提供服务。集中式系统和分布式系统的区别就是体现在“合”与“分”。随着业务的发展,应用功能的增加,代码量大逻辑复杂,所有需要按照业务维度进行拆分,采用分布式开发会成为主流。
什么是微服务架构?
微服务架构属于分布式的范畴,微服务是系统架构上的设计风格,旨在将一个原本独立的系统拆分成多个小型服务,这些小型服务能够独立运行,分散治理,不同服务之间通过智能端点和哑管道建立通信协作;被拆分后的每一个小型服务都围绕着系统中的某一项业务功能进行构建,每个服务都是独立的项目,可以进行独立的开发,测试和部署等;这些微服务也可以使用不同语言来开发。
微服务间通信
智能端点和哑管道(马丁.福勒在Microservices原文Smart endpoints and dumb pipes);第一种方式采用带有资源API的HTTP请求响应和轻量级消息传递。第二种方式通过轻量级消息总线进行消息传递,基础机构通常是dumb- simple的实现(哑巴仅用作消息路由)例如RabbitMQ去提供一个可靠的异步结构。
SpringCloud构成微服务
整个微服务架构是由大量技术框架和方案构成。服务注册与发现,服务调用,负载均衡,断路器,网关,分布式配置管理;大部分开源组件智能解决某一个场景下的问题,要开发一个微服务需要整合这些来自不同公司的诸多开源框架,没有一个统一的架构方案,导致前期需要花费大量的时间进行分析做技术选型,可能在实践中还会遇到各种问题。SpringCloud的出现,它是一个整合了优秀基础组件的微服务架构实施综合解决性框架,有SpringCloud社区的支持和技术保证,让实施微服务架构变的简单。
二.SpringCloud
SpringCloud是基于SpringBoot的Spring集成应用程序。为开发者提供一系列常见模式的工具集,
服务治理
当我们开始一个项目的时候,通常在属性文件中进行所有配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。服务注册和发现就是在这种情况下提供帮助,用于实现各个微服务之间的自动注册和服务发现,可以说微服务框架下最核心最基本的就是服务治理。
负载均衡
负载均衡是可以改善跨计算机,计算机集群,网络链接,中央处理单元或者磁盘驱动器等多种资源的工作负载分布。负载均衡目的就是在于优化资源的使用,最大化吞吐量,最小化响应时间,提高用户使用体验为了避免任何单一资源的过载。服务器端负载均衡是当客户端的请求到达负载均衡服务器时,会按照规则去分配一台服务器去处理客户端的请求;客户端负载均衡如使用Ribbon从注册中心去获取服务端的列表,然后进行轮询访问达到负载均衡的作用。
服务熔断(断路器)
断路器本身是一种开关装置,用在电路上保护线路过载,当线路中的电器发生短路时,能够及时切断故障电路,防止起火等严重后果。在微服务架构中,当某个服务响应太慢,或者因为网络波动,则会造成调用失败,当大量请求到达,则会造成请求的堆积,会导致用户服务也不可用,很容易造成服务故障蔓延引起系统瘫痪。断路器就是为了防止分布式系统中出现瀑布式的连锁反应导致的灾难。
网关
在微服务架构中,每个微服务都有不同的url地址,这就会产生一些问题,用户请求不同的微服务时,必须记住每个微服务的url,认证复杂,还存在跨域问题,为了解决这些问题引入API网关。API网关就是系统的统一入口,为客户端提供统一入口的服务,能够实现认证,授权,监控,路由转发等等。
三.SpringCloud快速开发
SpringCloud Alibaba是SpringCloud下的一个子项目,SpringCloud Alibaba为分布式应用程序开发提供了一站式解决方案,通过阿里中间件来迅速搭建分布式应用系统。
模块设计
搭一个简单的微服务项目,目的是了解SpringCloud Alibaba内包含的组件,及其使用场景。
工程名 | 描述 | 端口 |
---|---|---|
springcloud-alibaba | 父工程 | - |
sc-common | 公共模块,放置实体类和工具类 | - |
sc-auth | 认证微服务 | 806x |
sc-user | 用户微服务 | 807x |
sc-product | 商品微服务 | 808x |
sc-order | 订单微服务 | 809x |
创建父工程
父工程不写代码,配置文件pom.xml
<?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>org.example</groupId>
<artifactId>springcloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 依赖版本锁定 -->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
<spring-boot.version>2.1.3.RELEASE</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 安装Spring Boot Maven插件,可以简化Maven和Spring Boot之间的交互 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(此处省略n步)搭建完的呈现
具体微服务模块搭建请听下回分解!!