高级部分 SpringCloud Alibaba
alibaba 的 github上有中文文档
spring cloud alibaba带来了什么?
2018.10.31,spring cloud Alibaba正式入驻了Spring Cloud官方孵化器,并在Maven中央库发布了第一个版本
主要功能:
服务限流降级 :默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现 :适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理 :支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力 :基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务 :使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
阿里云对象存储 :阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度 :提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
阿里云短信服务 :覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
只需引入依赖:
1 2 3 4 5 6 7 8 9 10 11 <dependencyManagement > <dependencies > <dependency > <groupId > com.alibaba.cloud</groupId > <artifactId > spring-cloud-alibaba-dependencies</artifactId > <version > 2.2.3.RELEASE</version > <type > pom</type > <scope > import</scope > </dependency > </dependencies > </dependencyManagement >
组件:
**Sentinel **:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
**Nacos **:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
**RocketMQ **:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
**Dubbo **:Apache Dubbo™ 是一款高性能 Java RPC 框架。
**Seata **:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud OSS : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX : 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS : 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Nacos nacos(NAming COnfiguration Service):服务注册和配置中心
Nacos = Eureka + Config + Bus
替代Eureka做服务注册中心
替代Config做服务配置中心
github地址: https://github.com/alibaba/Nacos
Nacos 地址: https://nacos.io/zh-cn/
服务注册与服务框架
CAP模型
控制台管理
社区活跃度
Eureka
AP高可用
支持
低(2.x版本闭源)
Zookeeper
CP一致
支持
中
Consul
CP
支持
高
Nacos
AP(可以切换)
支持
高
nacos可以切换 AP 和 CP ,可使用如下命令切换成CP模式:
1 curl -X PUT '$NACOS_SERVER :8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
下载 :
下载地址: https://github.com/alibaba/nacos/releases/tag/1.1.4
直接下载网址: https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.zip
下载压缩包以后解压,进入bin目录,打开dos窗口,执行startup命令启动它。
端口号8848
可访问 : 【 http://localhost:8848/nacos/index.html】地址,默认账号密码都是nacos
nacos服务中心 https://nacos.io/zh-cn/docs/feature-list.html
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery
nacos提供者 新建模块 alibaba-provider-payment9001
父pom中
1 2 3 4 5 6 7 8 9 10 11 <dependencyManagement > <dependencies > <dependency > <groupId > com.alibaba.cloud</groupId > <artifactId > spring-cloud-alibaba-dependencies</artifactId > <version > 2.1.1.BUILD-SNAPSHOT</version > <type > pom</type > <scope > import</scope > </dependency > </dependencies > </dependencyManagement >
子pom依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <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.mybatis.spring.boot</groupId > <artifactId > mybatis-spring-boot-starter</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.wzg.springcloud</groupId > <artifactId > api-commons</artifactId > <version > ${project.version}</version > </dependency > </dependencies >
yml 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 server: port: 9001 spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: '*'
主启动
1 2 3 4 5 6 7 @EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main (String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
controller
1 2 3 4 5 6 7 8 9 10 @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; } }
Nacos 自带负载均衡机制,下面创建第二个提供者9002。也可以-Dserver.port=9011
新建 alibaba-provider-payment9002 提供者模块,clone 9001 就可以
nacos消费者 新建消费者 模块: alibaba-customer-nacos-order83
pom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <?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>cloud2022</artifactId> <groupId>com.wzg.springcloud</groupId> <version>1.0 -SNAPSHOT</version> </parent> <modelVersion>4.0 .0 </modelVersion> <artifactId>alibaba-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.wzg.springcloud</groupId> <artifactId>api-commons</artifactId> <version>${project.version}</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> <properties> <maven.compiler.source>8 </maven.compiler.source> <maven.compiler.target>8 </maven.compiler.target> </properties> </project>
yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 service-url: nacos-user-service: http://nacos-payment-provider
主启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.wzg.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main (String[] args) { SpringApplication.run(OrderNacosMain83.class, args); } }
bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.wzg.springcloud.bean;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;@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate () { return new RestTemplate (); } }
controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.wzg.springcloud.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;@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); } }
各种服务中心对比
服务注册与服务框架
CAP模型
控制台管理
社区活跃度
Eureka
AP
支持
低(2.x版本闭源)
Zookeeper
CP
支持
中
Consul
CP
支持
高
Nacos
AP/CP
支持
高
组件名
语言
CAP
服务健康检查
对外暴露接口
SpringCloud集合
Eureka
java
AP
可配支持
HTTP
已集成
Consul
Go
CP
支持
HTTP/DNS
已集成
Zookeeper
java
CP
支持
客户端
已集成
NACOS支持CP和AP切换
nacos配置中心 配置中心对比
对比项目
Spring Cloud Config
Apollo
Nacos
配置实时推送
支持(Spring Cloud Bus)
支持(HTTP长轮询1s内)
支持(HTTP长轮询1s内)
版本管理
支持(Git)
支持
支持
配置回滚
支持(Git)
支持
支持
灰度发布
支持
支持
不支持
权限管理
支持(依赖Git)
支持
不支持
多集群
支持
支持
支持
多环境
支持
支持
支持
监听查询
支持
支持
支持
多语言
只支持Java
主流语言,提供了Open API
主流语言,提供了Open API
配置格式校验
不支持
支持
支持
单机读(QPS)
7(限流所致)
9000
15000
单击写(QPS)
5(限流所致)
1100
1800
3节点读 (QPS)
21(限流所致)
27000
45000
3节点写 (QPS)
5(限流所致)
3300
5600
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开放的大规模自动化运维API。功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Config不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
nacos 还可以作为服务配置中心,下面是案例,创建一个模块,从nacos上读取配置信息。
nacos 作为配置中心,不需要像springcloud config 一样做一个Server端模块。
新建模块 alibaba-config-nacos-client3377
pom依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 <?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>cloud2022</artifactId> <groupId>com.wzg.springcloud</groupId> <version>1.0 -SNAPSHOT</version> </parent> <modelVersion>4.0 .0 </modelVersion> <artifactId>alibaba-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> <properties> <maven.compiler.source>8 </maven.compiler.source> <maven.compiler.target>8 </maven.compiler.target> </properties> </project>
bootstrap.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml group: TEST_GROUP namespace: 50d6d64e-f273-406a-abf8-9e45e2f2a7b6
application.yml
1 2 3 4 5 spring: profiles: active: dev
主启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.wzg.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377 { public static void main (String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.wzg.springcloud.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;@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo () { return configInfo; } }
nacos同springcloud-config一样,在项目初始化时,要先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot的配置文件的加载是存在优先熟悉怒的,bootstrap优先级高于application。(bootstrap中放共性,application中放个性)
nacos中的dataid的组成格式及与springboot配置文件中的匹配规则:
在nacos中,消费端要的文件怎么和nacos中的文件匹配呢?
在 Nacos Spring Cloud 中,dataId
的完整格式如下:(就是说在nacos端我们怎么命名文件的)
1 2 ${prefix}-${spring.profiles.active}.${file-extension} 1
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。
spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档 。 注意:当 spring.profiles.active
为空时,对应的连接符 -
也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。(注意nacos里必须使用yaml)
从上面可以看到重要的一点,配置文件的名称第二项,spring.profiles.active 是依据当前环境的profile属性值的,也就是这个值如果是 dev,即开发环境,它就会读取 dev 的配置信息,如果是test,测试环境,它就会读取test的配置信息,就是从 spring.profile.active 值获取当前应该读取哪个环境下的配置信息。
所以要配置spring.profiles.active,新建application.yml文件,添加如下配置:
1 2 3 spring: profiles: active: dev
综合以上说明,和下面的截图,Nacos 的dataid(类似文件名)应为: nacos-config-client-dev.yaml (必须是yaml)
当修改配置值,会发现 3377 上也已经修改,Nacos自带自动刷新功能!
nacos的优势在哪:
问题1:实际开发者,通常一个系统会准备dev/test/prod环境。如何保证环境启动时服务能正确读取nacos上相应环境的配置文件
问题2:一个大型分布式微服务系统有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境。那怎么对微服务配置进行管理呢?
dgn方案 dataid
方案(就是nacos的文件名):
指定spring.profile.active和配置文件的dataID来使不太环境下读取不同的配置
配置空间+配置分组+新建dev和test两个dataid:就是创建-后不同的两个文件名nacos-config-client-dev.yaml
、nacos-config-client-test.yaml
通过IDEA里的spring.profile.active属性就能进行多环境下配置文件的读取
Group
方案(默认DEFAULT_GROUP):
在nacos创建配置文件时,给文件指定分组。
在IDEA中该group内容
实现的功能:当修改开发环境时,只会从同一group中进行切换。
namespace
方案(默认public):
这个是不允许删除的,可以创建一个新的命名空间,会自动给创建的命名空间一个流水号。
在nacos新建命名空间,自动出现7d8f0f5a-6a53-4785-9686-dd460158e5d4
在IDEA的yml中指定命名空间namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4
最后,dataid、group、namespace 三者关系如下:(不同的dataid,是相互独立的,不同的group是相互隔离的,不同的namespace也是相互独立的)
上面只是小打小闹,下面才是真正的高级操作。
搭建集群必须持久化,不然多台机器上的nacos的配置信息不同,造成系统错乱。它不同于单个springcloud config,没有集群一说,而且数据保存在github上,也不同于eureka,配置集群就完事了,没有需要保存的配置信息。
nacos集群/持久化 nacos挂了怎么办?
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
一台linux虚拟机:nginx服务器(虚拟ip),3个nacos服务,一个mysql数据库。
nginx的安装参考之前学,使用 ContOs7 至少需要安装gcc库,不然无法编译安装【yum install gcc】
nacos下载linux版本的 tar.gz 包:https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz
Nacos支持三种部署模式 https://nacos.io/zh-cn/docs/deployment.html
单机模式 - 用于测试和单机试用。
集群模式 - 用于生产环境,确保高可用。
多集群模式 - 用于多数据中心场景。
单机模式支持mysql:在0.7版本之前,在单机模式时nacos使用嵌入式数据库 (derby,他的pom里有这个依赖)实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos/conf/nacos-mysql.sql。创建个database数据库nacos_devtest
3.修改IDEA中nacos/conf/application.properties文件(切换数据库),增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
```properties
切换数据库 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=root db.password=w2757312346
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - 再以单机模式启动nacos(重启),nacos所有写嵌入式数据库的数据都写到了mysql 单击的数据库都是独立的,我们得让他们共用一个数据库 Nacos集群配置 环境准备:1 . 64 bit OS Linux/Unix/ Mac,推荐使用Linux系统。2 . 64 bit JDK 1.8 +;[下载](http:// www.oracle.com/technetwork/ java/javase/ downloads/jdk8-downloads-2133151.html).[配置](https:/ /docs.oracle.com/ cd/E19182-01/ 820 -7851 /inst_cli_jdk_javahome_t/ )。3 . Maven 3.2 .x+;[下载](https://m aven.apache.org/download.cgi).[配置](https:/ /maven.apache.org/ settings.html)。4 . 3 个或3 个以上Nacos节点才能构成集群。 开始配置集群:1 . 首先对 nacos 进行持久化操作,操作如上面一致。2 . 修改 nacos/conf 下的cluster.conf文件,添加如下内容: ```sh 192.168 .200.130 :3333 192.168 .200.130 :4444 192.168 .200.130 :5555
修改nacos/conf/application.properties文件,添加设置我们的数据库信息
模拟三台nacos服务,编辑nacos的startup.sh脚本,使他能够支持不同的端口启动多次。 集群启动,我们希望可以类似其他软件的shell命令,传递不同的端口号启动不同的nacos实例。
vim startup.sh
nohup $JAVA -Dserver.port=${PORT} ${JAVA_POT} nacoas.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
依次执行命令启动3个nacos集群:./startup.sh -p 3333
表示启动端口号为3333的nacos服务器实例./startup.sh -p 4444
./startup.sh -p 5555
ps -ef | grep nacos | grep -v grep | wc -l
修改nginx配置,把他作为负载均衡:
1 vim ./nginx/conf/nginx.conf
启动nginx:./nginx -c ../conf/nginx.conf
通过nginx访问:192.168.1.2:1111/nacos/#/login
使用 9002 模块注册进Nacos集群,并获取它上面配置文件的信息application.yml中的server-addr: 192.168.1.2:1111
,进行测试。