springcloud alibaba

springcloud alibaba与springcloud区别

springcloud:spring团队开源微服务工具集帮助我们快速构建分布式系统(微服务系统),有netflix解决方案
spring cloud Alibaba:Alibaba团队开源微服务工具集帮助我们快速构建分布式系统,有Alibaba解决方案。spring cloud 阿里巴巴为分布式应用开发一共了一站式解决方案,包含了分布式应用的所以组件

spring cloud Alibaba 特点 提供组件

1、Flow control and service degradation 流量控制和服务降级: Alibaba Sentinel 替代 Hystrix组件
2、Service registration and discovery 服务注册和发现:Alibaba Nacos 替代 consul和eureka
3、Distributed Configuration 分布式配置统一配置中心:Alibaba Nacos替换 config 自动刷新配置
4、Event-driven 事件驱动,利用RocketMQ:事件驱动 替换 Bus组件实现消息总线
5、Message Bus 消息总线 异步处理
6、Distributed Transaction 分布式事务: Seata
7、Dubbo RPC 集成Apache Dubbo RPC实现服务间的通讯:Dubbo替代 openFeign

微服务项目实战开发常用组件

springcloud NetFlix、springcloud spring、springcloud alibaba 依赖

1、服务注册中心:Alibaba Nacos
2、服务间通讯负载均衡:RestTemplate+Ribbon / Openfeign
3、服务流控和服务降级:Sentinel
4、服务网关:Gateway
5、统一配置中心:Nacos

springcloud alibaba 环境搭建

1、创建全局父项目
维护spring cloud依赖、 Hoxton.SR6
维护Alibaba依赖、 2.2.1.RELEASE
继承spring boot父项目 2.2.5.RELEASE

父项目的pom依赖维护

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>

<!-- 自定义properties属性 -->
<properties>
    <spring.cloud-version>Hoxton.SR6</spring.cloud-version>
    <spring-cloud-alibaba-version>2.2.1.RELEASE</spring-cloud-alibaba-version>
</properties>

<!-- 维护版本 -->
<dependencyManagement>

    <dependencies>
        <!-- 维护spring cloud 版本依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!--spring-cloud-alibaba-dependencies-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

    </dependencies>

</dependencyManagement>

Nacos组件

Nacos = na (name service) + co (configuration service )

作用:name service (服务注册中心)、(configuration service) 统一配置中心

使用Nacos组件

官网:https://nacos.io/zh-cn/index.html
下载地址:https://github.com/alibaba/nacos/releases

1.4.1版本下载连接:
https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
上传nacos到linux系统,nacos运行需要依赖jdk,所以需要先安装jdk
安装jkd8
a、去下载.pm 文件 jdk到linux,运行

rpm -ivh jdk-8u171-linux-x64.pm

b、配置环境变量

vim /etc/profile

最下边加入
JAVA_HOME=/usr/local/java/jdk1.8.0_161
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

或者
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export PATH=$PATH:$JAVA_HOME/bin

c、重新加载配置生效

source /etc/profile

d、解压nacos安装包

tar -zxvf nacos-server-1.4.1.tar.gz

nacos目录结构

drwxr-xr-x 2 root root     82 222 14:27 bin    //启动关闭nacos脚本目录
drwxr-xr-x 2  502 games   205 115 2021 conf  //配置nacos配置文件目录
drwxr-xr-x 2 root root     30 222 14:27 target //nacos server核心jar包

e、启动nacos服务 默认是集群模式启动
单机启动:在bin目录中—> ./startup.sh -m standalone (standalone 代表单机启动)

进入 查看nacos启动日志

cd /nacos/logs
tail -f nacos.log

f、访问nacos的web地址

地址:http://192.168.1.29:8848/nacos 默认账号 nacos / nacos

nacos安装完毕!!!!

nacos client 微服务

微服务连接nacos
1、父项目下创建一个独立的spring boot项目,并引入依赖

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、编写配置文件

server.port=8989
spring.application.name=NACOSCLIENT

#nacos server 总地址,下边两个可以省略,只写这一个就可以
spring.cloud.nacos.server-addr=192.168.1.29:8848


#注册nacos server地址 默认不写就是spring.cloud.nacos.server-addr
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}

