Spring Cloud介绍

9edb6bb320bd4ed083146978f76d2d98.gif一、SpringCloud总体概述

 

 

 

Cloud Foundry Service Broker:通用service集成进入Cloud Foundry

 

Cluster:服务集群

 

Consul:注册中心

 

Security:安全认证

 

Stream:消息队列

 

Stream App Starters:Spring Cloud Stream Application Starters是独立的可执行应用程序,可通过Apache Kafka和RabbitMQ等消息传递中间件进行通信

 

Connectors:简化了云平台(如Cloud Foundry和Heroku)中连接服务和获取操作环境感知的过程,尤其适用于Spring应用程序

 

CLI:允许使用命令行、.yml配置文件和Groovy脚本快速自动配置和部署标准Spring Cloud服务

 

Contract:Spring Cloud Contract 为通过CDC(Customer Driven Contracts)开发基于JVM的应用提供了支持。它为TDD(测试驱动开发)提供了一种新的测试方式 - 基于接口。

 

Config:配置中心

 

Netflix:Netflix

 

Bus:消息总线

 

Cloud Foundry:云开发平台

 

Sleuth:链路追踪

 

DataFlow:针对各种数据集成和处理场景的一系列预构建流和任务/批处理启动器应用程序

 

Task:Tasks是Spring Cloud Data Flow中的一个基础项目,允许用户将几乎任何Spring Boot应用程序作为一个短期任务执行。

 

Task App Starters:Spring Cloud Task Applications可与Spring Cloud Data Flow一起使用,以创建,部署和编排短期数据微服务。

 

Starters:启动器

 

 

 

主流实现:

 

 

 

Netflix

 

阿里

 

其它

 

注册中心

 

Eureka

 

Nacos

 

Zookeeper、Consul、Etcd

 

负载均衡

 

Ribbon

 

Dubbo(未来)

 

spring-cloud-loadbalancer

 

声明式调用

 

 

 

 

 

spring-cloud-openfeign

 

服务保障(熔断器)

 

Hystrix

 

Sentinel

 

Resilience4j

 

网关

 

Zuul1

 

暂无

 

Spring Cloud Gateway

 

配置中心

 

 

 

spring-cloud-alibaba-nacos-config

 

spring-cloud-config、Apollo

 

链路追踪

 

Ribbon

 

Dubbo(未来)

 

spring-cloud-loadbalancer

 

消息队列

 

 

 

 

 

 

 

 

 

回到顶部

二、注册中心

在 Spring Cloud 中,能够使用的注册中心,还是比较多的,如下:

 

(1)spring-cloud-netflix-eureka-server和spring-cloud-netflix-eureka-client,基于 Eureka 实现。

 

(2)spring-cloud-alibaba-nacos-discovery,基于Nacos实现。

 

(3)spring-cloud-zookeeper-discovery,基于 Zookeeper 实现。

 

以上都是基于spring-cloud-commons的discovery的DiscoveryClient接口,实现统一的客户端的注册发现。

 

    注意:在分布式系统领域有个著名的CAP理论(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);zk看重CP,Eureka在意AP。例如:zk中有master和follower区别,当进入选举模式时,就无法正常对外提供服务。但Eureka中,集群是对等的,地位是相同的,虽不能保证一致性,但至少可以提供注册服务。

 

 

 

以Eureka为例说明注册中心:

 

作用:实现服务治理(服务注册与发现)

 

简介:Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。

 

由两个组件组成:Eureka 服务端和 Eureka 客户端。Eureka 服务端,用作服务注册中心,支持集群部署。

 

Eureka 客户端,是一个 Java 客户端,用来处理服务注册与发现。

 

在应用启动时,Eureka 客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。

 

原理图:

 

 

 

 

 

 

 

回到顶部

三、负载均衡

随着业务的发展,单台服务无法支撑访问的需要,于是搭建多个服务形成集群。那么随之要解决的是,每次请求,调用哪个服务,也就是需要进行负载均衡。

 

目前负载均衡有两种模式:

 

客户端模式

 

服务端模式

 

在 Spring Cloud 中,我们使用前者,即客户端模式。

 

以Ribbon为例:

 

作用:主要提供客户侧的软件负载均衡算法。

 

简介:Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。

 

 

 

 

 

 

 

 

 

 

 

Ribbon 原理,整体步骤如下:

 

首先,Ribbon 会从 Eureka Client 里获取到对应的服务列表。

 

然后,Ribbon 使用负载均衡算法获得使用的服务。

 

最后,Ribbon 调用对应的服务。

 

 

 

回到顶部

四、声明式调用

在SpringCloud中,目前使用的声明式调用组件,只有spring-cloud-openfeign,基于Feign 实现(Dubbo 的 Service API 接口,也是一种声明式调用的体现)。

 

注意:Feign 并非一定要在 Spring Cloud 下使用,单独使用也是没问题的。

 

Feign使用步骤:

 

首先,如果你对某个接口定义了@FeignClient注解,Feign 就会针对这个接口创建一个动态代理。

 

