SpringCloud-相关总结

3 篇文章 0 订阅
2 篇文章 0 订阅

SpringCloud–1

这是新手学完springCloud的相关总结以及自己的一些感悟,用于后期回忆以及学习



前言

在项目开发中随着业务越来越多,导致功能之间耦合性高、开发效率低、系统运行缓慢难以维护、不稳定。微服务架构可以解决这些问题,而Spring Cloud是微服务架构最流行的实现,所以我就开始学习Spring Cloud.


一、架构的相关演变

架构一词开始之初,就出现了很多架构方式的一系列演变,这也是为了满足多方面的要求。由开始的集中式架构,到后面出现的垂直拆分,再到分布式服务,服务治理(SOA),微服务

1、集中式架构:

  • 当网站流量很小时,只需要一个应用,将所有的功能都部署在一起,以减少部署节点和成本。

2、垂直拆分:

  • 当访问量逐渐增大,单一应用无法满足需求,此时为了应对更高的并发和业务需求,我们根据业务功能对系统进行拆分:

3、分布式服务:

  • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式调用是关键。

4、服务治理(SOA):
-SOA(Service Oriented Architecture)面向服务的架构:它是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务通常以独立的形式存在于操作系统进程中。各个服务之间通过网络调
用:

5、微服务:

  • 微服务架构是使用一套小服务来开发单个应用的方式或途径,每个服务基于单一业务能力构建,运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,并能够通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。 微服务结构图 :
    微服务架构图

二、开始进入SpringCloud

1.简介

Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。Spring Cloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

  • Netflix
  • Eureka:注册中心
  • Zuul:服务网关
  • Ribbon:负载均衡
  • Feign:服务调用
  • Hystrix:熔断器

以上只是其中一部分,架构图:

在这里插入图片描述

2、版本

Spring Cloud的版本命名比较特殊,因为它不是一个组件,而是许多组件的集合,它的命名是以A到Z为首字母的一些单词组成(其实是伦敦地铁站的名字):
在这里插入图片描述
在这里插入图片描述

3.开始进行SpringCloud几大组件相关介绍

1.自己的理解(强烈推荐听我吹牛)

  • 自己对springCloud的前期理解与引入:

springCloud是微服务的真实表现(因为它就是微服务),开始我们进行程序开发的时候都是采用的是集中式的开发架构(通俗点讲就是一个程序一个springBoot或者是一个ssm框架进行也可以是初始的java web 这是我目前知道的并且会得框架)这样就会引发一个很直观的问题,这么多的程序在一个框架中就会发现这样的框架就显得很臃肿,并且不利于后去对其进行相关的修改。那么微服务就很666了。不得不说提出这个的人就是个人才,因为我切实的体验了ssm框架写一个项目的困难,有许多的东西不能说改就改,这就真的很麻烦。(到这里可能会觉得说了很多无用的,但是这是自己的相关总结。一个个的服务由一个个的ssm或者springBoot组成,在前端需要这样的一些功能服务板块的时候就可以通过(GateWay【网关】)进行相关的跨域调用,当然这是学习springCloud必须的东西)进行调用,那么怎么调用呢?

  • 看下面

