SpringCloud+SpringCloudAlibaba

news2025/1/27 12:55:45

架构的演进

1.1单体架构

将所有业务场景的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。

◆ 1.1.1单体架构的优点

1)部署简单: 由于是完整的结构体,可以直接部署在一个服务器上即可。

2)技术单一: 项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。

3)用人成本低: 单个程序员可以完成业务接口到数据库的整个流程。

◆ 1.1.2单体架构的缺点

1)系统启动慢,一个进程包含了所有的业务逻辑,涉及到的启动模块过多,导致系统的启动、重启时间周期过长;

2)系统错误隔离性差、可用性差,任何一个模块的错误均可能造成整个系统的宕机;

3)可伸缩性差:系统的扩容只能只对这个应用进行扩容,不能做到对某个功能点进行扩容;

4)线上问题修复周期长:任何一个线上问题修复需要对整个应用系统进行全面升级。

1.2 SOA架构(面向服务架构)

SOA,面向服务架构。SOA中心化的实现方式就是ESB(企业服务总线),依靠ESB,集成不同系统、不同协议的服务,连接各个服务节点,做消息的转化解释和路由工作,让不同的服务互联互通;

1.2.1 RPC远程过程调用

RPC,Remote Procedure Call,即远程过程调用,建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序。

RPC框架:

  • 国内:

Dubbo,阿里巴巴,http://dubbo.I/O/;

Motan ,新浪微博,https://github.com/weibocom/motan;

Dubbox,当当,https://github.com/dangdangdotcom/dubbox;

Rpcx,基于 Golang 的https://github.com/smallnest/rpcx;

  • 国外:

Thrift,facebook,https://thrift.apache.org;

gRPC,Google,http://www.grpc.I/O;

Avro,hadoop,https://avro.apache.org;

  • 阿里巴巴的Dubbo、HSF,Spring的Spring Cloud等,底层基于NIO;

1.2.2 RMI远程方法调用

让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。

使用代表:EJB。

远程方法调用步骤:

  1. 客户调用客户端辅助对象stub上的方法

  1. 客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton;

  1. 服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象;

  1. 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton;

  1. 服务端辅助对象将结果打包,发送给客户端辅助对象stub;

  1. 客户端辅助对象将返回值解包,返回给调用者。

  1. 客户获得返回值。

  • Java1.2+内置的RMI,底层基于BIO;

1.2.3 区别

1、RMI 只能在 Java 语言中使用,可以把 RMI 看作面向对象的 Java RPC;

2、RPC是一种编程模型。

1.3 微服务架构

微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想。

◆ 1.3.1微服务的特征

  1. 通过服务实现组件化

  1. 按业务能力来划分服务和开发团队

  1. 去中心化(此处中心化指的是去中心化数据管理和去中心化服务治理)

  • 单一职责:微服务中每个服务都对应唯一的业务能力

  • 微:微服务的拆分粒度很小,例如一个用户管理可以作为一个服务。每个服务很小,但是五脏俱全

  • 面向服务:服务对外暴露Rest风格服务接口API,不限制

  • 自治:

  • 团队独立

  • 技术独立:因为面向服务,不关心使用技术/语音,提供Restful接口即可

  • 前后端分离:提供统一的Rest接口,后端不再为PC、移动端单独开发不同的接口

  • 数据库分离:每个服务都使用自己的数据库,很少情况出现多数据源的情况

  • 部署独立:每个服务都是独立的组件、可复用、可替换、低耦合,易维护。

◆ 1.3.2微服务的优点

  1. 拆分业务,把整体大项目分割成不同小项目运行在不同进程或者机器上实现数据隔离;

  1. 技术栈,每个服务可以由不同的团队或者开发者进行开发,外部调用人员不需要操心具体怎么实现的,只需要类似调用自己方法一样或者接口一样按照服务提供者给出来的参数传递即可;

  1. 独立部署,每一个服务独立部署,部署一个服务不会影响整体项目,如果部署失败最多是这个服务的功能缺失,并不影响其他功能的使用;

  1. 弹性。

  1. 按需部署,针对不同的需求可以给不同的服务自由扩展服务器,根据服务的规模部署满足需求的实例;

  1. 局部修改,当一个服务有新需求或者其他修改,不需要修改整体项目只要管好自己的服务就好;

◆ 1.3.3微服务的缺点

  1. 运维,微服务由于把业务拆分得细,有可能部署在不同机器上,因此对于 运维人员的管理来说,这部分的成本会加大;

  1. 接口调整,微服务之间通过接口进行通信。如果修改某个微服务的API, 可能所有使用了该接口的微服务都需要做调整;

  1. 运维,微服务由于把业务拆分得细,有可能部署在不同机器上,因此对于 运维人员的管理来说,这部分的成本会加大;

  1. 分布式,由于会把不同服务部署在不同机器上,那么对于这些服务的调用、 容错、网络延迟、分布式事务等等都是一个很大的挑战,当然微服务不一 定全部都是部署在不同服务器上

