微服务、springcloud简介

  • 什么是微服务
  • 为什么需要微服务
  • 单体架构
  • 1.优点
  • 2.缺点
  • 微服务架构
  • 1.优点
  • 2.缺点
  • 微服务架构解决方案
  • 1.Dubbo(阿里)
  • 2.SpringCloud
  • 什么是SpringCloud
  • SpringCloud架构
  • SpringCloud版本
  • 已发行版本
  • 版本选择
  • SpringCloud初始环境搭建
  • 创建父项目
  • 编写父项目pom.xml


什么是微服务

微服务就是由一系列围绕自己业务开发的微小服务构成,他们独立部署运行在自己的进程里,基于分布式的管理。

那么通俗点来讲 – 微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些独立的微服务不需要部署在同一个虚拟机、同一个系统或者同一个应用服务器中

为什么需要微服务

单体架构

说到这个我们就要回顾一下大家最熟悉的单体应用(所有的业务逻辑都放在一个项目中),架构如下

微服务架构上云部署_微服务架构上云部署

对于单体架构来讲

1.优点
  • 单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好
2.缺点
  • 应用随着时间的推进,加入的功能越来越多,最终会变得巨大,一个项目中很有可能数百万行的代码,互相之间繁琐的jar包。
  • 久而久之,开发效率低,代码维护困难
  • 还有一个如果想整体应用采用新的技术,新的框架或者语言,那是不可能的。
  • 任意模块的漏洞或者错误都会影响这个应用,降低系统的可靠性

基于单体架构的缺点和痛处,我们来看下微服务架构

微服务架构

微服务架构上云部署_微服务_02

1.优点
  • 将服务拆分成多个单一职责的小的服务,进行单独部署,服务之间通过网络进行通信
  • 每个服务应该有自己单独的管理团队,高度自治
  • 服务各自有自己单独的职责,服务之间松耦合,避免因一个模块的问题导致服务崩溃
2.缺点
  • 开发人员要处理分布式系统的复杂性
  • 多服务运维难度,随着服务的增加,运维的压力也在增大
  • 服务治理 和 服务监控 关键

微服务架构解决方案

当前市面上较为热门和成熟的微服务架构有两种

1.Dubbo(阿里)

  • 初出茅庐:2011年末,阿里巴巴在GitHub上开源了基于Java的分布式服务治理框架Dubbo,之后它成为了国内该类开源项目的佼佼者,许多开发者对其表示青睐。同时,先后有不少公司在实践中基于Dubbo进行分布式系统架构,目前在GitHub上,它的fork、star数均已破万。Dubbo致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出、输入功能和Spring框架无缝集成。Dubbo包含远程通讯、集群容错和自动发现三个核心部分。
  • 停止维护:从2012年10月23日Dubbo 2.5.3发布后,在Dubbo开源将满一周年之际,阿里基本停止了对Dubbo的主要升级。只在之后的2013年和2014年更新过2次对Dubbo 2.4的维护版本,然后停止了所有维护工作。Dubbo对Srping的支持也停留在了Spring 2.5.6版本上。
  • 死而复生:多年漫长的等待,随着微服务的火热兴起,在国内外开发者对阿里不再升级维护Dubbo的吐槽声中,阿里终于开始重新对Dubbo的升级和维护工作。在2017年9月7日,阿里发布了Dubbo的2.5.4版本,距离上一个版本2.5.3发布已经接近快5年时间了。在随后的几个月中,阿里Dubbo开发团队以差不多每月一版本的速度开始快速升级迭代,修补了Dubbo老版本多年来存在的诸多bug,并对Spring等组件的支持进行了全面升级。
  • 2018年1月8日,Dubbo创始人之一梁飞在Dubbo交流群里透露了Dubbo 3.0正在动工的消息。Dubbo 3.0内核与Dubbo 2.0完全不同,但兼容Dubbo 2.0。Dubbo 3.0将以Streaming为内核,不再是Dubbo 时代的RPC,但是RPC会在Dubbo 3.0中变成远程Streaming对接的一种可选形态。从Dubbo新版本的路线规划上可以看出,新版本的Dubbo在原有服务治理的功能基础上,将全面拥抱微服务解决方案。
  • 结论:当前由于RPC协议、注册中心元数据不匹配等问题,在面临微服务基础框架选型时Dubbo与Spring Cloud是只能二选一,这也是为什么大家总是拿Dubbo和Spring Cloud做对比的原因之一。Dubbo之后会积极寻求适配到Spring Cloud生态,比如作为Spring Cloud的二进制通信方案来发挥Dubbo的性能优势,或者Dubbo通过模块化以及对http的支持适配到Spring Cloud。