#指定向nacos server 注册服务名称。默认不写这个配置就是 spring.application.name
spring.cloud.nacos.discovery.service=${spring.application.name}

3、入口类加入注解,该注解可加可不加,默认引入依赖就可打开服务注册

@SpringBootApplication
@EnableDiscoveryClient //开启服务注册,该注解可以省略不写
public class NacosClientApplication { ..... }

服务间通讯

restTemplate、restTemplate+ribbon、openFeign
在这里只介绍一下openFeign组件,上一章其实也讲过。就是接口+注解
1、引入open Feign依赖

<!-- 引入openfeign依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、入口类加入注解

@EnableFeignClients

3、创建一个接口,加入注解

@FeignClient("PRODUCTS")  PRODUCTS是服务id

public interface ProductClient {

    @GetMapping("product")
    String product(@RequestParam("id") Integer id);

}

4、引入ProductClient ,并调用就行

@RestController
public class FeignController {
    @Autowired
    private ProductClient productClient;

    @GetMapping("openFeign")
    public String demo(){
        String product = productClient.product(1);
        return "调用用户服务成功,返回:" + product;
    }
}

nacos统一配置中心使用、config client开发、自动配置刷新

nacos 统一配置中心:他管理配置文件的方式实在自己所在的服务器上形成一个版本库,因为不需要再创建远程仓库。但是同样也是存在版本控制

开发微服务 将配置交给nacos进行管理

1、创建一个独立的spring boot,引入nacos config client依赖

<!--nacos config client-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、将自身配置交给远端的nacos管理,在nacos配置管理,配置列表新增一个
在这里插入图片描述在这里插入图片描述

3、项目引入nacos config client依赖

<!--nacos config client-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

4、修改配置文件,只需要一个bootstrap.properties的即可,告诉去哪里拉取配置文件。

#nacos config地址
#第一种获取配置文件方式
spring.cloud.nacos.config.server-addr=192.168.1.29:8848
#从哪个组进行配置获取
spring.cloud.nacos.config.group=DEFAULT_GROUP
#拉取哪个配置文件
spring.cloud.nacos.config.name=configclient-dev
#拉取这个配置的哪个后缀的配置文件
spring.cloud.nacos.config.file-extension=properties

#第二种获取配置文件的方式
spring.cloud.nacos.config.prefix=configclient
#到时候动态打包,这种方式可以动态获取
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=properties

5、实现配置文件修改自动刷新,在启动类加入注解

@RefreshScope //允许远端配置修改自动刷新
public class ConfigClientController {....}

发现无需操作,只要修改了nacos配置列表的文件配置,即可自动刷新同步到微服务。

nacos统一配置中心概念
命名空间:namespace :站在项目中角度隔离每一个项目配置文件,通常一个项目用一个命名空间.
组:group站在项目中每个服务角度,隔离同一个项目中不同服务的配置,通常一个服务下边所有的配置文件放入一个组
文件名:dataId 就是文件名称

Nacos 持久化配置

持久化:管理的配置信息持久化
注意:默认nacos存在配置信息持久化,默认的持久化方式为内嵌数据库debery
缺点:无法友好的展示数据
官方建议:在生产情况下,将配置信息存入MySQL数据库,目前只支持mysql

将nacos持久化到mysql中
1、首先需要安装mysql数据库,并创建一个数据库,作为nacos持久化的库
2、在nacos库中执行 表初始化数据文件nacos-mysql.sql。位置在nacos的安装目录的conf里边.
3、修改nacos配置文件持久化信息到mysql中。
进入nacos/conf 目录,修改application.properties
在这里插入图片描述4、重启nacos 🆗了
./shutdown.sh 停止
./startup.sh -m standalone 启动

nacos集群搭建

1、复制三份nacos,命名为1,2,3。注意如果之前使用用的话要把里边的data文件数据清除掉

在这里插入图片描述
2、进入nacos文件,修改nacos配置文件端口号。mysql也要配置,如上

vi /nacos1/conf/application.properties    修改  server.port=8847
vi /nacos2conf/application.properties    修改   server.port=8846
vi /nacos3/conf/application.properties   修改   server.port=8845

3、将nacos/conf/cluster.conf.example 命名为cluster.conf,并修改添加上所有的集群节点
在这里插入图片描述
4、启动三台nacos服务。

