spring-cloud-Alibaba组件

本文并非原创,是本人为了将自己的学习过程落地,在网络上收集文章,并结合自己的理解整理而成。行文若有错漏之处,希望各位看官不吝指出。

一 分布式基础概念

集群是个物理形态,分布式是个工作方式。
集群:集群是一组相互独立的、通过高速网络互联的计算机。其实就是将互相联通的独立计算机视为一个组合,这个组合就叫集群。
分布式:多个系统协同合作完成一个特定任务的系统
远程调用:在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的相互调用,我们成为远程调用
springcloud中使用HTTP+JSON的方式完成远程调用

本项目使用基础组件一览
SpringCloud Alibaba-Nacos 注册中心(服务发现/注册)≈Eurka
SpringCloud Alibaba-Nacos 配置中心(动态配置管理)≈SpringCloud Config
SpringCloud-Ribbon 负载均衡
SpringCloud-Feign 声明式HTTP客户端(调用远程服务)?此处应该为OpenFeign
SpringCloud Alibaba-Sentinel 服务容错(限流、降级、熔断)≈Hystrix
SpringCloud-Geteway API网关(webflux编程模式)≈Zuul
SpringCloud-Sleuth:调用链监控
SpringCloud Alibaba-Seata 原Fescar,即分布式事务解决方案
spring-cloud-Alibaba组件_第1张图片

二、Nacos Discovery Nacos作为注册中心

服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,那些是正常的,那些服务已经下线。解决这个问题可以引入注册中心。
配置中心用来几种管理微服务的配置信息。

1.如何接入
1)引入依赖



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

2)安装nacos,配置nacos的application.yml中的配置中心地址

spring
	cloud:
  		nacos:
    		discovery:
      			server-addr: ip:8848

3)在启动类中添加@EnableDiscoveryClient注解
添加服务注册的功能

spring
	cloud:
  		application:
  			name: mall-coupon

4)添加服务在注册中心中的代称

分布式项目里,所有的包都需要做上述操作

二、SpringCloud Alibaba-Nacos 作为配置中心

1.在基础组件包中引入依赖



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config

2.在服务中的bootstrap.properties文件中配置代称与地址

spring.application.name=mall-ware
spring.cloud.nacos.config.server-addr=ip:8848

3.给配置中心添加一个数据集(data id)默认规则为应用名.properties的配置文件

4.在controller中加入@RefreshScope注解,动态刷新nacos中配置的值

5.@Value动态获取配置文件中的值
获取规范:@Value("${配置项的参数名}")

6.优先使用配置中心的值

7.细节
1)命名空间:主要是用来配置隔离的
默认:public
作用:开发、生产、测试等环境的分离
需要在bootstrap.properties文件中配置命名空间地址

spring.cloud.nacos.config.namespace=*******

三 gateway

客户端发送请求到服务器路途中,设置一个网关,请求都先到达网关,网关对请求进行统一认证(合法非法)和处理等操作。他是安检。
在微服务架构中,API gateway作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多API管理难题。

gateway三大概念
1.route:路由(发送请求至网关,网关再将其路由到特定的位置)。
路由的标志:
①ID ②目的地的URI ③断言的集合 ④过滤器的集合 只要匹配为真,就会路由到特定的位置
2.predicat:断言(java8里的断言函数)允许开发人员匹配当前请求的任何信息(请求头或请求参数)
3.filter:过滤器 请求或者响应在到达指定地点之前都可以进行修改

四openFeign使用

1.想要远程调用别的服务
1)引入open-feign

2)编写接口,告诉springcloud接口需要调用远程服务
spring-cloud-Alibaba组件_第2张图片

①声明接口的哪一个接口是调用哪个服务的
spring-cloud-Alibaba组件_第3张图片

3)开启远程调用功能
spring-cloud-Alibaba组件_第4张图片

五:服务容错

服务熔断&服务降级

在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
rpc远程调用情景:
订单服务 --> 商品服务 --> 库存服务
库存服务出现故障导致响应慢,导致商品服务需要等待,可能等到10s后库存服务才能响应。库存服务的不可用导致商品服务阻塞,商品服务等的期间,订单服务也处于阻塞。一个服务不可用导致整个服务链都阻塞。如果是高并发,第一个请求调用后阻塞10s得不到结果,第二个请求直接阻塞10s。更多的请求进来导致请求积压,全部阻塞,最终服务器的资源耗尽。导致雪崩

解决方案:
1 服务熔断
指定超时时间,库存服务3s没有响应就超时,如果经常失败,比如10s内100个请求都失败了。开启断路保护机制,下一次请求进来不调用库存服务了,因为上一次100%错误都出现了,我们直接在此中断,商品服务直接返回,返回一些默认数据或者null,而不调用库存服务了,这样就不会导致请求积压。
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据
2 服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者处理简单【抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】

六 服务调用流程

spring-cloud-Alibaba组件_第5张图片

前后分离开发,分为内网部署和外网部署,外网是面向公众访问的,部署前端项目,可以有手机APP,电脑网页;内网部署的是后端集群,前端在页面上操作发送请求到后端,在这途中会经过Nginx集群,Nginx把请求转交给API网关(springcloud gateway)(网关可以根据当前请求动态地路由到指定的服务,看当前请求是想调用商品服务还是购物车服务还是检索),从路由过来如果请求很多,可以负载均衡地调用商品服务器中一台(商品服务复制了多份),当商品服务器出现问题也可以在网关层面对服务进行熔断或降级(使用阿里的sentinel组件),网关还有其他的功能如认证授权、限流(只放行部分到服务器)等。

到达服务器后进行处理(springboot为微服务),服务与服务可能会相互调用(使用feign组件),有些请求可能经过登录才能进行(基于OAuth2.0的认证中心。安全和权限使用springSecurity控制)

服务可能保存了一些数据或者需要使用缓存,我们使用redis集群(分片+哨兵集群)。持久化使用mysql,读写分离和分库分表。

服务和服务之间会使用消息队列(RabbitMQ),来完成异步解耦,分布式事务的一致性。有些服务可能需要全文检索,检索商品信息,使用ElaticSearch。

服务可能需要存取数据,使用阿里云的对象存储服务OSS。

项目上线后为了快速定位问题,使用ELK对日志进行处理,使用LogStash收集业务里的各种日志,把日志存储到ES中,用Kibana可视化页面从ES中检索出相关信息,帮助我们快速定位问题所在。

在分布式系统中,由于我们每个服务都可能部署在很多台机器,服务和服务可能相互调用,就得知道彼此都在哪里,所以需要将所有服务都注册到注册中心。服务从注册中心发现其他服务所在位置(使用阿里Nacos作为注册中心)。

每个服务的配置众多,为了实现改一处配置相同配置就同步更改,就需要配置中心,也使用阿里的Nacos,服务从配置中心中动态取配置。

服务追踪,追踪服务调用链哪里出现问题,使用springcloud提供的Sleuth、Zipkin、Metrics,把每个服务的信息交给开源的Prometheus进行聚合分析,再由Grafana进行可视化展示,提供Prometheus提供的AlterManager实时得到服务的告警信息,以短信/邮件的方式告知服务开发人员。

还提供了持续集成和持续部署。项目发布起来后,因为微服务众多,每一个都打包部署到服务器太麻烦,有了持续集成后开发人员可以将修改后的代码提交到github,运维人员可以通过自动化工具Jenkins Pipeline将github中获取的代码打包成docker镜像,最终是由k8s集成docker服务,将服务以docker容器的方式运行。

参考链接: https://blog.csdn.net/hancoder/article/details/106922139

你可能感兴趣的:(java,mysql,spring)