官网:https://spring.io/projects/spring-cloud-alibaba
Spring Cloud Alibaba provides a one-stop solution for distributed application development. It contains all the components required to develop distributed applications, making it easy for you to develop your applications using Spring Cloud.
With Spring Cloud Alibaba, you only need to add some annotations and a small amount of configurations to connect Spring Cloud applications to the distributed solutions of Alibaba, and build a distributed application system with Alibaba middleware.
Spring Cloud Alibaba 提供分布式应用开发的一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松使用 Spring Cloud 开发应用程序。
使用 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,即可将 Spring Cloud 应用连接到 Alibaba 的分布式解决方案,并通过 Alibaba 中间件构建分布式应用系统。
微服务实战项目开发
构建项目并引入依赖
<properties>
<spring-cloud.version>Hoxton.SR6spring-cloud.version>
<spring.cloud.alibaba.version>2.1.2.RELEASEspring.cloud.alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.cloud.alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
官网:https://nacos.io/zh-cn/index.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Name Service(服务注册与发现) & Configurations Services(统一配置中心)
总结:Nacos就是微服务架构中服务注册中心以及统一配置中心,用来替换原来的(eureka,consul)以及config组件
这里选用linux环境,注意安装nacos前,要保证 jdk1.8+、maven3.2.x+ 环境
1.下载nacos
https://github.com/alibaba/nacos/releases
2.解压缩安装包到指定位置
- [root@localhost ~]# tar -zxvf nacos-server-1.3.1.tar.gz
- bin 启动nacos服务的脚本目录
- conf nacos的配置文件目录
- target nacos的启动依赖存放目录
- data nacos启动成功后保存数据的目录
3.启动安装服务
- linux/unix/mac启动
打开终端进入nacos的bin目录执行如下命令
./startup.sh -m standalone
4.访问nacos的web服务管理界面 http://localhost:8848/nacos/
- 用户名 和 密码都是 nacos
1、创建项目并引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
2、配置注册地址
server.port=8789
spring.application.name=NACOSCLIENT
spring.cloud.nacos.server-addr=ip:8848 #指定nacos服务总地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr} #指定注册中心地址
3、加入启动服务注册注解
注意:新版本springcloud只要引入依赖后,默认开启服务注册与发现,可以不写 @EnableDiscoveryClient
4、查看nacos的服务列表
由于springcloud alibaba中没有提供服务间通信的组件,所以还采用 openFeign,方式与之前springcloud中一致,这里不再写
1、创建项目并引入nacons配置中心依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
2、添加配置文件 bootstrap.properties
spring.cloud.nacos.server-addr=localhost:8848 # 远程配置中心的地址
spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.server-addr} # 去指定nacos地址读取配置
spring.cloud.nacos.config.group=DEFAULT_GROUP # 读取配置的分组
spring.cloud.nacos.config.file-extension=properties # 指定读取文件后缀
spring.cloud.nacos.config.name=configclient-dev # 指定文件名
配置文件名称必须是bootstrap.properties|yml,否则会启动报错,让项目在启动时先预拉取远程配置
3、在nacos中创建配置
4、编写控制器测试配置读取情况
@RestController
public class ConfigClientController {
private static final Logger log = LoggerFactory.getLogger(ConfigClientController.class);
@Value("${user.name}")
private String name;
@GetMapping("/demo")
public String demo() {
log.info("username:{}", name);
return name;
}
}
默认情况下nacos已经实现了自动配置刷新功能,如果需要刷新配置直接在控制器中加入 @RefreshScope
注解即可
dateId = ${prefix}-${spring.profile.active}.${file-extension}
dateId = spring.cloud.nacos.config.name + spring.cloud.nacos.config.file-extension
读取远程配置中心的配置文件有两种方式:
${prefix}-${spring.profile.active}.${file-extension}
- a. prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- b. spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- c. file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
${name}.${file-extension}
- name 指的就是文件名,比如configclient-dev,可以通过配置项spring.cloud.nacos.config.name来设置
- file-exetension 文件后缀,即文件的数据格式
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
每个命名空间都有一个唯一id,这个id是读取配置时指定空间的唯一标识
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
注意:该配置必须放在 bootstrap.properties 文件中。
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=YinXue
注意:该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致。
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
官网:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
nacos集群架构图
# 1.集群搭建注意事项
- 注意:
a.3个或3个以上Nacos节点才能构成集群。
b.要求虚拟机内存分配必须大于2G以上
# 2.集群规划
- node cluster:
192.168.10.138:8845 nacos01
192.168.10.138:8846 nacos02
192.168.10.138:8847 nacos03
192.168.10.138 80 nginx
192.168.10.138 3306 mysql
# 3.搭建nacos集群
1).将nacos安装包从新解压缩
2).开启nacos mysql持久化
注意:数据库中不能存在原始数据
3).复制三份 nacos 分别为
nacos01
nacos02
nacos03
3).修改nacos conf目录中cluster.conf文件添加所有集群节点
192.168.10.138:8845
192.168.10.138:8846
192.168.10.138:8847
4).修改nacos 各自端口号
vim nacos01/conf/application.properties 8845
vim nacos02/conf/application.properties 8846
vim nacos03/conf/application.properties 8847
5).分别启动三台机器
./startup.sh
# 4.安装Nginx
- 0.安装必要依赖
yum install -y gcc pcre-devel zlib-devel
- 1.下载Nginx
http://nginx.org/en/download.html
- 2.将Nginx上传到linux中,并解压缩
tar -zxvf nginx-1.11.1.tar.gz
- 3.查看Nginx安装目录
[root@localhost nginx-1.11.1]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
- 4.在Nginx安装目录中执行如下命令:(指定安装位置)
./configure --prefix=/usr/nginx
- 5.执行上述命令后,执行如下命令:
make && make install
- 6.启动
1. 进入sbin目录 ./nginx 查看nginx是否启动成功: ps aux|grep nginx 默认监听端口为80
2. 关闭nginx服务 ./nginx -s stop
# 5.配置nginx conf配置文件
a.加入如下配置:
upstream nacos-servers {
server 192.168.10.138:8845;
server 192.168.10.138:8846;
server 192.168.10.138:8847;
}
b.修改
location / {
proxy_pass http://nacos-servers/;
}
# 6.启动nginx进行测试即可
As microservices become popular, the stability of service calls is becoming increasingly important. Sentinel takes “flow” as the breakthrough point, and works on multiple fields including flow control, circuit breaking and load protection to protect service reliability.
随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel 以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展业务,保障业务可靠性。
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_how_to_use_sentinel
https://github.com/alibaba/Sentinel/wiki
特性:
sentinel提供了两个服务组件:
1、下载 https://github.com/alibaba/Sentinel/releases
2、启动
3、访问web界面 http://localhost:8858/
注:这种启动方式要一直终端窗口开启
# 1. 搜索镜像
docker search sentinel-dashboard
# 2. 拉取镜像
docker pull bladex/sentinel-dashboard
# 3. 查看端口
docker inspect sentinel-dashboard
发现默认暴露端口为8719、8858
# 4. 启动
docker run --name sentinel -d -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboard
1、创建项目引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
2、配置
server.port=8789
spring.application.name=nacosclient
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
spring.cloud.sentinel.enabled=true # 开启sentinel 默认开启
spring.cloud.sentinel.transport.dashboard=localhost:8858 # 连接dashboard
spring.cloud.sentinel.transport.port=8719 # 与dashboard通信的端口
3、启动后访问dashboard界面查看服务监控
注意:dashboard信息必须在指定服务进行资源调用后才能进行初始化
4、开发服务
@RestController
public class DemoController {
@GetMapping("/demo")
public String demo() {
return "demo ok!!!";
}
}
注意: sentinel必须和项目需要在同一服务器上,否则会导致监控页面空白
解决方案:
spring.cloud.sentinel.transport.client-ip=localhost
,修改容器的时区# 五大规则
# 流控规则:流量控制(flow control)
定义:其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
# 降级规则: 熔断降级(Degrade Service)
定义:其原理是监控应用中资源调用请求,达到指定阈值时自动触发熔断降级
# 热点规则: 热点参数(ParamFlow)
热点:何为热点? 热点即经常访问的数据
定义:其原理很多时候我们希望统计某个热点数据中访问频次最高的Top K 数据,并对其访问进行限制。
# 系统规则: SystemFlow
定义:其原理是 Sentinel 系统自适应限流从整体纬度对应用入口流量进行控制
# 授权规则: 黑白名单控制规则
定义:很多时候,我们需要根据调用来源判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。 来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过:若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS
更多细节参见官网:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
1、配置QPS流量控制
2、测试
1、配置线程数限流
2、访问测试
这里通过压测工具 JMeter进行测试
- 直接:标识流量控制规则到达阈值直接触发流量控制
- 关联: 当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。
- 链路限流: https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
只适用于QPS
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException
)。
-Dcsp.sentinel.statistic.max.rt=xxx
来配置。@GetMapping("/sentinel/test1")
@SentinelResource(value = "aa",blockHandler = "fallBack",fallback = "fall")
public String test1(int id){
log.info("sentinel test1");
if(id<0){
throw new RuntimeException("非法参数!!!");
}
return "sentinel test1 :"+id;
}
//降级异常处理
public String fallBack(int id,BlockException e){
if(e instanceof FlowException){
return "当前服务已被流控! "+e.getClass().getCanonicalName();
}
return "当前服务已被降级处理! "+e.getClass().getCanonicalName();
}
//异常处理
public String fall(int id){
return "当前服务已不可用!";
}
# 1.springcloud & springcloud alibaba
- springcloud 微服务工具集 微服务工具集
- springcloud alibaba 微服务一站式解决方案
# 2.springcloud中组件 五大组件
a.服务注册中心 eureka consul
b.服务间通信组件(ribbon) Openfeign
c.服务熔断 Hystrix、Hystrix DashBoard
d.服务网关 zuul1.x zuul2.x Gateway
e.服务配置中心 config + bus 自动配置刷新
# 3.springcloud alibaba组件
a.服务注册中心 服务配置中心 nacos ====> 替换 eureka consul 替换config+bus
b.服务熔断、流控 sentinel(sentinel、sentinel dashBoard)====>替换原始 Hystrix(Hystrix、Hystrix DashBoard)
# 4.总结:五大组件
a.服务注册中心 nacos
b.服务间通信组件 1.RestTemplate+Ribbon 2.OpenFeign组件
c.服务熔断、流控 sentinel
d.服务网关 gateway
e.服务配置中心 nacos