P4:springCloud

92 阅读10分钟

一.面试题

image.png

image.png

二.微服务与微服务架构

1.微服务

<1>是什么

微服务是一种架构风格,通过把大型的单体应用划分为较小的服务单元,降低整个系统的复杂度

<2>为啥用

<3>微服务的技术栈

image.png

<4>微服务优缺点

image.png

2.微服务架构

<1>.微服务架构的4个核心问题

I.服务很多,客户端怎么访问

负载均衡的一些轮询算法等

II.服务之间如何通信

http,rpc

III.如何治理服务

服务注册与发现,注册中心

IV.服务挂了怎么办

交易事故导致的服务雪崩,容灾的机制,做备份

<2>.解决方案

选用springcloud作为微服务架构
目前用的技术架构

I.springcloud netFlix 一站式解决方案

api网管,zuul组件 --解决客户端如何访问
Feign --HttpClient  --http通信方式,同步,阻塞
服务注册与发现:Eureka
熔断机制:Hystrix

II.apache dubbo zookeeper 半自动,需要整合别人的

API:没有,需要找第三方组件或者自己写
通信:Dubbo --RPC通信协议
服务注册与发现:zookeeper
熔断机制:没有,需要借助Hystrix

III.springcloud alibaba 一站式解决方案

IV.总结

微服务就是解决路由,网络通信,服务注册与发现,服务降级的问题,也就是解决网络不可靠的问题

<3>选用springcloud作为微服务架构

3.谈谈你对springcloud的理解

springcloud是spring官方推出来的一套微服务的解决方案,准备来说,我认为springcloud是对微服务架构里面出现的各种技术场景定义的一套标准规范,然后再这个标准里面呢,spring集成了netflix公司里面的oss开源套件,比如说zuul去实现应用网关,eureka去实现服务注册与发现,ribbon去实现负载均衡,hystrix实现服务熔断,我们可以使用springcloud netflix这样一套组件去快速落地微服务架构,以及去解决微服务治理的一系列问题,但是啊,随着netflix oss相关的一些技术组件的闭源和停止维护,所以spring官方也自研了一些组件,比如像getway来实现网关,loaderbalancer实现负载均衡,另外,alibaba里面的开源组件也实现了springcloud这样一套标准,成为了springcloud里面的另外一套微服务解决方案,包括dubbo来实现RPC通信,nacos去实现服务注册与发现以及动态配置中心,sentinel去实现服务的限流和降级等等;
以上就是我对springcloud的一个理解,另外我在补充一个点,我认为springcloud的出现有两个很重要的意义,第一个是在springcloud出现以前,为了解决微服务架构里面的各种技术问题,需要去集成各种开源框架,因为标准和兼容性问题,所以在实践的时候很麻烦,而springcloud统一了这样一个标准;第二个是降低了微服务架构的开发难度,只需要在springboot的项目基础上通过starter启动依赖集成的相关组件就能解决之前碰到的问题

4.谈谈对分布式和微服务架构的理解

首先我先来解释一下分布式系统,分布式是一组通过网络进行通信,并且为了完成共同的计算任务的计算机节点组成的系统;分布式系统的设计理念,其实是来源于小型机或者大型机的计算能力的瓶颈和成本的增加,在集中式系统里面,我们要想去提升程序的处理性能,只能不断地去提升CPU以及增加内存,但是硬件本身的提升也是有瓶颈的,所以当企业对计算能力的要求越来越高的时候,集群的架构以及没办法满足需求了,所以再这个背景下,就会产生了分布式计算,也就是说把一个计算任务分配给多个计算机节点去进行运算,但是这种计算方式,对于用户或者客户端来说,它是感知不到的,就像访问单个计算机一样,它看到的仍然是一个整体,在分布式系统里面,软件架构也需要做出响应的调整,也就是把原来的单体应用进行拆分,部署到多个计算机节点上去进行分布式计算,然后每一个服务之间使用远程通信协议去实现计算结果的数据交互,最后对结果进行汇总返回给客户端,针对这样一个分布式部署的应用架构,我们称为SOA,也叫面向服务的架构;
其次我再解释一下微服务架构,微服务架构本身就是一种分布式架构,只是说微服务架构它本身更加强调的是对部署在各个计算机节点上应用服务的一个粒度的控制,它的核心思想,是我们针对SOA架构里面拆分的服务节点做更进一步的粒度的解耦,而每个拆分出来的更小粒度的服务,就称为微服务,每个独立拆分出来的微服务由小团队来负责,最好是3-5个人,这样拆分的好处是可以使得我们的程序的扩展性变得更强,开放的迭代效率也会更高,对于一些大型的互联网项目,微服务架构能够在不影响用户的使用的情况下,去实现产品功能的创新和迭代。
以上就是我对这个问题的理解