接着你要是调用那个接口,本质就是会调用 Feign 创建的动态代理,这是核心中的核心。

 

Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址。

 

最后针对这个地址,发起请求、解析响应。

 

 

 

原理图:

 

 

 

Feign 和 Ribbon 的区别:

 

Ribbon 和 Feign 都是用来调用其他服务的,不过方式不同。

 

(1)启动类用的注解不同。

 

Ribbon 使用的是@RibbonClient

 

Feign 使用的是@EnableFeignClients。

 

(2)服务的指定位置不同。

 

Ribbon 是在@RibbonClient注解上设置。

 

Feign 则是在定义声明方法的接口中用@FeignClient注解上设置。

 

(3)调使用方式不同。

 

Ribbon 需要自己构建 Http 请求,模拟 Http 请求而后用 RestTemplate 发送给其余服务,步骤相当繁琐。

 

Feign 采使用接口的方式,将需要调使用的其余服务的方法定义成声明方法就可,不需要自己构建 Http 请求。不过要注意的是声明方法的注解、方法签名要和提供服务的方法完全一致。

 

 

 

 Feign 是和 Ribbon、Eureka 整合:

 

 

 

 

 

 首先,用户调用 Feign 创建的动态代理。

 

然后,Feign 调用 Ribbon 发起调用流程。

 

首先,Ribbon 会从 Eureka Client 里获取到对应的服务列表。

 

然后,Ribbon 使用负载均衡算法获得使用的服务。

 

最后,Ribbon 调用对应的服务,(最后,Ribbon 调用 Feign )而 Feign 调用 HTTP 库最终调用使用的服务。

 

回到顶部

五、服务保障

在 Spring Cloud 中,能够使用的服务保证,如下:

 

spring-cloud-netflix-hystrix,基于 Hystrix 实现。

 

Resilience4j

 

spring-cloud-alibaba-sentinel,基于 Sentinel 实现。

 

为什么要使用服务保障

 

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC)。为了保证其高可用,单个服务又必须集群部署。由于网络原因或者自身的原因,服务并不能保证服务的 100% 可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务累积,导致服务瘫痪,甚至导致服务“雪崩”。为了解决这个问题,就出现断路器模型。

 

 

 

 

 

 通过 HystrixCircuitBreaker 实现。

 

HystrixCircuitBreaker 有三种状态 :

 

(1)CLOSED:关闭 (2)OPEN:打开 (3)HALF_OPEN:半开

 

HystrixCircuitBreaker 状态变迁如下图 :

 

 

 

 

 

 

 

红线 :初始时,断路器处于 CLOSED 状态,链路处于健康状态。当满足如下条件,断路器从 CLOSED 变成 OPEN 状态:周期( 可配,HystrixCommandProperties.default_metricsRollingStatisticalWindow = 10000 ms )内,总请求数超过一定量( 可配,HystrixCommandProperties.circuitBreakerRequestVolumeThreshold = 20 ) 。

 

错误请求占总请求数超过一定比例( 可配,HystrixCommandProperties.circuitBreakerErrorThresholdPercentage = 50% ) 。

 

绿线 :断路器处于 OPEN 状态,命令执行时,若当前时间超过断路器开启时间一定时间( HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds = 5000 ms ),断路器变成 HALF_OPEN 状态,尝试调用正常逻辑,根据执行是否成功,打开或关闭熔断器【蓝线】。

 

 

 

以Hystrix为例:

 

作用:断路器,保护系统,控制故障范围。

 

简介:Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。

 

Hystrix 原理,整体如下图:

 

 

 

 

 

 

 

回到顶部

六、网关服务

在 Spring Cloud 中,能够使用的网关服务,主要是两个,如下:

 

spring-cloud-netflix-zuul ,基于 Zuul1 实现。

 

Netflix 最新开源的网关服务是 Zuul2 ,基于响应式的网关服务。

 

spring-cloud-gateway,基于 Spring Webflux 实现。

 

网关服务,可以实现的功能:

 

动态路由

 

灰度发布

 

健康检查

 

限流

 

熔断

 

认证: 如数支持 HMAC, JWT, Basic, OAuth 2.0 等常用协议

 

鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性

 

可用性

 

高性能

 

作用:API 网关,路由,负载均衡等多种作用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记第一次eudsrc拿到RCE(下)

目录 前言 个人介绍 挖洞公式 漏洞介绍 信息泄露漏洞 任意文件读取漏洞 远程命令执行(RCE)漏洞 漏洞详情 漏洞点1 漏洞点2 漏洞点3 修复建议 总结 前言 免责声明 以下漏洞均已经上报漏洞平台。请勿利用文章内的相关技术从事非法测试。若因…

基于python爬虫与数据分析系统设计

**单片机设计介绍,基于python爬虫与数据分析系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于Python爬虫与数据分析系统的设计是一个结合了网络数据抓取、清洗、存储和数据分析的综合项目。这样的系统通常…

【javaWeb Maven高级】Maven高级学习