接上面怎么调用呢?通过url啊!就好比网页进行数据访问一样(http://localhost/XXXX)这样喽。这又要考虑到另一个东西,RPC与Http
这个后面说吧。然后难道要一个个进行调用吗?有没有什么东西可以汇总呢?当然有了(就好比nba的球员一样,在大街上你怎么知道他是不是呢?球员注册!!!)那么这样的一个个微服务有没有类似的注册中心呢?(Eureka【注册中心】)注册了不就可以有次序的进行调用了嘛。事情就是这样的。那么怎么进行调用呢?如果有很多的服务集群呢?排队一个个来也可以,随机也显得无所谓(Feign【服务调用】Ribbon【负载均衡】)一个是用来进行相关的服务调用的,一个是用来进行多个服务时不至于出错!!那出错了怎么办?家里面的电灯当温度过高的时候都会进行那个什么丝的熔断那么这里也是一样的嘛,访问不了就熔断,可以访问了就恢复。对了这里还有个雪崩问题。后面说吧,反正不熔断就会雪崩(redis雪崩差球不多)

2.Eureka注册中心

Eureka做什么?–上面吹牛的时候也提到了

  • Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
  • 同时,服务提供方与Eureka之间通过 “心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。
  • 这就实现了服务的自动注册、发现、状态监控。
    在这里插入图片描述

Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
心跳(续约):提供者定期通过HTTP方式向Eureka刷新自己的状态

  • 基础架构

Eureka架构中的三个核心角色:
1.服务注册中心
Eureka的服务端应用,提供服务注册和发现功能
2.服务提供者
提供服务的应用,可以是Spring Boot应用,也可以是其它任意技术实现,只要对外提供的是REST风格服务即
可。
3.服务消费者
消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。

3.负载均衡Ribbon

什么是Ribbon?
在这里插入图片描述

  • 因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。直接修改代码:在RestTemplate的配置方法上添加 @LoadBalanced 注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
  • 修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, User.class);
}

4.Hystrix

  • Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败。
1.雪崩问题
  • 微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路:
    在这里插入图片描述
  • 如图,一次业务请求,需要调用A、P、H、I四个服务,这四个服务又可能调用其它服务。 如果此时,某个服务出现异常
    在这里插入图片描述
  • 例如: 微服务I 发生异常,请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的 用户请求到来,越来越多的线程会阻塞:
    在这里插入图片描述
    服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成
    雪崩效应。
    这就好比,一个汽车生产线,生产不同的汽车,需要使用不同的零件,如果某个零件因为种种原因无法使用,那么就会造成整台车无法装配,陷入等待零件的状态,直到零件到位,才能继续组装。 此时如果有很多个车型都需要这个零件,那么整个工厂都将陷入等待的状态,导致所有生产都陷入瘫痪。一个零件的波及范围不断扩大
2.线程隔离 与 服务降级
  • Hystrix解决雪崩问题的手段,主要包括:
  • 1.线程隔离----
  • Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加
    速失败判定时间。
  • 2.服务降级
  • 服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。 触发Hystrix服务降级的情况:1.线程池已满 2.请求超时
3.服务熔断
  • 服务熔断原理

