Spring Cloud Alibaba

400 阅读4分钟

简介

Spring Cloud Alibaba 是阿里巴巴提供的一套微服务开发一站式解决方案

主要提供功能:

  • 服务限流降级
  • 服务注册与发现
  • 分布式配置中心
  • 消息驱动
  • 分布式事务

  • 阿里云对象存储
  • 阿里云短信

提供使用的组件

  • Sentinel
  • Nacos

优势:

​ 1.中文文档

​ 2.集成方便

​ 3.阿里本身经验丰富,值得信赖

Nacos

Nacos 主要提供了服务发现、服务配置以及服务管理

基本特性:

  • 服务发现
  • 动态配置
  • 动态 DNS 服务
  • 服务及元数据管理

安装

  • Docker安装
  • 下载源码,自己编译安装(极不建议)/下载编译好的安装包

首先下载好安装包 :

github.com/alibaba/nac…

下载完成后解压

windows,直接在 bin 目录下双击 startup.cmd 启动即可

Linux,bin 目录下执行 sh startup.sh -m standalone (standalone表示单机启动)

注意:提交安装好JDK,测试下java和javac命令要存在

Nacos启动成功后,浏览器输入:http://ip:8848/nacos 就能看到启动页面(注意携带http)

如果需要登录,用户名和密码默认为 nacos

配置中心

类似Spring Cloud Config ,首先在服务端配置,点击配置管理 -> 配置列表 -> +

这里需要配置三个东西,分别是 Data ID、Group、以及要配置的内容

Data ID 的格式是 ${prefix}-${spring.profile.active}.${file.extension}

${prefix} 的值,默认为 spring.application.name 的值

${spring.profile.active} 表示项目当前所处的环境

${file.extension} 表示配置文件的扩展名

例如下图配置

1630413781417.png

上面配置中 ${spring.profile.active} 省略没写

配置完成后点击发布后就能在配置列表页面看见配置了

新建maven项目,删除src目录,在项目下新建module,springboot项目,添加 Nacos 依赖 (本案例parent采取了springboot2.2.4)

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    	<!-- 配置依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
</dependencies>

新建 bootstrap.properties (bootstrap.properties表示要引入外部的配置文件)

spring.application.name=nacos
spring.cloud.nacos.server-addr=192.168.189.101:8848
spring.cloud.nacos.file-extension=properties

注意:这里spring.application.namespring.cloud.nacos.file-extension的配置要与之前页面中的配置完全一致

然后我们就可以新建 Controller 进行测试了

@RestController
@RefreshScope // 动态刷新
public class TestController {
    @Value("${name}")
    String name;
    @GetMapping("/hello")
    public String hello() {
        return "hello:"+name;
    }
}

启动项目,访问 http://localhost:8080/hello 接口查看结果,而且这时编辑配置列表中的name值,重新发布后,再次访问接口,也会一样刷新

注册中心

可以替代 Eureka,确保 Nacos 是启动状态

新建 SpringBoot项目

引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
</dependencies>

application.properties文件添加配置

spring.application.name=nacos1
spring.cloud.nacos.discovery.server-addr=192.168.189.101:8848

新建Controller

@RestController
public class TestController {
    @Value("${server.port}")
    Integer port;

    @GetMapping("/hello")
    public String hello() {
        return "hello:" + port;
    }
}

这里获取下端口号,验证集群是否有效

利用 maven 完成打包项目,分别以不同的端口运行两个项目

java -jar nacos1-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar nacos1-0.0.1-SNAPSHOT.jar --server.port=8082

再创建一个 springboot 项目 consumer

application配置

spring.application.name=consumer
server.port=8083
spring.cloud.nacos.discovery.server-addr=192.168.189.101:8848

启动类启动 负载均衡

@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }  
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

新建接口测试

@RestController
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/consumer")
    public String consumer() {
        return restTemplate.getForObject("http://nacos1/hello", String.class);
    }
}

数次访问 http://localhost:8083/consumer 查看结果

Sentinel

分布式系统的流量防卫兵

  • 使用场景丰富
  • 有完备的实时监控
  • 广泛的开原生态

两个核心:

  • 核心库, 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
  • 控制台, 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

安装

下载地址:github.com/alibaba/Sen…

下载下来后是一个jar包,直接运行即可

# 如果不指定
java -jar xxxxxxxxx.jar --server.port=8084

启动成功后浏览器访问 localhost:8084 进入登录页面,用户名和密码默认都是 sentinel

使用

  • 新建 springboot 项目,添加 sentinelweb依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
</dependencies>

配置文件

spring.application.name=sentinel
# 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
server.port=8081

新建接口

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello sentinel";
    }
}

启动项目访问后,刷新查看控制台 localhost:8081

可以看到 实时监控 中有请求过来的时间等信息

  • 点击控制台 簇点链路 ,这里可以进行流控、降级等操作

1630481211134.png

点击流控可以设置流控规则

1630481700898.png

上图表示,每秒最多处理 5 个请求,超出范围则排队等待最多 1 秒

然后可以写一个单元测试,测试一下

@Test
void contextLoads() {
    for (int i = 0; i < 20; i++) {
        RestTemplate restTemplate = new RestTemplate();
        String str = restTemplate.getForObject("http://localhost:8081/hello", String.class);
        System.out.println(str + " : " + new Date());
    }
}

查看控制台

1630481700898.png

Nacos 和 Sentinel 的整合

流控这种操作也可以结合 Nacos 来做

新建项目,引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

application配置

# 应用名
spring.application.name=sentinel
# 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 端口
server.port=8081

# 注册中心地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr=192.168.189.101:8848
# nacos 里 Data Id 的值
spring.cloud.sentinel.datasource.ds.nacos.data-id=sentinel-rule
# group
spring.cloud.sentinel.datasource.ds.nacos.group-id=DEFAULT_GROUP
# 限流规则(下面代码的意思是直连)
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow

bootstrap配置

spring.cloud.nacos.config.server-addr=192.168.189.101:8848

nacos管理页面 http://ip:8848/nacos 添加配置

1630489439919.png

[
    {
        "resource":"/hello",		// 限流接口
        "limitApp":"default",		// 流控针对的调用源,default表示不区分类型(小程序,app)
        "grade":1,					// 阈值类型,1表示根据QPS,0表示并发线程数
        "count":5,					// 单机流量数
        "clusterMode":false,		// 是否是集群模式
        "strategy":0,				// 流控模式,0表示直接
        "controlBehavior":0			// 流控效果,0表示等待
    }
]

发布

启动项目