九十五、Cloud Alibaba简介
0、why会出现SpringCloud alibaba
Spring Cloud Netflix项目进入维护模式
1、是什么
官网:spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibaba · GitHub
2、能干嘛
3、去哪下
spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibaba · GitHub
4、怎么玩
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
5、官网
Spring Cloud Alibaba
九十六、Nacos简介和下载
0、SpringCloud Alibaba Nacos服务注册和配置中心
1、为什么叫Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
2、是什么
①、一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
②、Nacos:Dynamic Naming and Configuration Service
③、Nacos就是注册中心+配置中心的组合 等价于 Nacos = Eureka+Config+Bus
3、能干啥
①、替代Eureka做服务注册中心
②、替代Config做服务配置中心
4、去哪下
①、GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
②、官网文档 home
5、各种注册中心比较
九十七、Nacos安装
1、运行
①、解压安装包,直接运行bin目录下的startup.cmd
②、命令运行成功后直接访问http://localhost:8848/nacos(默认账号密码都是nacos)
九十八、Nacos之服务提供者注册
1、spring的官网文档
Spring Cloud Alibaba Reference Documentation
2、Nacos作为服务注册中心演示
①、父POM
<!--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>
②、本模块POM
<?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">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.nanjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
</project>
③、YML
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
④、主启动类
package com.nanjing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* PaymentMain9001启动类
*
* @author xizheng
* @date 2023-03-27 18:18:19
*/
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
⑤、业务类
package com.nanjing.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* 付款控制器
*
* @author xizheng
* @date 2023-03-27 18:19:21
*/
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
⑥、测试
http://lcoalhost:9001/payment/nacos/1
nacos服务注册中心+服务提供者9001都ok了
⑦、为了下一章节演示nacos的负载均衡,参照9001新建9002
九十九、Nacos之服务消费者注册和负载
0、基于Nacos的服务消费者(Nacos自带支持负载均衡的,因为整合了ribbon)
①、POM
<?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">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.nanjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-nacos-order83</artifactId>
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.nanjing.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
</project>
②、YML
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
③、主启动类
package com.nanjing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* OrderNacosMain83启动类
*
* @author xizheng
* @date 2023-03-27 18:36:27
*/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
④、配置类
package com.nanjing.springcloud.alibaba.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* ApplicationContextConfig
*
* @author xizheng
* @date 2023-03-27 18:42:01
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
⑤、业务类
package com.nanjing.springcloud.alibaba.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* OrderNacosController控制器
*
* @author xizheng
* @date 2023-03-27 18:42:56
*/
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
一百、Nacos服务注册中心对比提升
1、Nacos与其他注册中心特性对比
2、Nacos支持AP(高可用)和CP(一致性)模式的切换
一百零一、Nacos之服务配置中心
0、Nacos作为服务配置中心演示
1、POM
<?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">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.nanjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.nanjing.springcloud.alibaba</groupId>
<artifactId>cloudalibaba-config-nacos-client3377</artifactId>
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--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>
<!--一般基础配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>
</project>
2、why配置两个
①、bootstrap
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
# ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
②、application
spring:
profiles:
active: dev
3、主启动类
package com.nanjing.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* NacosConfigClientMain3377启动类
*
* @author xizheng
* @date 2023-03-27 18:58:17
*/
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
4、业务类
package com.nanjing.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 配置客户端控制器
*
* @author xizheng
* @date 2023-03-27 18:59:11
*/
@RestController
@RefreshScope//实现动态刷新
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
5、在Nacos中添加配置信息
①、
②、官网 Nacos Spring Cloud 快速开始
③、
6、测试
http://localhost:3377/config/info
7、自带动态刷新
修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新
一百零二、Nacos之命名空间分组和DataID三者关系
1、多环境多项目管理
2、Namespace+Group+Data ID三者关系?为什么这么设计?
①、
②、
一百零三、Nacos之DataID配置
一百零四、Nacos之Group分组方案
一百零五、Nacos之Namespace空间方案
一百零六、Nacos集群_架构说明
一百零七、Nacos持久化切换配置
一百零八、Nacos之Linux版本安装
一百零九、Nacos集群配置(上)
一百一十、Nacos集群配置(下)
一百一十一、Sentinel是什么
1、官网 GitHub - alibaba/Sentinel: A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)
2、是什么
轻量级的流量控制、熔断降级Java库
3、去哪下
Releases · alibaba/Sentinel · GitHub
4、能干嘛
5、服务使用中的各种问题
①、服务雪崩
②、服务降级
③、服务熔断
④、服务限流
一百一十二、Sentinel下载安装运行
0、
1、sentinel组件由2部分组成(后台、前台8080)
2、下载
①、Releases · alibaba/Sentinel · GitHub
②、下载到本地sentinel-dashboard-1.7.0.jar
3、运行命令
①、前提:java8环境OK、8080端口不能被占用
②、命令: java -jar sentinel-dashboard-1.7.0.jar
4、访问sentinel管理界面
①、http://localhost:8080
②、登录账号密码均为sentinel
一百一十三、Sentinel初始化监控
0、初始化演示工程
一百一十四、Sentinel流控规则简介
1、基本介绍
①、新增流控规则
②、进一步解释
③、
2、直接->快速失败(系统默认)
3、流控模式
①、直接
②、关联、链路
4、流控效果
一百一十五、Sentinel流控-QPS直接失败
一百一十六、Sentinel流控-线程数直接失败
一百一十七、Sentinel流控-关联
一百一十八、Sentinel流控-预热
一百一十九、Sentinel流控-排队等待
一百二十、Sentinel降级简介
1、降级规则
①、
②、
2、进一步介绍
3、Sentinel的断路器是没有半开状态的
(半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix)
一百二十一、Sentinel降级-RT
1、是什么
2、
3、结论
4、
一百二十二、Sentinel降级-异常比例
1、
2、
3、结论
一百二十三、Sentinel降级-异常数
1、
2、
3、结论
一百二十四、Sentinel热点key(上)
一百二十五、Sentinel热点key(下)
一百二十六、Sentinel系统规则
一百二十七、SentinelResource配置(上)
一百二十八、SentinelResource配置(中)
一百二十九、SentinelResource配置(下)
一百三十、Sentinel服务熔断Ribbon环境预说
一百三十一、Sentinel服务熔断无配置
一百三十二、Sentinel服务熔断只配置fallback
一百三十三、Sentinel服务熔断只配置blockHandler
一百三十四、Sentinel服务熔断fallback和blockHandler都配置
一百三十五、Sentinel服务熔断exceptionsToIgnore
一百三十六、Sentinel服务熔断OpenFeign
一百三十七、Sentinel持久化规则
一百三十八、分布式事务问题由来
一百三十九、Seata术语
一百四十、Seata-Server安装
一百四十一、Seata业务数据库准备
一百四十二、Seata之Order-Module配置搭建
一百四十三、Seata之Order-Module撸码(上)
一百四十四、Seata之Order-Module撸码(下)
一百四十五、Seata之Storage-Module说明
一百四十六、Seata之Account-Module说明
一百四十七、Seata之@GlobalTransactional验证
一百四十八、Seata之原理简介
一百四十九、大厂面试第三季预告片之雪花算法(上)
一百五十、大厂面试第三季预告片之雪花算法(下)