SpringCloud Alibaba(中)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: SpringCloud Alibaba

三种方案加载配置:


1. DataID方案


指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置


默认空间+默认分组+新建dev和test两个DataID

1673276255853.jpg

从而实现配置dev就加载dev,配置test就加载test


2. Group方案


新建两个配置文件,DataID为: nacos-config-client-info.yaml

1673276285889.jpg

1673276295368.jpg

1673276303426.jpg

通过切换 config.group 为DEV_GROUP或TEST_GROUP,即可实现配置的切换。


3. Namespace方案

1673276315370.jpg

1673276329517.jpg

1673276344733.jpg

test命名空间一样,添加两个文件。


bootstrap.yml

# nacos配置
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP
        namespace: eaf79b3e-daa1-4a19-b5f1-7c4839e9b4a9
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml


加入了一行,namespace: 命名空间Id,测试,修改不同的命名空间Id,就可获取到不同的文件内容。


就好比有一个大型项目,需要部署在上海和杭州,命名空间就叫 HZ(杭州),SH(上海),项目下又有多个微服务,通过Group来命名属于项目中的哪个微服务,每个服务又有开发环境、测试环境、生产环境,最后再通过 application.yml中的spring.profiles.active区分更具体的环境。


获取配置文件的顺序:命名空间(默认public)》Group》Data Id


5. Nacos集群和持久化配置


https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

1673276383785.jpg

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。


总不可能集群的每个节点我们都一个个去改吧?


为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

1673276396324.jpg

1673276422529.jpg

Nacos默认自带的是嵌入式数据库derby 查看


1. derby到mysql切换配置步骤

nacos-server-1.1.4\nacos\conf目录下找到sql脚本

nacos-mysql.sql,数据库执行,注意里边是否有创建数据库,没有的话先执行Create DataBase

CREATE DATABASE nacos_config;
USE nacos_config;


nacos-server-1.1.4\nacos\conf目录下找到application.properties

最下边加入

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456


ok,重启Nacos,可以看到之前加入的命名空间、服务,都没有了,看到的是个全新的空记录界面,以前是记录进derby。


6. Linux版Nacos+MySQL生产环境配置


1673276481810.jpg

需要:1个Nginx+3个nacos注册中心+1个mysql


下载nacos:https://github.com/alibaba/nacos/releases


上传至 opt/,解压移动到mynacos下

cp -r nacos /mynacos/


1.Linux服务器上mysql数据库配置


根据 nacos/conf/nacos-mysql.sql文件,导表

mynacos/nacos/conf:cp application.properties.example application.properties
      vim application.properties


application.properties文件最后加入:

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456


2.Linux服务器上nacos的集群配置cluster.conf


复制出:cluster.conf

cluster.conf.example cluster.conf


内容:

1673276538930.jpg

这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP


3.编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口


/mynacos/nacos/bin 目录下有startup.sh

1673276646066.jpg最下边是: -Dserver.port=${PORT}

1673276657844.jpg

依次启动3333,4444,5555


4. Nginx的配置,由它作为负载均衡器


修改 nginx/conf/nginx.conf

upstream cluster{
        server 127.0.0.1:3333;
        server 127.0.0.1:4444;
        server 127.0.0.1:5555;
    }
    server {
        listen       1111;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://cluster;
        }
./nginx -c /usr/local/nginx/conf/nginx.conf


访问:http://192.168.111.144:1111/nacos/#/login,新建一个配置,然后查看config_info表,里边有数据就ok.


7. SpringCloud Alibaba Sentinel实现熔断与限流


官网:https://github.com/alibaba/Sentinel


下载:https://github.com/alibaba/Sentinel/releases

1673276697448.jpg

官方使用手册:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel


解决服务使用中的各种问题:服务雪崩、服务降级、服务熔断、服务限流 …

1673276713850.jpg


1. 安装Sentinel控制台


下载:

1673276739614.jpg

运行:


环境:java8环境,8080端口不能被占用


java -jar sentinel-dashboard-1.7.0.jar


1673276750965.jpg

访问:http://localhost:8080,登录账号密码均为 sentinel

1673276767166.jpg

2. 初始化演示工程

新建Module, cloudalibaba-sentinel-service8401


pom

<dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件+actuator -->
        <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>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </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>


yml

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置Sentinel dashboard地址
        dashboard: localhost:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719
management:
  endpoints:
    web:
      exposure:
        include: '*'


主启动

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


业务类

@RestController
public class FlowLimitController
{
    @GetMapping("/testA")
    public String testA()
    {
        return "------testA";
    }
    @GetMapping("/testB")
    public String testB()
    {
        return "------testB";
    }
}


启动,查看Sentinel控制台,什么也没有,Sentinel采用的懒加载,需要先执行一次访问即可

http://localhost:8401/testA

1673276906577.jpg

可以看到sentinel8080正在监控微服务8401


3. 流控规则

1673276919389.jpg


4. 流控模式


直接(默认)

1.QBS(每秒的请求数量)

1673276935191.jpg

表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误

访问:http://localhost:8401//testB

1673276944433.jpg

线程数

1673276961847.jpg

请求:http://localhost:8401/testB,一直刷,都没问题,这是因为方法执行时间太快,毫秒级别就响应了。


修改testB方法,记得IDEA启用热部署,否则重启后,限流规则会重置(目前还没有做持久化配置)

@GetMapping("/testB")
    public String testB()
    {
        try {
            TimeUnit.MILLISECONDS.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "------testB";
    }


访问:http://localhost:8401/testB,快速请求两次(F5两次),当线程数达到阈值时,直接限流。

1673276998914.jpg


2. 关联

当关联资源/testA的qps阀值超过1时,就限流/testB的Rest访问地址,当关联资源到阈值后限制配置好的资源名

1673277017133.jpg

postman模拟并发密集访问 关联资源 testA

1673275204335.jpg

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
217 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
170 0
|
2月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
108 0
|
7天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
18 0
|
7天前
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
|
7天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
14天前
|
Java API 对象存储
对象存储OSS产品常见问题之使用Spring Cloud Alibaba情况下文档添加水印如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
26 2
|
23天前
|
SpringCloudAlibaba 监控 Java
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
|
23天前
|
SpringCloudAlibaba Java API
SpringCloud Alibaba微服务工程搭建(保姆级)
SpringCloud Alibaba微服务工程搭建(保姆级)
|
23天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)