./nacos1/bin/startup.sh
./nacos2/bin/startup.sh
./nacos3/bin/startup.sh

访问http://192.168.1.29:8847/nacos、http://192.168.1.29:8846/nacos、http://192.168.1.29:8845/nacos
给一台服务注册到8845,发现另外两台也会显示,会相互注册

nginx实现nacos的高可用

1、安装nginx
2、修改nginx配置文件
在这里插入图片描述

加载配置启动,进入nginx的sbin目录执行

./nginx -c /usr/wbing/nginx/conf/nginx.conf

3、访问 http://192.168.1.29/nacos/ 就会转发到三个节点中的一个节点,也会出现nacos的web界面。
4、修改服务的配置文件,访问注册中心的地址,为了实现高可用,换上nginx负载均衡地址

#安装nginx实现nacos高可用,负载均衡路径,填写nginx路径
#spring.cloud.nacos.server-addr=192.168.1.29:80

sentinel组件 哨兵

官网文档:https://sentinelguard.io/zh-cn/docs/introduction.html

作用:阿里巴巴开源用来对现有微服务系统进行保护 ====》替换 Hystrix
Hystrix :主要是用来解决服务的熔断,服务雪崩
sentinel:解决服务熔断、服务降级、服务流控等

sentinel开源组件
sentinel:实现流量控制,熔断,降级 —》 Hystrix
sentinel dashBoard:哨兵仪表板,配置资源和规则对应关系,更强大 --》Hystrix dashboard

sentinel实现原理

sentinel使用:

使用sentinel必须要先有sentinel dashboard

sentinel dashboard使用:

1、下载dashboard
地址:https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar

2、运行dashboard,是个springboot,可以直接使用jar包的方式运行,
java -jar sentinel-dashboard-1.8.6.jar
端口默认8080,访问http://192.168.1.29:8080/ 就会有web页面。账号:sentinel / sentinel

也可以指定端口运行
java -jar -Dserver.port=9191 sentinel-dashboard-1.7.2.jar

使用sentinel组件保护微服务

1、创建一个spring boot微服务,引入依赖

<!--引入sentinel组件-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、修改配置文件 配置连接到sentinel dashboard

#开启sentinel保护
spring.cloud.sentinel.enabled=true
#指定sentinel dashboard web地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:9191
#指定sentinel组件与dashboard组件的通信地址
spring.cloud.sentinel.transport.port=8719

3、启动微服务,查看dashboard
dashboard信息必须在指定服务进行资源调用之后,才会初始化展示在页面上
在这里插入图片描述

关于系统吞吐量的相关概念

1、QPS:Query-Per-Second:称之为系统每秒的请求数
2、RT:Response Time:每个请求的响应时间 单位毫秒

sentinel对系统保护的规则

流控规则:流量控制,其原理是监控应用流量的 QPS 或并发线程教 等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保证应用的高可用性

降级规则:监控应用中资源请求调用,达到 指定的阈值自动触发熔断降级

热点规则:何为热点?热点即经常访问的数据。
其原理很多时候我们希望统计某个热点数据中访问频次最高的 Top k 数据,并对其访问进行限制。比如微博热搜,头条等

系统规则:其原理sentinel 系统自适应限流从整体维度对应用入口流量进行控制

授权规则:很多时候,我们需要根据调用来源来判断该次求是否允许放行,这时候可以使用 sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的诸求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过。配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。比如疫情解封之后的各地的消费券。只有位于上海才能领取上海的消费券。

流控规则使用

监控应用流量的 QPS 或 并发线程数 指标,当达到指定的阈值的时对流量进行控制,以避免被瞬时的流量高峰击垮,从而保障应用的高可用性。

1、编写一个接口,/demo 。进入sentinel的web界面,点击流控规则,新增
在这里插入图片描述

QPS:每秒的请求数,每秒请求数量超过设置的阈值之后就会对该接口进行限流。不让访问,避免被瞬时的流量高峰冲垮。

并发线程数:当服务器中创建线程数超过指定的阈值的之后,对当前请求进行限流。

并发线程,比如同一时间进来10个请求,并不一定会创建10个线程,因为宏观是并行,微观来讲是串行的,线程去处理一个请求的速度是非常快的,如果第一个线程已经把第一个请求处理完了,就可以继续去处理第四/五个请求,