Maven高级学习 分模块设计继承与聚合继承版本锁定聚合 私服资源的上传与下载本地私服配置 分模块设计 为什么需要进行分模块设计? 将项目按照功能拆分成若干个子模块,方便项目的管理维护,扩展,也方便模块间的相互调用&#xff0c…

vue 打包 插槽 inject reactive draggable 动画 foreach pinia状态管理

在Vue项目中,当涉及到打包、插槽(Slots)、inject/reactive、draggable、transition、foreach以及pinia时,这些都是Vue框架的不同特性和库,它们各自在Vue应用中有不同的用途。下面我将逐一解释这些概念,并说…

vue2项目安装(使用vue-cli脚手架)

使用npm安装 安装镜像(使npm创建项目更快):镜像可更换 npm config set registry https://registry.npmmirror.com1.全局安装vue-cli(一次) npm install -g vue/cli 2. 查看vue-cli 版本 vue --version 3. 创建项目…

HTTP详解及代码实现

HTTP详解及代码实现 HTTP超文本传输协议 URL简述状态码常见的状态码 请求方法请求报文响应报文HTTP常见的HeaderHTTP服务器代码 HTTP HTTP的也称为超文本传输协议。解释HTTP我们可以将其分为三个部分来解释:超文本,传输,协议。 超文本 加粗样…

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念,概念上简单来讲类是它是一组关系密切属性的集合,所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种,比如has a, is a,has some等&…

jenkins+docker实现可持续自动化部署springboot项目

目录 一、前言 二、微服务带来的挑战 2.1 微服务有哪些问题 2.2 微服务给运维带来的挑战 三、可持续集成与交付概述 3.1 可持续集成与交付概念 3.1.1 持续集成 3.1.2 持续交付 3.1.3 可持续集成与交付核心理念 3.2 可持续集成优点 3.3 微服务为什么需要可持续集成 四…

【JVM】如何定位、解决内存泄漏和溢出

目录 1.概述 2.堆溢出、内存泄定位及解决办法 2.1.示例代码 2.2.抓堆快照 2.3.分析堆快照 1.概述 常见的几种JVM内存溢出的场景如下: Java堆溢出: 错误信息: java.lang.OutOfMemoryError: Java heap space 原因:Java对象实例在运行时持…

AI结合机器人的入门级仿真环境有哪些?

由于使用真实的机器人开发和测试应用程序既昂贵又费时,因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟,还可以更轻松地测试在现实世界中可能过于危险的…

【每日刷题】Day3

【每日刷题】Day3 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 目录 1. 69. x 的平方根 - 力扣(LeetCode) 2. 70. 爬楼梯 - 力扣(LeetCode) 3. 118. 杨辉三…

ZYNQ学习Linux 基础外设的使用

基本都是摘抄正点原子的文章:《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》,因初次学习,仅作学习摘录之用,有不懂之处后续会继续更新~ 工程的创建参考:《ZYNQ学习之Petalinux 设计流程实战》 一、GPIO 之 LED 的使…

docker安装jenkins 2024版

docker 指令安装安装 docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts访问…

耐腐蚀耐高温实验室塑料烧杯进口高纯PFA材质反应器特氟龙烧杯

PFA烧杯在实验过程中可作为储酸容器或涉及强酸强碱类实验的反应容器,用于盛放样品、试剂,可搭配电热板加热、蒸煮、赶酸用。 外壁均有凸起刻度,直筒设计,带翻边,便于夹持和移动,边沿有嘴,便于倾…

深挖苹果Find My技术,伦茨科技ST17H6x芯片赋予产品功能

苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明:本文已经 在OpenShift 4.15 OpenShift GitOps 1.11.2 环境中验证 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明:先根据《OpenShift 4 之 GitOp…

vue创建项目下载动态路由v-for mounted websocket :style :class store使用说明

在Vue中创建一个项目,并整合动态路由、v-for、mounted生命周期钩子、WebSocket、:style、:class以及Vuex的store,涉及到多个Vue核心特性的使用。下面我将简要说明如何逐步整合这些特性。 1. 创建Vue项目 使用Vue CLI创建项目: 2. 配置动态路…

sourcetree提交代码出现闪退报错(已解决)

当我在sourcetree提交代码时,点击提交按钮出现闪退关闭,并弹出下面的报错框,报错的图片如下: 那么经过了解,出现这样的报错原因是,git的提交时无法定位提交的人是谁,导致无法提交 那么解决的方…

git中对子模块的本地修改、提交和推送远程仓库

场景 当前的某个项目,其使用了另一个项目,我在本地需要对子项目进行修改,并将这些修改提交到github中的子项目和父项目。其实在github中,子项目都是特定的指向子项目的某次提交,因此对于父项目的修改,其实…

golang 选择排序

学习笔记~ // Author sunwenbo // 2024/4/6 21:49 package mainimport "fmt"/* 选择排序基本介绍选择式排序也属于内部排序法,是从预排序的数据中按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到…