1.4 SOA架构和微服务架构的差别

  1. 微服务不再强调传统SOA架构里面比较重的 ESB 企业服务总线,同时 SOA 的思想进入到单个业务系统内部实现真正的组件化。

  1. Docker 容器技术的出现,为微服务提供了更便利的条件,比如更小的部署单元,每个服务可以通过类似 Node或者 Spring Boot 等技术跑在自己的进程中。

  1. SOA 注重的是系统集成方面,而微服务关注的是完全分离。

  1. 微服务机构和SOA架构都是对系统进行拆分;

  1. 微服务架构基于SOA架构;

  1. 管理方面:SOA着重中央管理(ESB),微服务注重分散管理;

1.5 SpringCloud微服务组件

SpringCoud中文网:https://www.springcloud.cc/;

  • 注册中心:Zookeeper、Eureka、Nacos、Consul。

  • API服务网关:Nginx、zuul、gateway、Kong、Traefik等

功能:统一入口、路由功能、负载均衡、统一鉴权、协议转换(统一服务)、指标监控、限流熔断、黑白名单、统一日志等。

API网关

所属公司

开发语言

优点

缺点

Nginx

Nginx inc

C/Lua

高性能、成熟稳固

门槛高,偏运维,可编程弱

Zuul1.x/2

Netflix/Pivotal

Java

成熟,简略门槛低

性能个别,可编程个别

Gateway

Pivotal

Java

异步、Netty、配置灵便

晚期产品

Kong

Kong inc

OpenResty/Lua

高性能、可编程API

门槛较高

Traefik

Containous

Golang

云原生、可编程API/对接各种服务发现

生产案例不太多

流量网关、业务网关。

  • 负载均衡

  • 硬件负载均衡设备,如F5、Array等。

  • 软件负载均衡,如LVS、Nginx等。

  • 微服务组件:Ribbon。

负载均衡基本算法:

  1. RoundRobinRule轮询。默认;

  1. AvailabilityFilteringRule有效性过滤。过滤掉打开熔断的服务或者是高并发连接数量的服务,再轮询;

  1. WeightedResponseTimeRule权重。给每一个服务一个权重,响应时间越长,权重越小;

  1. RetryRule重试,先按照轮询策略,如果请求服务失败,会在指定时间内(30s)进行重试;

  1. BestAvailableRule。先过滤掉断路器的服务,然后选择一个并发量最小的;

  1. RandomRule。随机获取一个服务。

  • 服务调用

Dubbo、Feign等。

1、协议

Dubbo:

  • 支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式。非常灵活。

  • 默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。

Feign:基于Http传输协议,短连接,不适合高并发的访问。

2、负载均衡

Dubbo:

  • 支持4种算法(随机、轮询、活跃度、Hash一致性),而且算法里面引入权重的概念。

  • 配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。

  • 负载均衡的算法可以精准到某个服务接口的某个方法。

Feign:

  • 只支持N种策略:轮询、随机、ResponseTime加权。

  • 负载均衡算法是Client级别的。

3、容错策略

Dubbo:支持多种容错策略:failover、failfast、brodecast、forking等,也引入了retry次数、timeout等配置参数。

Feign:利用熔断机制来实现容错的,处理的方式不一样。

4、实际开发的用法上

Dubbo是RPC、二进制流序列化、socket通讯,而Feign是用REST API,http七步走。

  • 熔断器

Hystrix、Sentinel。过载保护。

1.6 SpringCloudAlibaba微服务组件

SpringCloudAlibaba实是对SpringCloud实现拓展组件功能,是Spring Cloud 体系下的一套微服务解决方案的一种实现。

1.6.1 Spring Cloud Alibaba 包含组件

1.7微服务架构模型

1.7.1 洋葱架构

洋葱架构从外向里依次包括:用户界面和基础设施、应用服务、领域服务、领域模型。依赖从外向内。

1.7.2 六边形架构

六边形架构和洋葱架构很相似:使用的是端口适配器模式。把最外层定义成端口,通过适配器来完成,中间是应用程序和领域服务。

1.7.3 DDD分层架构

DDD分层包括:用户接口层、应用层、领域层、基础设施层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启动Idea报Failed to create JVM. JVM Path:

一、如果设置Idea自定义虚拟内存错误导致无法正常打开Idea 1.1、打开自定义Idea虚拟内存:Help - Edit Custom VM Options 1.2、如果idea64.exe.vmoptions设置非法字符,会导致打开idea报错 1.3、打开Idea提示如下 内容如下: ----------------…

信号、signal 函数、sigaction 函数

文章目录1.信号的基本概念2.利用 kill 命令发送信号3.信号处理的相关动作4.信号与 signal 函数4.1 signal 函数示例一4.2 signal 函数示例二5.利用 sigaction 函数进行信号处理6.利用信号处理技术消灭僵尸进程1.信号的基本概念 发送信号是进程之间常用的通信手段。信号用来通知…

