ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

01-微服务之个人理解

2022-05-27 16:03:17  阅读:168  来源: 互联网

标签:01 服务 个人 spring 理解 架构 version org cloud


Java 架构的发展

  • 单体架构 --> 分布式架构 --> SOA 架构 --> 微服务架构
    0

单体架构:未做任何拆分的 Java Web 程序

  1. 从最初的 MVC 三层架构
    • 目的:解耦
  2. 到 Spring 开发框架
    • 轻量级的 Java 开源框架
    • 核心:IOC/AOP
    • 目的:解决企业开发的复杂性问题
    • 缺陷:配置太过复杂
  3. 再到 SpringBoot 框架
    • Spring 的升级版
    • 目的:为了解决 Spring 配置过于复杂的问题
  4. 单体架构部署在一台服务器上,受到服务器本身性能的制约
    • 此时考虑纵向扩展,以提升单机服务器性能,如:增加 CPU、内存等
    • 但纵向扩展始终受到单机瓶颈的制约;
    • 此时考虑横向扩展,以突破单机瓶颈制约,即增加服务器的数量,来进行高并发处理,如:使用反向代理、负载均衡等技术手段进行轮换处理业务、分发请求等
  5. 横向扩展后会引起资源分配不均问题
    • 如: A 服务器消耗 80% 的资源,而 B 服务器只用了 20 %,-- 可使用负载均衡解决
    • 但如果该系统中,订单管理所需资源较大,而用户管理所需资源较小的情况下,按理该为订单服务提供更多服务器,而为用户服务提供较少的服务器;
    • 可由于是单体架构,只有一个 war 包,无法进行服务器数量的优化,此时考虑将系统拆分成若干个小系统,从而进入分布式架构时代

单体架构特点:

  1. 所有功能集成在一个 war 包中
  2. 通过部署应用集群和数据库集群来提高系统性能

优点:

  1. 项目架构简单,前期开发成本低,小型项目首选
  2. 开发效率高,模块之间采用本地方法调用
  3. 容易部署与测试

缺点:

  1. 过于笨重,对于大型项目不易开发、扩展和维护
  2. 由于是在一个 war 包下,修改一个地方就要将整个项目重新编译、部署、启动,开发周期过长,从而影响版本迭代速度
  3. 无法针对具体业务按需伸缩

分布式架构:按业务垂直拆分,每个业务都是一个单体架构,通过 API 相互调用

  • 针对单体架构的不足,为了适应大型项目的开发需求,将单体系统按业务垂直拆分为若干个小系统,系统间通过网络交互来完成业务处理

分布式架构特点:

  1. 按业务垂直拆分,此架构也称为垂直架构
  2. 系统之间存在数据冗余,耦合性较高,如:各小系统之间都可能存在用户管理的模块

优点:

  1. 通过垂直拆分,每个系统变成了小型系统,功能简单,开发周期缩短
  2. 每个子系统可以按需伸缩
  3. 每个子系统可以采用不同技术

缺点:

  1. 子系统之间存在数据冗余、功能冗余、耦合性高
  2. 按需伸缩的粒度不够,对同一子系统中的不同业务无法实现按需伸缩

SOA 架构:SOA 是一种面向服务的架构

  • 基于分布式架构,它将不同业务功能按服务进行拆分,并通过在服务之间定义良好的接口和协议建立联系

SOA 架构特点:

  1. 将重复公用的功能抽取为组件,以服务的方式向各个系统提供
  2. 各系统之间采用网络协议进行通信
  3. 采用 ESB 企业服务总线作为系统与服务之间通信的桥梁

优点:

  1. 将重复的功能抽取为服务,提高开发效率,提升了系统的可重用性和可维护性
  2. 可针对不同服务的特点按需伸缩
  3. 采用 ESB 减少了系统中的接口耦合

缺点:

  1. 系统与服务的界限过于模糊,会导致抽取的服务粒度过大,系统与服务之间的耦合性过高
  2. 虽然采用了 ESB,但服务的接口协议不固定、种类繁多、不利于系统维护

微服务架构:基于 SOA 思想

  • 为了满足互联网对大型项目及多客户端的需求,对服务进行更细粒度的拆分,每个服务只完成某个特定的业务功能

微服务架构特点:

  1. 通过服务实现组件化,开发者不再需要协调其他服务部署对本服务的影响
  2. 按业务能力划分开发团队,开发者可以自由选择开发技术
  3. 去中心化,每个微服务有自己的数据库,每种服务也可以根据自己的业务需求采用不同的数据库

优点:

  1. 职责单一,代码容易理解
  2. 服务粒度更细,有利于资源重复利用,提升开发效率
  3. 完全解耦,从开发到部署都是独立的
  4. 可以更精准的制定每个服务的优化方案,按需伸缩
  5. 适用于互联网时代,快速迭代

缺点:

  1. 开发复杂性增加
  2. 服务过多,运维成本、服务治理成本增加
  3. 服务间的通信成本变高

什么是微服务

  • 微服务的核心是将传统的一站式应用,根据业务拆分成一个个独立的服务,彻底解耦;一个服务只做一件事情,微强调的是服务粒度的大小,关注的是一个点

什么是微服务架构

  • 微服务架构是一种架构风格,它提倡将单一的应用程序划分为一组小的服务,每个服务运行在自己独立的进程当中,服务之间相互协助、相互配合,为用户提供最终价值

微服务架构面临的困难

  1. 服务多了,客户端如何访问?
    • API 网关,服务路由的问题
  2. 服务多了,服务之间如何通信?
    • HTTP/RPC 远程服务调用的问题
  3. 服务多了,如何进行治理?
    • 服务注册与发现的问题
  4. 服务挂了,怎么办?
    • 服务熔断与降级的问题

微服务架构的解决方案

方案一: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 环境搭建

  1. 创建通用 Maven 项目

  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.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>
    
  3. 创建 Module,每个 Module 都是一个独立的微服务

SpringCloud Alibaba 环境搭建

由于 Netflix 组件的停更,Alibaba 在原 SpringCloud Netflix 的基础上推出了 Alibaba 的解决方案

  1. 创建通用 Maven 项目

  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.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>
    
  3. 创建 Module,每个 Module 都是一个独立的微服务

标签:01,服务,个人,spring,理解,架构,version,org,cloud
来源: https://www.cnblogs.com/xiaokai007/p/16315933.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有