在服务熔断中,使用的熔断器,也叫断路器,其英文单词为:Circuit Breaker 熔断机制与家里使用的电路熔断原理
类似;当如果电路发生短路的时候能立刻熔断电路,避免发生灾难。在分布式系统中应用服务熔断后;服务调用方
可以自己进行判断哪些服务反应慢或存在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。
Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续
请求直接拒绝,一段时间(默认5秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打 开,拒绝请求的服务。

5.Feign

为什么叫伪装?

  • Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。(这就不用很麻烦了)
1.负载均衡
  • Feign中本身已经集成了Ribbon依赖和自动配置:

因此不需要额外引入依赖,也不需要再注册 RestTemplate 对象。Fegin内置的ribbon默认设置了请求超时时长,默认是1000,我们可以通过手动配置来修改这个超时时长:

ribbon:
ReadTimeout: 2000 # 读取超时时长
ConnectTimeout: 1000 # 建立链接的超时时长

或者为某一个具体service指定

user-service
ribbon:
ReadTimeout: 2000 # 读取超时时长
ConnectTimeout: 1000 # 建立链接的超时时长
2.Hystrix支持(服务熔断)
  • Feign默认也有对Hystrix的集成:

只不过,默认情况下是关闭的。需要通过下面的参数来开启:

feign:
	hystrix:
		enabled: true # 开启Feign的熔断功能

6.Spring Cloud Gateway网关

1.简介:
  • Spring Cloud Gateway是Spring官网基于Spring 5.0、 Spring Boot 2.0、Project Reactor等技术开发的网关服务。
  • Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。
  • Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。
  • Spring Cloud Gateway是替代Netflix Zuul的一套解决方案。
  • Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册到Eureka服务注册中心。
  • 网关的核心功能是:过滤和路由
2.Gateway加入后的架构

在这里插入图片描述

这里就会这及到一个跨域访问的问题:
一般你没有定义你需要跨域访问的域名就会报这样一个错------

已拦截跨源请求:同源策略禁止读取位于 http://localhost:8080/bill/list-page?page=1&limit=10 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')---------跨域问题---需要明白网关的设置
  • 以上问题解决:

在这里插入图片描述

3.核心概念
  • 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
  • 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于HTTP Request中的任何信息比如请求头和参数。
  • 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

配置截图》》》》》》》》》

server:
	port: 10010
spring:
	application:
		name: api-gateway
	cloud:
		gateway:
			routes:# 这是路由
			# 路由id,可以随意写
				- id: user-service-route
				# 代理的服务地址
				uri: lb://user-service
				# 路由断言,可以配置映射路径
				predicates:# 这是断言
					- Path=/**
				filters:# 这是过滤器
				# 添加请求路径的前缀
					- PrefixPath=/user
4. 过滤器
  • Gateway作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作往往是通过网关提供的过滤器来实现的。前面的 路由前缀 章节中的功能也是使用过滤器实现的。

几个常用
在这里插入图片描述

  • 执行生命周期
    Spring Cloud Gateway 的 Filter 的生命周期也类似Spring MVC的拦截器有两个:“pre” 和 “post”。“pre”和 “post”分别会在请求被执行前调用和被执行后调用
    在这里插入图片描述

这里的 pre 和 post 可以通过过滤器的 GatewayFilterChain 执行filter方法前后来实现

5. 使用场景
  • 请求鉴权:一般 GatewayFilterChain 执行filter方法前,如果发现没有访问权限,直接就返回空。
  • 异常处理:一般 GatewayFilterChain 执行filter方法后,记录异常并返回。
  • 服务调用时长统计: GatewayFilterChain 执行filter方法前后根据时间统计。
6. 负载均衡和熔断
  • Gateway中默认就已经集成了Ribbon负载均衡和Hystrix熔断机制。但是所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了。因此建议手动进行配置:
    在这里插入图片描述
7.Gateway跨域配置(很重要)
  • 一般网关都是所有微服务的统一入口,必然在被调用的时候会出现跨域问题。
    跨域:在js请求访问中,如果访问的地址与当前服务器的域名、ip或者端口号不一致则称为跨域请求。若不解决则不能获取到对应地址的返回结果。如:

从在http://localhost:9090中的js访问
http://localhost:9000的数据,因为端口不同,所以也是跨域请求。

  • 在访问Spring Cloud Gateway网关服务器的时候,出现跨域问题的话;可以在网关服务器中通过配置解决,允许哪些服务是可以跨域请求的;具体配置如下:

在这里插入图片描述

在这里插入图片描述

8.Gateway与Feign的区别
  • Gateway 作为整个应用的流量入口,接收所有的请求,如PC、移动端等,并且将不同的请求转- 发至不同的处理微服务模块,其作用可视为nginx;大部分情况下用作权限鉴定、服务端流量控制
  • Feign 则是将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用

7.Spring Cloud Config分布式配置中心

  • 在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服务的本地,也支持放在远程Git仓库(GitHub、码云)。
    使用Spring Cloud Config配置中心后的架构如下图
    在这里插入图片描述

就是放在云端,好用点

8.Spring Cloud Bus服务总线

  • Spring Cloud Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。也就是消息总线可以为微服务做监控,也可以实现应用程序之间相互通信。 Spring Cloud Bus可选的消息代理有RabbitMQ和Kafka。
    使用了Bus之后 :

在这里插入图片描述

9.Spring Cloud 完整体系架构图

在这里插入图片描述


总结:

  • 这是学习完springCloud的一系列相关知识,在下面的文章中会使用一个相关案列切实的理解微服务的总体工作原理。
  • 这里的很多东西不是很完善,具体要多看看案列以及资料
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值