算法刷题-只出现一次的数字、输出每天是应该学习还是休息还是锻炼、将有序数组转换为二叉搜索树

只出现一次的数字(位运算、数组) 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&…

有java基础学习大数据该如何规划

大数据开发对于Java语言的依赖程度比较高,如果想尝试大数据开发,学习过Java语言就很容易上手 Java是目前使用广泛的编程语言之一,具有的众多特性,特别适合作为大数据应用的开发语言。 目前很多大数据开发团队都在使用Java语言&a…

MySQL——插入加锁/唯一索引插入死锁/批量插入效率

本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况,以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法;MySQL跟加锁相关的一些概念在介绍MySQL执行插入的加锁过程之前&…

核酸检测信息管理系统

目录前言一、功能与需求分析二、详细设计与实现1、data包(1)DataDataBase(2)NaPaNamePassword2、operation包(1)操作接口(2)Resident用户功能(3)Simper用户功…

Java基础总结(jdk,jvm,异常,对象等)

文章目录前言一、Java基础part 1JDKJRE字节码位运算变量成员变量与局部变量的区别?基本数据类型装箱拆箱JVM1.Java内存区域Hotspot对象对象的创建:对象的内存布局part2面向对象面向对象三大特征构造方法接口;抽象类深拷贝和浅拷贝ObjectStrin…

阿里HPCC算法简介

摘要:HPCC(高精度拥塞控制)基于INT(带内遥测)技术,可以非常精确的获取网络的拥塞状态,能够实现快速的收敛以及利用带宽,并通过实现“零队列”来实现超低的延迟,下面将主要…

Presto本地开发,plugin的设置

1. 新的问题 之前搭建Presto的本地开发环境时,一直使用config.properties中的plugin.bundles配置项定义需要加载的plugin模块,详细可以参考博客《win10基于IDEA,搭建Presto开发环境》presto服务启动时,指定加载哪些组件&#xff…

kubernetes--监控容器运行时:Falco

目录 Falco介绍 Falco架构 Falco的安装 告警规则示列 威胁场景测试: 监控容器创建的不可信任进程(自定义规则) Falco支持五种输出告警方式falco.yaml: Falco告警集中化展示: Falco介绍 Falco是一个Linux安全工具…

使用chatgpt来提高你的编程能力,简直如虎添翼

下面大家跟着我的问题,可以跟着我一起向 chatgpt老师学习,相信我的问题可能你也会感兴趣。在Java中,boolean类型的数组默认初始化为false。也就是说,如果你创建了一个boolean类型的数组,但是没有初始化它,那…

嵌入式 Linux进程间通信之信号量

目录 一、信号量 1、信号量概述 2、什么是信号量 3、信号量的分类 4、进程获取共享资源要执行的操作 5、System V IPC 机制:信号量 5.1 semget函数 5.2 semop函数 5.3 semctl函数 一、信号量 1、信号量概述 信号量集:由若干个信号组成的集合&a…

JUC并发编程之Semaphore-应用与深度源码剖析

目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么? 2.怎么使用Semaphore? 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…

【C++】C++11——简介|列表初始|简化声明|nullptr与范围for|STL中的变化

文章目录一、C11简介二、列表初始化三、简化声明四、nullptr与范围for五、STL中一些变化一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于TC1主要是对C98标准中的漏洞进行修复…

Easyrecovery16免费的电脑硬盘恢复数据软件

在我们的日常生活和工作中,很容易发生一些意外情况,比如误删文件。这种情况下,您可能会感到非常困惑和担心,担心文件已经永久丢失,无法恢复。但是,在大多数情况下,即使您误删了文件,…

Nativefier把网页打包成exe

前要: 今天遇到一个需求,之前的应用都是用的h5挂载在企业微信的小应用,但是现在需要电脑运行的exe安装包! 所以需要用到nativefier导报工具:nativefier是一个使用electron将网页转换为app的插件,写这篇博客…

二、SpringMVC注解式开发

1. RequestMapping注解 此注解就是来映射服务器访问的路径 可加在方法上,是为此方法注册一个可以访问的名称(路径) 可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称 可区分get请求和post请求 package com.powernode.controller;import org.springframe…

liunx下安装node exporter

1 建立文件夹 cd /opt mkdir software 下载最新的包,并解压 https://prometheus.io/download/ 下载 curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz 3.解压 tar -xvf node_exporter-0.…

Gorm根据关系模型中的属性查询原模型数据

type ExamResult struct {gorm.ModelExamManagementID uintExamManagement ExamManagement json:"examManagement" // 一场考试,其中有试卷,有试题,有试题答案//MarkExamPaperRecord MarkExamPaperRecord //每一场考试对应的结…

测试经理:“你做了三年测试,连服务端的接口测试都不会?”

服务端的接口测试我们一般从功能开始进行测试,比如请求参数和响应参数的校验,业务逻辑或业务规则的校验,数据库操作的校验。 功能正常后会根据需要进行安全相关的检查、性能测试以及系列扩展测试,比如与历史版本的兼容性测试、接…