2.SpringCloud

  • Spring Cloud NetFlix
    基于美国Netflix公司开源的组件进行封装,提供了微服务一栈式的解决方案。
  • Spring Cloud alibaba
    在Spring cloud netflix基础上封装了阿里巴巴的微服务解决方案。
  • Spring Cloud Spring
    目前spring官方趋势正在逐渐吸收Netflix组件的精华,并在此基础进行二次封装优化,打造spring专有的解决方案

什么是SpringCloud

SpringCloud官网

SpringCloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线)。分布式系统的协调导致了锅炉板模式,使用SpringCloud开发人员可以快速地建立实现这些模式的服务和应用程序。

也就是说SpringCloud是一个含概多个子项目的开发工具集,集合了众多的开源框架,他利用了Spring Boot开发的便利性实现了很多功能,如服务注册,服务注册发现,负载均衡等.SpringCloud在整合过程中主要是针对Netflix(耐非)开源组件的封装.SpringCloud的出现真正的简化了分布式架构的开发。

SpringCloud架构

微服务架构上云部署_微服务架构上云部署_03

核心组件说明

  • eurekaserver、consul、nacos 服务注册中心组件
  • rabbion & openfeign 服务负载均衡 和 服务调用组件
  • hystrix & hystrix dashboard 服务断路器 和 服务监控组件
  • zuul、gateway 服务网关组件
  • config 统一配置中心组件
  • bus 消息总线组件

SpringCloud版本

SpringCloud是一个由众多独立子项目组成的大型综合项目,原则每个子项目上有不同的发布节奏,都维护自己发布版本号。为了更好的管理SpringCloud的版本,通过一个资源清单BOM(Bill of Materials),为避免与子项目的发布号混淆,所以没有采用版本号的方式,而是通过命名的方式。这些名字是按字母顺序排列的。如伦敦地铁站的名称(“天使”是第一个版本,“布里斯顿”是第二个版本,"卡姆登"是第三个版本)。当单个项目的点发布累积到一个临界量,或者其中一个项目中有一个关键缺陷需要每个人都可以使用时,发布序列将推出名称以“.SRX”结尾的“服务发布”,其中“X”是一个数字。

已发行版本

Angel、Brixton、Camden、Dalston、Edgware、Finchley、Greenwich、Hoxton

版本选择

由于SpringCloud是基于Springboot开发的,所以SpringCloud的版本与Springboot版本有着严格的对应关系,如果用户不清楚的话可以查看官方建议的选择版本

微服务架构上云部署_spring cloud_04

Spring Cloud Dalston, Edgware, Finchley, and Greenwich have all reached end of life status and are no longer supported.

SpringCloud初始环境搭建

我们此次选择的SpringCloud版本是Hoxton.SR6,对应的Springboot版本为2.2.5.RELEASE。采用上篇我们介绍的Maven聚合项目来进行SpringCloud初始化境搭建,具体如下软件版本如下

  • springboot 2.2.5.RELEASE
  • springcloud Hoxton.SR6
  • java8
  • maven 3.6.3
  • idea 2021.02

创建父项目

首先我们创建一个工作空间,在工作空间中创建一个父项目(我们之前也说了,父项目其实就是工作空间的一个Module),如下

微服务架构上云部署_spring_05

我们知道父项目不书写任何业务逻辑,只是管理依赖的,所以除了pom.xml,我们将父项目的src目录删除,向下面这样

微服务架构上云部署_spring cloud_06

编写父项目pom.xml

就目前而言我们只是搭建一个SpringCloud的初始环境,所以pom里面只需要有Springboot和SpringCloud的依赖就可以了,后面用到组件的时候再在父项目中维护其响应的依赖即可。

<?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.christy</groupId>
    <artifactId>springcloud_parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 集成SpringBoot父项目 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- 维护SpringCloud依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

</project>

SpringCloud的介绍就到这里,下篇我们从服务注册中心开始说起ヾ(◍°∇°◍)ノ゙