5.谈谈对分布式事务理解和解决方案

6.谈谈对spring事务和分布式事务怎么区分

首先,在spring里面并没有提供事务,它只是提供了对数据库的事务的一个管理封装,我们可以通过声明式事务的配置,让我们在复杂的事务处理里面脱离出来,就不需要在关注连接的获取,连接的关闭,事物的提交,事务的回滚这样一些操作,可以把精力集中在业务上,所以spring的事务本质上是数据库层面的事务,而这种事务,主要针对的是单个数据库多个数据表的操作,它去满足一个事务的ACID特性,而分布式事务是解决多个数据库事务操作的一个数据的一致性问题,传统的关系型数据库不支持跨库的事务操作,所以需要引入分布式事务的解决方案,而spring里面并没有提供分布式事务的场景支持,所以spring里面的事务和分布式事务在使用上并没有直接的关联关系,但是我们可以使用一些主流的分布式事务解决框架,比如像state,集成在spring生态里面去解决分布式事务的问题;
以上就是我对这个问题的理解

三.springcloud

1.是什么

image.png

2.为什么用

<1>springcloud与springboot的关系

他们是一个渐进式的关系,springboot用来构建微服务,springcloud用来协调微服务

image.png

<2>dubbo和springcloud技术选型

I.传统的成熟互联网架构

应用服务化拆分+消息中间件

image.png

II.现在用的互联网架构

springcloud抛弃了dubbo的RPC通信,采用基于http的rest方式

III.总结

Dubbo的定位是一款RPC框架,springcloud的目标微服务下的一站式解决方案

3.怎么用

<1>springcloud学习的官网

https://www.springcloud.cc/spring-cloud-netflix.html
中文API文档:https://www.springcloud.cc/spring-cloud-dalston.html
springcloud中国社区:http://www.springcloud.cn/
springcloud中文网:https://www.springcloud.cc/

<2>springcloud版本选择

image.png

image.png

<3>Rest风格搭建服务的提供者和消费者

I.创建一个普通的maven项目作为父工程

i.导入父工程依赖
<?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.itcast</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <lombok.version>1.18.12</lombok.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--springcloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.8</version>
            </dependency>
            <!--springboot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--日志和测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.10</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

II.Rest风格:搭建服务的提供者

III.Rest风格:搭建服务的消费者

<4>Eureka服务注册与发现

I.是什么

是NetFlix的一个核心模块,基于Rest服务,用于定位,方便服务启动的时候注册到Eureka,消费者再从里面取出来服务用
i.三大角色

image.png

II.Eureka架构原理

image.png

III.CAP原则

image.png

IV.eureka与zookeeper区别

image.png

image.png

<5>负载均衡(LoadBalancer)以及Ribbon

I.负载均衡

i.是什么
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)
ii.负载均衡简单分类
①.集中式LB
如Nginx(反向代理服务器)
②.进程式LB
如Ribbon

II.Ribbon

i.是什么

image.png

ii.能干什么

image.png

iii.怎么用
iv.Ribbon算法以及自定义算法

<6>.接口调用服务Feign

I.是什么

image.png

II.能干什么

image.png

<6>Hystrix断路器

<7>Zuul路由网管

I.是什么,能干什么

image.png

II.zuul与getway

一.概念
spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。
因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目。

Zuul:
使用的是阻塞式的 API,不支持长连接,比如 websockets。
底层是servlet,Zuul处理的是http请求
没有提供异步支持,流控等均由hystrix支持。
依赖包spring-cloud-starter-netflix-zuul。

Gateway:
Spring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlet容器一起使用,也不能打包成一个WAR包。
依赖spring-boot-starter-webflux和/ spring-cloud-starter-gateway
提供了异步支持,提供了抽象负载均衡,提供了抽象流控,并默认实现了RedisRateLimiter。

二、相同点:
1、底层都是servle
2、两者均是web网关,处理的是http请求

三、不同点:
1、内部实现:
  gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件
  zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。
2、是否支持异步
  zuul仅支持同步
  gateway支持异步。理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定
3、框架设计的角度
  gateway具有更好的扩展性,并且其已经发布了2.0.0的RELESE版本,稳定性也是非常好的
4、性能
  WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。
  Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。

四、总结
  总的来说,在微服务架构,如果使用了Spring Cloud生态的基础组件,则Spring Cloud Gateway相比而言更加具备优势,单从流式编程+支持异步上就足以让开发者选择它了。
  对于小型微服务架构或是复杂架构(不仅包括微服务应用还有其他非Spring Cloud服务节点),zuul也是一个不错的选择。