单机阈值2,每秒超过2次请求该接口会返回,Blocked by Sentinel (flow limiting)被哨兵阻塞(流量限制)
在这里插入图片描述

保护规则

流控模式

1、直接:api达到限流条件时,直接限流
2、关联:当关联的资源达到阈值时,就限流自己。反向控制
3、链路:只记录指定链路上的流量(指资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】

流控效果:
1、快速失败:直接失败,抛异常
2、Warm Up:经过预热时长,达到设置的QPS阈值。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮
3、排队等待:会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法

下图,虽然设置的单机阈值为10,设置了预热时长20,是指请求分批慢慢放行,由 3个/s --> 4个/s -->6个/s 慢慢经过20秒之后,达到10个/s
在这里插入图片描述
如下图,当访问量剧增时,每次只执行10个请求,剩下的排队等候,当5秒内能够 等待到请求到该接口就行,5秒之后还没有请求到,就报错

在这里插入图片描述

如下图:当请求/test的请求超过阈值 1个/s时,会对/demo的请求做流控、报错
在这里插入图片描述

熔断降级

熔断:为了避免微服务架构中的雪崩现象,调用链路不可用
原理:当监控到调用链路中某一个服务,出现异常(20个以上异常)自动触发熔断,在触发之后对于该服务不可用
熔断:达到某个条件之后自动触发

sentinel 熔断规则

慢调用比例:RT,根据请求的响应时间熔断,当执行某个业务时间过长的时候触发
异常比例:根据请求调用过程中出现异常调用的百分比
异常数:根据请求过程中出现的异常数量进行熔断

慢调用比例

最大RT:Response Time 响应时间,超过时间则为慢调用

比例阈值:当服务请求数超过最小请求数,那么在统计时长里,如果策略为慢调用比例,那么慢调用占全部请求数的比例超过或等于比例阈值(慢调用/全部请求数),那么就会触发熔断,阈值范围为[0.0,1.0]代表 0% - 100%,如果为0.5则是慢调用占全部请求数的比例为50%或以上则触发熔断。

熔断时长:顾名思义,就是触发熔断后,熔断持续的时长。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断。
统计时长:即在设定的时间内进行统计。

如下图:在统计时长内,请求数大于5个,如若大于指定比例阈值的请求数的响应时间都大于最大RT,那么就会熔断该服务,熔断时间为设置的熔断时长。在这里插入图片描述

异常比例

如下图:在统计时间内,如果请求数量大于5个,并且异常百分比>0.1时,就会进入断路状态,经过熔断时长之后,断路器关闭
在这里插入图片描述

异常数

如下图:在统计时间内,如果请求数量大于5个,当请求的异常数量超过设置的异常数,就会进入熔断。经过熔断时长就会关闭
在这里插入图片描述

热点参数限流

经常访问的数据称之为热点

热点限流也称之为热点参数限流,日后访问资源中携带了指定参数进行限流

如何使用?
使用热点限流时,不能使用资源路径,必须使用资源别名。
sentinel中提供资源别名的注解。@sentinelResource(value=" ")

需要在加热点限流的接口上加入注解

@GetMapping("demo")
@SentinelResource(value = "demoSentinelResource", blockHandler = "blockHandlerDemo", fallback = "fallbackDemo")
//代表这是一个sentinel资源,资源别名
/*
 * blockHandler:是指被限流之后的处理
 * fallback:处理业务过程中出现的异常的处理
 */
public String demo(Integer id) {
    if (id < 0) {
        throw new RuntimeException("hjsadh");
    }
    return "demo ok!!!";
}

//demo被 限流之后的处理的方法
public String blockHandlerDemo(Integer id, BlockException e) {
    if (e instanceof FlowException) {
        return "你已经被流控";
    }
    if (e instanceof DegradeException) {
        return "你已经被流控";
    }
    if (e instanceof ParamFlowException) {
        return "你已经被热点参数限流";
    }
    return "demo请求过于火爆,您已被限流";
}

//执行demo时的内务异常
public String fallbackDemo(Integer id) {
    return "服务异常!";
}

在这里插入图片描述
参数索引 0 代表0号参数

访问http://localhost:9991/demo?id=111,发现参数值111被限定流量,超过1/s的时候,就会被限流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值