Spring Cloud Alibaba

Spring Cloud Alibaba

公共依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>www.xdx97.cloud</groupId>
    <artifactId>xdxCloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Nacos 服务注册和配置文件 替代Eureka 和 Config

nacos下载

引入依赖

<dependencies>
    <!--SpringCloud ailibaba nacos -->
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	</dependency>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

修改yaml

server:
  port: 5001

spring:
  application:
    name: userserver5001
  cloud:
    nacos:
      discovery:
        #server-addr: localhost:8848 #配置Nacos地址
        server-addr: 127.0.0.1:8848

启动类

@RestController
@EnableDiscoveryClient
public class UserController {

    @GetMapping("/user")
    public String fun(){
        return "我是用户服务";
    }
}

gateway(网关)

1. 参照一建一个模块

2. 添加yaml

server:
  port: 6001

spring:
  application:
    name: getway_6001
  cloud:
    nacos:
      discovery:
        #server-addr: localhost:8848 #配置Nacos地址
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true       #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: user_server #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:5001          #匹配后提供服务的路由地址
          uri: lb://userServer                  #配置nacos里面的服务名
          predicates:
            - Path=/user/**         # 断言,路径相匹配的进行路由

3. pom

<dependencies>
    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

4.启动类

@SpringBootApplication
@EnableDiscoveryClient
public class Getway6001 {
    public static void main(String[] args) {
        SpringApplication.run(Getway6001.class, args);
    }
}

配置中心(nacos)

依赖

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

新添bootstrap.yaml文件 该文件在application前加载

server:
  port: 5001

spring:
  application:
    name: userServer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置

application.yaml

spring:
  profiles:
    active: dev

注意在nacos中文件的配置名 必须是 微服务名加application.yaml 文件中的生产模式 和 bootstrap.yaml 文件中的文件后缀名

配置刷新类

@RefreshScope //注意添加注解自动刷新
@RestController
public class ConfigController {

    @RequestMapping("/refreshConfig")
    public String refreshConfig(){
        return "配置刷新成功";
    }

    public static String wxApp;

    @Value("${wx.app}")
    public void setWxApp(String wxApp) {
        this.wxApp = wxApp;
    }
}

测试

@RestController
public class UserController {

    @GetMapping("/user")
    public String fun(){
        return "我是用户服务" + ConfigController.wxApp;
    }
}

Sentinal (控流量、熔断 降级)

简洁

下载地址

访问 http://127.0.0.1:8080 , 用户名/密码 sentinel / sentinel

依赖

<!--SpringCloud ailibaba sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

修改配置文件

server:
  port: 5001

spring:
  application:
    name: userServer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719

流控规则

QPS直接失败

在外界直接拦下请求 当达到限制的请求数时 直接返回错误页面

线程数直接失败

可以进入服务器 但是只给一个线程池来处理请求 如果处理不了则返回错误页面

关联

两个请求关联 被关联的请求被高并发访问 则当前请求收到影响 / 也就是保护他人害死自己

预热

给定一个峰值 给定一个时间 在给定的时间里慢慢的达到峰值 而不是一下达到 可以很好的处理突然性的高并发 保护服务器

排队等待

不管来多少个请求 都接受 但是 给定一个时间来处理请求 一个一个处理

降级规则

RT

是指 在1s内大于5次的请求 和 超过给定处理请求的时间时 会导致熔断

异常比例

是指 在1s内大于等于5次请求 和 异常数达到给定的比例数时 会导致熔断

异常数

是指在指定的时间里 达到指定的异常数会导致熔断

热点 规则/ @SentinalResource

@SentinalResource(value="随意取值(唯一值) 一般和请求地址一致",blockHandler="兜底(降级处理)的方法名",fallback="")
//注意 这里的blockHandler 只是处理Sentinal的错误 并不处理java RunTimeException 异常 要处理请使用 fallback

给指定的方法 的指定参数(可携带多参数并没哟影响) 指定限流规则 只要指定的参数超过了指定的热点限流规则 马上就会降级处理

参数例外项(高级设置)

可以给他设定特殊的值(情况) 让他的限流被放开

系统规则


配置全局

@SentinalResourcce 注解详解


  1. 业务层 代码乱
  2. 多个兜底方法 代码冗余
  3. 公用方法没有实现

解决:

1 创建一个处理兜底方法的类

2 在控制层方法上添加

@SentinalResource(value="唯一值",
blockHandlerClass="处理的兜底类.class",
blockHandler="处理的指定方法名")

服务熔断功能 - OpenFeign / Rabbin


@FeignClient(value="微服务名",fallback="处理类")

规则持久化 - Nacos


Seata 处理分布式事务 (@GlobalTransaction)  TC  TM  RM


TC 事务的协调者 Seata 服务器

TM 事务的控制者 标有@GlobalTransaction注解的控制层 事务的发起方

RM 资源  一个数据库就是一个RM

@Transaction 本地事务
@GlobalTransaction 全局事务
posted @ 2021-08-11 10:07  zhiy  阅读(53)  评论(0)    收藏  举报