其他分享
首页 > 其他分享> > 01-微服务之个人理解

01-微服务之个人理解

作者:互联网

Java 架构的发展

单体架构:未做任何拆分的 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 方案

方案二:Netflix 提出的 SpringCloud Netflix 方案

方案三:Alibaba 提出的 SpringCloud Alibaba 方案

方案四: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