01-微服务之个人理解
作者:互联网
Java 架构的发展
- 单体架构 --> 分布式架构 --> SOA 架构 --> 微服务架构
单体架构:未做任何拆分的 Java Web 程序
- 从最初的 MVC 三层架构
- 目的:解耦
- 到 Spring 开发框架
- 轻量级的 Java 开源框架
- 核心:IOC/AOP
- 目的:解决企业开发的复杂性问题
- 缺陷:配置太过复杂
- 再到 SpringBoot 框架
- Spring 的升级版
- 目的:为了解决 Spring 配置过于复杂的问题
- 单体架构部署在一台服务器上,受到服务器本身性能的制约
- 此时考虑纵向扩展,以提升单机服务器性能,如:增加 CPU、内存等
- 但纵向扩展始终受到单机瓶颈的制约;
- 此时考虑横向扩展,以突破单机瓶颈制约,即增加服务器的数量,来进行高并发处理,如:使用反向代理、负载均衡等技术手段进行轮换处理业务、分发请求等
- 横向扩展后会引起资源分配不均问题
- 如: A 服务器消耗 80% 的资源,而 B 服务器只用了 20 %,-- 可使用负载均衡解决
- 但如果该系统中,订单管理所需资源较大,而用户管理所需资源较小的情况下,按理该为订单服务提供更多服务器,而为用户服务提供较少的服务器;
- 可由于是单体架构,只有一个 war 包,无法进行服务器数量的优化,此时考虑将系统拆分成若干个小系统,从而进入分布式架构时代
单体架构特点:
- 所有功能集成在一个 war 包中
- 通过部署应用集群和数据库集群来提高系统性能
优点:
- 项目架构简单,前期开发成本低,小型项目首选
- 开发效率高,模块之间采用本地方法调用
- 容易部署与测试
缺点:
- 过于笨重,对于大型项目不易开发、扩展和维护
- 由于是在一个 war 包下,修改一个地方就要将整个项目重新编译、部署、启动,开发周期过长,从而影响版本迭代速度
- 无法针对具体业务按需伸缩
分布式架构:按业务垂直拆分,每个业务都是一个单体架构,通过 API 相互调用
- 针对单体架构的不足,为了适应大型项目的开发需求,将单体系统按业务垂直拆分为若干个小系统,系统间通过网络交互来完成业务处理
分布式架构特点:
- 按业务垂直拆分,此架构也称为垂直架构
- 系统之间存在数据冗余,耦合性较高,如:各小系统之间都可能存在用户管理的模块
优点:
- 通过垂直拆分,每个系统变成了小型系统,功能简单,开发周期缩短
- 每个子系统可以按需伸缩
- 每个子系统可以采用不同技术
缺点:
- 子系统之间存在数据冗余、功能冗余、耦合性高
- 按需伸缩的粒度不够,对同一子系统中的不同业务无法实现按需伸缩
SOA 架构:SOA 是一种面向服务的架构
- 基于分布式架构,它将不同业务功能按服务进行拆分,并通过在服务之间定义良好的接口和协议建立联系
SOA 架构特点:
- 将重复公用的功能抽取为组件,以服务的方式向各个系统提供
- 各系统之间采用网络协议进行通信
- 采用 ESB 企业服务总线作为系统与服务之间通信的桥梁
优点:
- 将重复的功能抽取为服务,提高开发效率,提升了系统的可重用性和可维护性
- 可针对不同服务的特点按需伸缩
- 采用 ESB 减少了系统中的接口耦合
缺点:
- 系统与服务的界限过于模糊,会导致抽取的服务粒度过大,系统与服务之间的耦合性过高
- 虽然采用了 ESB,但服务的接口协议不固定、种类繁多、不利于系统维护
微服务架构:基于 SOA 思想
- 为了满足互联网对大型项目及多客户端的需求,对服务进行更细粒度的拆分,每个服务只完成某个特定的业务功能
微服务架构特点:
- 通过服务实现组件化,开发者不再需要协调其他服务部署对本服务的影响
- 按业务能力划分开发团队,开发者可以自由选择开发技术
- 去中心化,每个微服务有自己的数据库,每种服务也可以根据自己的业务需求采用不同的数据库
优点:
- 职责单一,代码容易理解
- 服务粒度更细,有利于资源重复利用,提升开发效率
- 完全解耦,从开发到部署都是独立的
- 可以更精准的制定每个服务的优化方案,按需伸缩
- 适用于互联网时代,快速迭代
缺点:
- 开发复杂性增加
- 服务过多,运维成本、服务治理成本增加
- 服务间的通信成本变高
什么是微服务
- 微服务的核心是将传统的一站式应用,根据业务拆分成一个个独立的服务,彻底解耦;一个服务只做一件事情,微强调的是服务粒度的大小,关注的是一个点
什么是微服务架构
- 微服务架构是一种架构风格,它提倡将单一的应用程序划分为一组小的服务,每个服务运行在自己独立的进程当中,服务之间相互协助、相互配合,为用户提供最终价值
微服务架构面临的困难
- 服务多了,客户端如何访问?
- API 网关,服务路由的问题
- 服务多了,服务之间如何通信?
- HTTP/RPC 远程服务调用的问题
- 服务多了,如何进行治理?
- 服务注册与发现的问题
- 服务挂了,怎么办?
- 服务熔断与降级的问题
微服务架构的解决方案
方案一:Apache 提出的 Dubbo + Zookeeper 方案
- API 网关问题:没有实现,需要整合第三方网关
- 服务通信问题:Dubbo RPC 框架
- 服务注册与发现:Zookeeper
- 服务熔断与降级:没有实现
方案二:Netflix 提出的 SpringCloud Netflix 方案
- API 网关问题:Zuul
- 服务通信问题:RestApi,Http 通信协议
- 服务注册与发现:Eureka
- 服务熔断与降级:Hystrix
方案三:Alibaba 提出的 SpringCloud Alibaba 方案
- API 网关问题:Gateway
- 服务通信问题:RestApi,Http 通信协议
- 服务注册与发现:Nacos
- 服务熔断与降级:Sentinel
方案四:Service Mesh 服务网格 -- 暂未研究
SpringCloud Netflix 环境搭建
-
创建通用 Maven 项目
-
引入依赖管理
搭建后的最终 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.kaishen</groupId> <artifactId>spring-cloud-netflix</artifactId> <version>1.0-SNAPSHOT</version> <!-- 模块化 --> <modules> <module>spring-cloud-config-client-5566</module> <module>spring-cloud-config-server-3344</module> <module>spring-cloud-consumer-dept-80</module> <module>spring-cloud-consumer-dept-feign-80</module> <module>spring-cloud-dashboard-9001</module> <module>spring-cloud-eureka-server-7001</module> <module>spring-cloud-eureka-server-7002</module> <module>spring-cloud-eureka-server-7003</module> <module>spring-cloud-provider-dept-8001</module> <module>spring-cloud-provider-dept-8002</module> <module>spring-cloud-provider-dept-8003</module> <module>spring-cloud-provider-dept-hystrix</module> <module>spring-cloud-zuul-9527</module> </modules> <!-- 打包方式 --> <packaging>pom</packaging> <!-- 版本号 --> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- 日志相关 --> <log4j.version>2.17.2</log4j.version> <logback.version>1.3.0-alpha14</logback.version> <!-- json 相关 --> <json.version>20220320</json.version> <gson.version>2.9.0</gson.version> <!-- J2EE 相关 --> <lombok.version>1.18.24</lombok.version> <lang3.version>3.12.0</lang3.version> <dom4j.version>2.1.3</dom4j.version> <commons-io.version>2.11.0</commons-io.version> <guava.version>31.1-jre</guava.version> <!-- 数据库相关 --> <druid.version>1.2.9</druid.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.2.2</mybatis.version> <!-- Netflix Component version --> <netflix.component.version>1.4.7.RELEASE</netflix.component.version> </properties> <!-- 依赖管理,此处做管理,每个Module需自行引入所需依赖 --> <dependencyManagement> <dependencies> <!-- SpringCloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringBoot 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.12.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- region 通用组件 --> <!-- log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <!-- logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <!-- json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>${json.version}</version> </dependency> <!-- google json --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>${gson.version}</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- lang3 Java 第二 API --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${lang3.version}</version> </dependency> <!-- dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>${dom4j.version}</version> </dependency> <!-- commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <!-- guava 线程池技术 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>${guava.version}</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- endregion --> <!-- region Netflix Component --> <!-- Eureka Server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Eureka Client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Dashboard --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> <version>${netflix.component.version}</version> </dependency> <!-- Config Server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>3.1.2</version> </dependency> <!-- Config Client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>3.1.2</version> </dependency> <!-- endregion --> </dependencies> </dependencyManagement> </project>
-
创建 Module,每个 Module 都是一个独立的微服务
SpringCloud Alibaba 环境搭建
由于 Netflix 组件的停更,Alibaba 在原 SpringCloud Netflix 的基础上推出了 Alibaba 的解决方案
-
创建通用 Maven 项目
-
引入依赖管理
搭建后的最终 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.kaishen</groupId> <artifactId>springcloud</artifactId> <version>1.0-SNAPSHOT</version> <!-- 模块化 --> <modules> <module>spring-cloud-api</module> <module>spring-cloud-consumer-payment-80</module> <module>spring-cloud-consumer-payment-feign-80</module> <module>spring-cloud-gateway-9527</module> <module>spring-cloud-nacos-config-5566</module> <module>spring-cloud-provider-payment-8013</module> <module>spring-cloud-provider-payment-8014</module> <module>spring-cloud-provider-payment-8015</module> <module>spring-cloud-provider-payment-consul-8012</module> <module>spring-cloud-provider-payment-zk-8011</module> <module>spring-cloud-sentinel-service-8888</module> </modules> <!-- 打包方式 --> <packaging>pom</packaging> <!-- 属性配置 --> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- 日志相关 --> <log4j.version>2.17.2</log4j.version> <logback.version>1.3.0-alpha14</logback.version> <!-- json 相关 --> <json.version>20220320</json.version> <gson.version>2.9.0</gson.version> <!-- J2EE 相关 --> <lombok.version>1.18.24</lombok.version> <lang3.version>3.12.0</lang3.version> <dom4j.version>2.1.3</dom4j.version> <commons-io.version>2.11.0</commons-io.version> <guava.version>31.1-jre</guava.version> <!-- 数据库相关 --> <druid.version>1.2.9</druid.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.2.2</mybatis.version> <!-- SpringCloud 组件相关 --> <springcloud.version>2021.0.2</springcloud.version> <alibaba.cloud.version>2021.0.1.0</alibaba.cloud.version> <springboot.version>2.6.7</springboot.version> <zk.version>3.1.1</zk.version> <consul.version>3.1.0</consul.version> </properties> <!-- 依赖管理,此处做管理,每个 Module 需自行引入所需依赖 --> <dependencyManagement> <dependencies> <!-- SpringCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${springcloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Alibaba Cloud --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${alibaba.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringBoot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- region 通用组件 --> <!-- log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <!-- logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <!-- json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>${json.version}</version> </dependency> <!-- google json --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>${gson.version}</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- lang3 Java 第二 API --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${lang3.version}</version> </dependency> <!-- dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>${dom4j.version}</version> </dependency> <!-- commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <!-- guava 线程池技术 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>${guava.version}</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- endregion --> <!-- Zookeeper --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <version>${zk.version}</version> </dependency> <!-- Consul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> <version>${consul.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
-
创建 Module,每个 Module 都是一个独立的微服务
标签:01,服务,个人,spring,理解,架构,version,org,cloud 来源: https://www.cnblogs.com/xiaokai007/p/16315933.html