1.linux-ansi
2.Rocketmq 5.0 任意时间定时消息(RIP-43) 原理详解 & 源码解析
3.springbootcloud组件
linux-ansi
crtè¦åé¢è²ï¼ææºå±åºç°crtè¦åé¢è²ï¼æå¦ä¸æ¹æ³:
1ãéå¯ææºï¼å¯å¨åä»ç»è§å¯å±å¹é¢è²æ¯å¦æ¢å¤å°æ£å¸¸ã
2ãæ´æ¢ææºå£çº¸å°è¯ï¼è§å¯å±å¹é¢è²æ¯å¦æ¢å¤å°æ£å¸¸ã
3ãæ£æ¥ç³»ç»è®¾ç½®å¦æéå¯ææºåï¼å±å¹ä»ç¶åè²ï¼ä¸æ¯æ£å¸¸çé¢è²ï¼æ£æ¥ä¸ä¸ç³»ç»ç¸å ³é¢è²è®¾ç½®ãå¨ææºæ¡é¢ä¸æ¾å°è®¾å®ï¼è¿å ¥è¾ å©åè½ï¼å¦ææç±»å«çè¯ï¼éæ©è§è§ï¼å¨è§è§éé¢æ¾å°è´è²ï¼ççè¿ä¸é¡¹æ¯å¦è¢«å¾éãå¨æ£å¸¸æ åµä¸ï¼æ¯ä¸åºè¯¥è¢«å¾éãææºå±å¹é¢è²é½æ¯ç±çº¢ç»¿èä¸åè²ç»æçé¢è²ï¼å³ä¸ºæ£è²ãè´è²ï¼è´è²æ¯å¨æ£è²åºç¡ä¸ï¼è¿æ»¤äºç½å ï¼é常被ç¨æå°ãæ¥çä¸æ¯å¦å¼å¯äºè´è²çåè½ï¼å ³éç¶åéå¯ææºæ¥çã
4ãæ¾ç¤ºæ线æ¾ç¤ºæ线æ¯ä¸»æ¿æ¾ç¤ºICä¸æ¾ç¤ºå±ä¹é´çè§é¢ä¿¡å·ä¼ è¾çº¿ï¼å¦ææ¾ç¤ºæ线èçæè æ¾å¨äºï¼ä¹ä¼å¯¼è´ææºå±å¹åè²æè åºç°åç´çº¿ã
5ãå¤ä»½æ°æ®ï¼è系人ãçä¿¡ãç §ççï¼ï¼æ¢å¤åºå设å®ã
6ãé®é¢ä¾ç¶åå¨ï¼å»ºè®®æºå¸¦ææºè³å½å°ç该ææºå®åæå¡ä¸å¿è¿è¡æ£æµã
crtç»å½äº¤æ¢æºè®¾ç½®è¿æ¥åæ°ï¼
1ãé¦å æå¼è®¡ç®æºï¼å¨è®¡ç®æºå æå¼SecureCRTã
2ãç¶å使ç¨é¼ æ ç¹å»å¿«éè¿æ¥é项ã
3ãåºç°é ç½®çªå£ï¼åè®®éæ©Serialï¼ç«¯å£ä¸è¬éæ©com1ï¼æ³¢ç¹çéæ©ï¼æµæ§æRTSåé¢çå¾å»æï¼å ¶ä»çä¿æé»è®¤å°±å¯ä»¥äºã
4ãæå使ç¨é¼ æ åå»è¿æ¥å³å¯ãæ©å±èµæSecureCRTä¸æ¬¾ç¨äºè¿æ¥è¿è¡å æ¬WindowsãUNIXåVMSççæ³å·¥å ·ãéè¿ä½¿ç¨å å«çVCPå½ä»¤è¡ç¨åºå¯ä»¥è¿è¡å å¯æ件çä¼ è¾ãææµè¡CRTTelnet客æ·æºçææç¹ç¹ï¼å æ¬:èªå¨æ³¨åã对ä¸å主æºä¿æä¸åçç¹æ§ãæå°åè½ãé¢è²è®¾ç½®ãå¯åå±å¹å°ºå¯¸ãç¨æ·å®ä¹çé®ä½å¾åä¼è¯çVT,控系控源VT,VTåANSIç«äº.è½ä»å½ä»¤è¡ä¸è¿è¡æä»æµè§å¨ä¸è¿è¡ãå ¶å®ç¹ç¹å æ¬ææ¬æ稿ãæäºä½¿ç¨çå·¥å ·æ¡ãç¨æ·çé®ä½å¾ç¼è¾å¨ãå¯å®å¶çANSIé¢è²çãSecureCRTçSSHåè®®æ¯æDES,3DESåRC4å¯ç åå¯ç ä¸RSAé´å«ã广æ³çç»ç«¯ä»¿çï¼VTï¼VTï¼VTï¼ANSIï¼SCOANSIï¼Xtermï¼Wyse/åLinuxconsole仿çï¼å¸¦æANSIé¢è²ï¼ãä¼ç§çä¼è¯ç®¡çç¹æ§ï¼æ°ç带æ ç¾çç¨æ·çé¢åActivatoræçå·¥å ·ï¼æå°åæ¡é¢çæä¹±ãä¼è¯è®¾ç½®å¯ä»¥ä¿åå¨å½åçä¼è¯ä¸ãåè®®æ¯æ:æ¯æSSH1ï¼SSH2ï¼Telnetï¼RLoginï¼Serialï¼åTAPIåè®®ã
linuxå¾åç¹ç¹ï¼
æ7个ç¹ç¹ï¼
1ãLinuxç³»ç»æ¯å è´¹çèªç±è½¯ä»¶ï¼éè¿å ¬å ±è®¸å¯åè®®GPLçèªç±è½¯ä»¶ã
2ãè¯å¥½ç硬件åå°å¯ç§»æ¤æ§ï¼
硬件平å°å¯ç§»æ¤æ§æå°æä½ç³»ç»ä»ä¸ä¸ªç¡¬ä»¶å¹³å°è½¬ç§»å°å¦ä¸ä¸ªç¡¬ä»¶å¹³å°æ¶ï¼åªéè¦ä¿®æ¹åºå±å°é代ç ï¼æ éæ¹åèªèº«çè¿è¡æ¹å¼ã
3ã符åPOSIXæ åï¼
称为å¯ç§»æ¤çLinuxæä½ç³»ç»æ¥å£ï¼æ¯ç±ANSIåISOå¶è®¢çä¸ç§å½é æ åï¼å¨æºä»£ç 级å«ä¸å®ä¹äºä¸ç»æå°çLinuxæä½ç³»ç»æ¥å£ãLinuxç³»ç»éµå¾ªè¿ä¸æ åï¼ä½¿å¾å®åå ¶ä»ç±»åçLinuxç³»ç»ä¹é´å¯ä»¥å¾æ¹ä¾¿å°ç¸äºç§»æ¤å¹³å°ä¸çåºç¨è½¯ä»¶ã
4ãè¯å¥½çå¾å½¢ç¨æ·çé¢ï¼
å ·æ类似äºWindowsæä½ç³»ç»çå¾å½¢çé¢ï¼å称æ¯X-Windowç³»ç»ï¼å®èµ·æºäºLinuxæä½ç³»ç»çæ åå¾å½¢çé¢ï¼å¯ä»¥ä¸ºç¨æ·æä¾ä¸ç§å ·æå¤ç§çªå£ç®¡çåè½ç对象éæç¯å¢ã
5ã强大çç½ç»åè½ï¼
Linuxç³»ç»æ¯ä¾é äºèç½å¹³å°åå±èµ·æ¥çï¼å ·æ强大çç½ç»åè½ãå¨å æ ¸ä¸å®ç°äºTCP/TPåè®®ç°ï¼æä¾äºå¯¹TCP/TPåè®®ç°çæ¯æã
6ã丰å¯çåºç¨ç¨åºåå¼åå·¥å ·ï¼
Linuxç³»ç»å ·æè¯å¥½çå¯ç§»æ¤æ§ï¼ç®åç»å¤§é¨åå ¶ä»Linuxç³»ç»ä¸ä½¿ç¨çæµè¡è½¯ä»¶é½å·²ç»ç§»æ¤å°Linuxç³»ç»ä¸ã
7ãå®å ¨æ§å稳å®æ§ï¼
Linuxç³»ç»éåäºå¤ç§å®å ¨æªæ½ï¼æ¯å¦è¯´ä»»å¡ä¿æ¤æºå¶ã审计è·è¸ªãæ ¸å¿æ¥æ ¡ã访é®ææçï¼ä¸ºç½ç»å¤ç¨æ·ç¯å¢ä¸çç¨æ·æä¾äºå¼ºå¤§çå®å ¨ä¿é;å¦å¤Linuxç³»ç»å ·ææ强ç稳å®æ§ï¼å¯ä»¥é¿æ¶é´ç¨³å®è¿è¥ã
linuxåcè¯è¨æä»ä¹åºå«ï¼
Cè¯è¨åLinuxåºæ¬ä¸æ²¡æä»ä¹åºå«ã
æ们æä¹ä¸çCè¯è¨ï¼æ¯æ åANSICï¼æ¯ä»»ä½Cç¼è¯å¨é½åºè¯¥éµå¾ªçCè¯è¨åè®®ã
èLinuxå ¶å®ç¹æçæ¯Linuxä¸çGCCç¼è¯å¨ï¼GCCç¼è¯å¨å®å ¨éµå¾ªANSICï¼å¹¶å¨æ¤åºç¡ä¸ååäºä¸äºæ©å±ï¼ä¾å¦ï¼
1ï¼å¯¹ASMè¯æ³çæ¯æ
2ï¼ç¼è¯å¨æ¯æå èå½æ°
3ï¼æ¯æ__attribute__æºå¶
Rocketmq 5.0 任意时间定时消息(RIP-) 原理详解 & 源码解析
延迟消息,又称定时消息,统源其核心在于消息到达消息队列服务端后不会立即投递,码免码而是费流在特定时间点投递给消费者。这种机制在当前互联网环境中有着广泛的控系控源需求,尤其在电商、统源putty源码中文网约车等场景中,码免码用户下单后可能不会立即付款,费流订单也不会一直处于开启状态,控系控源需要一定时间后进行回调,统源以关闭订单。码免码此时,费流使用分布式定时任务或消息队列发送延迟消息是控系控源更轻量级的选择。
延迟消息与定时消息在实现效果上相同,统源都是码免码指消息在经过一段时间后才会被投递。在RocketMQ 4.x中,仅支持通过设定延迟等级来支持个固定延迟时间。然而,这种方案的局限性在于无法支持任意时间的定时,且最大定时时间仅为2小时,性能也难以满足需求。因此,许多公司开始自研任意时间定时消息,扩展最大定时时长。
在RocketMQ 5.x中,开源了支持任意时间的本地圈源码定时消息。与4.x的延迟消息相比,5.x的定时消息在实现机制上完全不同,互不影响。在5.x客户端中,构造消息时提供了3个API来指定延迟时间或定时时间。
任意时间定时消息的实现存在一些难点,例如任意的定时时间、定时消息的存储和老化、以及大量定时消息的极端情况等。为了解决这些问题,RIP-引入了TimerWheel和TimerLog两个存储文件,以实现任意时间的定时功能。TimerWheel是一个时间轮的抽象,表示投递时间,它保存了2天(默认)内的所有时间窗。TimerLog则是定时消息文件,保存定时消息的索引,以链表结构存储。通过这两个文件,可以有效地实现任意时间的定时功能。
此外,RIP-还设计了定时任务划分和解耦的机制,将定时消息的保存和投递分为多个步骤,每个步骤都由一个服务线程来处理。通过使用生产-消费模式,医院网页源码实现了任务的解耦和流控,确保了系统的稳定性和性能。
在源码解析方面,RIP-中引入了TimerWheel和TimerLog两个文件,以及TimerEnqueueGetService、TimerEnqueuePutService、TimerDequeueGetService、TimerDequeueGetMessageService、TimerDequeuePutMessageService等组件,实现了定时消息的保存和投递功能。
springbootcloud组件
.SpringBoot和SpringCloud的关系
很多人新手对于SpringBoot和SpringCloud的关系说不清楚、理解不清楚,本文抽出点时间来进行分享下自己的理解,以帮助大家更好的理解两者之间的关系。
其设计目的之初是用来简化Spring应用的初始搭建以及开发过程。很多东西都是配置好的,约定大于配置,使用注解替代了很多xml臃肿的配置,极大的简化了项目配置的消耗,提供了高效的编程脚手架。
Cloud相当于利用了SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,像是服务注册发现、配置中心、消息总线、负载均衡、搭建牛牛源码断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署,SpringCloud并没有重复的造轮子,把各家公司成熟,经得起考验的服务框架组合起来,通过SpringBoot屏蔽调复杂的配置和实现原理,留给开发者一套简单易懂、容易部署、容易维护的分布式开发工具包。
其中的关系是:
Spring-》SpingBoot-》SpringCloud
Cloud的核心组件:
感觉这个话题能写好多的东西,像是SpingCloud和Dubbbo的微服务选型等等再进行对比、比较优缺点,本篇就简单的进行了总结和介绍,希望能帮助到有困惑的朋友吧,后面有时间在写一些文章进行拓展和补充。
SpringCloud微服务体系的组成NetflixEureka是SpringCloud服务注册发现的基础组件
Eureka提供RESTful风格(HTTP协议)的服务注册与发现
Eureka采用C/S架构,SpringCloud内置客户端
启用应用,访问
Eureka客户端开发要点
maven依赖spring-cloud-starter-netflix-eureka-clientapplication.yml
配置eureka.client.service-url.defaultZone
入口类增加@EnableEurekaClient
先启动注册中心,在启动客户端,访问localhost:查看eureka注册中心,看到客户端注册
Eureka名词概念
Register-服务注册,向Eureka进行注册登记
Renew-服务续约,秒/次心跳包健康检查.秒未收到剔除服务
FetchRegistries-获取服务注册列表,获取其他微服务地址
Cancel-服务下线,某个微服务通知注册中心暂停服务
Eviction-服务剔除,秒未续约,从服务注册表进行剔除
Eureka自我保护机制
Eureka在运行期去统计心跳失败率在分钟之内是否低于%
如果低于%,会将这些实例保护起来,让这些实例不会被剔除
关闭自我保护:eureka.服务实例.
enable-self-preservation:false
PS:如非网络特别不稳定,建议关闭
Eureka高可用配置步骤
服务提供者defaultZone指向其他的Eureka
客户端添加所有Eureka服务实例URL
Actuator自动为微服务创建一系列的用于监控的端点
Actuator在SpringBoot自带,SpringCloud进行扩展
pom.xml依赖spring-boot-starter-actuator
RestTemplate+@LoadBalanced显式调用
OpenFeign隐藏微服务间通信细节
Ribbon是RestTemplate与OpenFeign的通信基础
Feign是一个开源声明式WebService客户端,用于简化服务通信
Feign采用“接口+注解”方式开发,屏蔽了网络通信的细节
OpenFeign是SpringCloud对Feign的增强,支持SpringMVC注解
1.新建SpringbootWeb项目,applicationname为product-service
在pom.xml中引入依赖
spring-cloud-starter-alibaba-nacos-discovery作用为向Nacosserver注册服务。
spring-cloud-starter-openfeign作用为实现服务调用。负数源码反码
2.修改application.yml配置文件
3.在启动类上添加@EnableDiscoveryClient、@EnableFeignClients注解
4.编写OrderClientInterface
注:/api/v1/order/test会在下面order-service声明。
OrderClient.java
5.编写Controller和service
ProductController.java
ProductService.java
1.OpenFeign开启通信日志
基于SpringBoot的logback输出,默认debug级别
设置项:feign.client.config.微服务id.loggerLevel
微服务id:default代表全局默认配置
2.通信日志输出格式
NONE:不输出任何通信日志
BASIC:只包含URL、请求方法、状态码、执行时间
HEADERS:在BASIC基础上,额外包含请求与响应头
FULL:包含请求与响应内容最完整的信息
3.OpenFeign日志配置项
LoggerLevel开启通信日志
ConnectionTimeout与ReadTimeout
利用flix-hystrix-dashboard
监控微服务利用@EnableHystrixDashboard开启仪表盘
9.Hystrix熔断设置
产生熔断的条件:
当一个RollingWindow(滑动窗口)的时间内(默认:秒),最近次调用请求,请求错误率超过%,则触发熔断5秒,期间快速失败。
TIPS:如秒内未累计到次,则不会触发熔断
Hystrix熔断设置项:
统一访问出入口,微服务对前台透明
安全、过滤、流控等API管理功能
易于监控、方便管理
NetflixZuul
SpringCloudGateway
Zuul是Netflix开源的一个API网关,核心实现是Servlet
SpringCloud内置Zuul1.x
Zuul1.x核心实现是Servlet,采用同步方式通信
Zuul2.x基于NettyServer,提供异步通信
认证和安全
性能监测
动态路由
负载卸载
静态资源处理
压力测试
SpringCloudGateway,是Spring“亲儿子”
SpringCloudGateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
Gateway基于Spring5.0与SpringWebFlux开发,采用Reactor响应式设计
1.使用三部曲
依赖spring-cloud-starter-netflix-zuul
入口增加@EnableZuulProxy
application.yml增加微服务映射
2.微服务映射
SpringCloudZuul内置Hystrix
服务降级实现接口:FallbackProvider
1.微服务网关流量控制
微服务网关是应用入口,必须对入口流量进行控制
RateLimit是SpringCloudZuul的限流组件
RateLimit采用“令牌桶”算法实现限流
2.什么是令牌桶
1.Zuul的执行过程
2.Http请求生命周期
1.需要实现ZuulFilter接口
shouldFilter()-是否启用该过滤器
filterOrder()-设置过滤器执行次序
filterType()-过滤器类型:pre|routing|post
run()-过滤逻辑
2.Zuul内置过滤器
3.Zuul+JWT跨域身份验证
1.SpringCloudConfig
2.携程Apollo
3.阿里巴巴Nacos
1.依赖"spring-cloud-starter-config"
2.删除application.yml,新建bootstrap.yml
3.配置"配置中心"服务地址与环境信息
1、微服务依赖"spring-boot-starter-actuator";
2、动态刷新类上增加@RefreshScope注解
3、通过/actuator/refresh刷新配置
1、通过加入重试机制、提高应用启动的可靠性;
2、重试触发条件1:配置中心无法与仓库正常通信
3、重试触发条件2:微服务无法配置中心正常通信
SpringCloud整体构架设计(一)
SpringClound整体核心架构只有一点:Rest服务,也就是说在整个SpringCloud配置过程之中,所有的配置处理都是围绕着Rest完成的,在这个Rest处理之中,一定要有两个端:服务的提供者(Provider)、服务的消费者(Consumer),所以对于整个SpringCloud基础的结构就如下所示:
既然SpringCloud的核心是Restful结构,那么如果要想更好的去使用Rest这些微服务还需要考虑如下几个问题。
1、所有的微服务地址一定会非常的多,所以为了统一管理这些地址信息,也为了可以及时的告诉用户哪些服务不可用,所以应该准备一个分布式的注册中心,并且该注册中心应该支持有HA机制,为了高速并且方便进行所有服务的注册操作,在SpringCloud里面提供有一个Eureka的注册中心。
对于整个的WEB端的构架(SpringBoot实现)可以轻松方便的进行WEB程序的编写,而后利用Nginx或Apache实现负载均衡处理,但是你WEB端出现了负载均衡,那么业务端呢?应该也提供有多个业务端进行负载均衡。那么这个时候就需要将所有需要参与到负载均衡的业务端在Eureka之中进行注册。
在进行客户端使用Rest架构调用的时候,往往都需要一个调用地址,即使现在使用了Eureka作为注册中心,那么它也需要有一个明确的调用地址,可是所有的操作如果都利用调用地址的方式来处理,程序的开发者最方便应用的工具是接口,所以现在就希望可以将所有的Rest服务的内容以接口的方式出现调用,所以它又提供了一个Feign技术,利用此技术可以伪造接口实现。
在进行整体的微架构设计的时候由于牵扯的问题还是属于RPC,所以必须考虑熔断处理机制,实际上所有的熔断就好比生活之中使用保险丝一样,有了保险丝在一些设备出现了故障之后依然可以保护家庭的电器可以正常使用,如果说现在有若干的微服务,并且这些微服务之间可以相互调用,例如A微服务调用了B微服务,B微服务调用了C微服务。
如果在实际的项目设计过程之中没有处理好熔断机制,那么就会产生雪崩效应,所以为了防止这样的问题出现,SpringCloud里面提供有一个Hystrix熔断处理机制,以保证某一个微服务即使出现了问题之后依然可以正常使用。
通过Zuul的代理用户只需要知道指定的路由的路径就可以访问指定的微服务的信息,这样更好的提现了java中的“key=value”的设计思想,而且所有的微服务通过zuul进行代理之后也更加合理的进行名称隐藏。
在SpringBoot学习的时候一直强调过一个问题:在SpringBoot里面强调的是一个“零配置”的概念,本质在于不需要配置任何的配置文件,但是事实上这一点并没有完全的实现,因为在整个在整体的实际里面,依然会提供有application.yml配置文件,那么如果在微服务的创建之中,那么一定会有成百上千个微服务的信息出现,于是这些配置文件的管理就成为了问题。例如:现在你突然有一天你的主机要进行机房的变更,所有的服务的IP地址都可能发生改变,这样对于程序的维护是非常不方便的,为了解决这样的问题,在SpringCloud设计的时候提供有一个SpringCloudConfig的程序组件,利用这个组件就可以直接基于GIT或者SVN来进行配置文件的管理。
在整体设计上SpringCloud更好的实现了RPC的架构设计,而且使用Rest作为通讯的基础,这一点是他的成功之处,由于大量的使用了netflix公司的产品技术,所以这些技术也有可靠的保证。
Spring全家桶笔记:Spring+SpringBoot+SpringCloud+SpringMVC最近我整理了一下一线架构师的Spring全家桶笔记:Spring+SpringBoot+SpringCloud+SpringMVC,分享给大家一起学习一下~文末免费获取哦
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
1.1Spring面试必备题+解析
1.2Spring学习笔记
(1)Spring源码深入解析
(2)Spring实战
1.3Spring学习思维脑图
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapidapplicationdevelopment)成为领导者。
2.1SpringBoot面试必备题+解析
2.2SpringBoot学习笔记
(1)SpringBoot实践
(2)SpringBoot揭秘快速构建微服务体系
2.3SpringBoot学习思维脑图
springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。
3.1SpringCloud面试必备题+解析
3.2SpringCloud学习笔记
(1)SpringCloud参考指南
SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发
4.1SpringMVC面试必备题+解析
4.2SpringMVC学习笔记
(1)看透SpringMVC源代码分析与实践
(2)精通SpringMVC
最后分享一下一份JAVA核心知识点整理(PDF)
SpringBoot和SpringCloud的区别1、springcloud是基于springboot的一种框架,包括eureka、ribbon、feign、zuul、hystrix等
2、SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot
3、Springboot是Spring的一套快速配置脚手架,可以基于springboot快速开发单个微服务;SpringCloud是一个基于SpringBoot实现的云应用开发工具;
4、Springboot专注于快速、方便集成的单个个体,SpringCloud是关注全局的服务治理框架;
5、springboot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,SpringCloud很大的一部分是基于Springboot来实现。
6、Springboot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开Springboot,属于依赖的关系。
Spring-SpringBootSpringCloud这样的关系