Spring Cloud Alibaba 新一代微服务解决方案
Spring Cloud Alibaba 实战笔记
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。
Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
最重要的原因在于spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,我们公司在使用的时候就发现过其一个细小的Bug;而其他的众多组件预计会在明年(即2020年)停止维护。所以急需其他的一些替代产品,也就是spring cloud alibaba,目前正处于蓬勃发展的态式。
流量控制和服务降级:支持WebServlet,WebFlux,OpenFeign,RestTemplate,Dubbo访问限制和降级流的功能。它可以在运行时通过控制台实时修改限制和降级流的规则,并且还支持监视限制和降级度量标准。
服务注册和发现:可以注册服务,并且客户可以使用Spring托管的bean(自动集成功能区)发现实例。
分布式配置:支持分布式系统中的外部配置,配置更改时自动刷新。
Rpc服务:扩展Spring Cloud客户端RestTemplate和OpenFeign以支持调用Dubbo RPC服务。
事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
分布式事务:支持高性能且易于使用的分布式事务解决方案。
阿里云对象存储:大规模,安全,低成本,高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
阿里云SchedulerX:准确,高度可靠,高可用性的计划作业调度服务,响应时间在几秒钟之内。
阿里云SMS:覆盖全球的消息服务,阿里巴巴SMS提供便捷,高效和智能的通信功能,可帮助企业快速联系其客户。
其中阿里云对象存储、阿里云SchedulerX、阿里云SMS为商业组件,需要购买相关云服务才能使用
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: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos快速开始
Nacos基础概念
1)地域(Region)
物理的数据中心,资源创建成功后不能更换;
2)可用区(Available Zone)
同一地域内,电力和网络互相独立的物理区域,同一可用区内,实例的网络延迟较低;
3)接入点(Endpoint)
地域的某个服务的入口域名;
4)命名空间(Namespace)
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group或 Data ID的配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如:配置、服务)隔离等;
5)配置(Configuration)
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如:WAR、JAR等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
Ø 配置管理(Configuration Management)
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
Ø 配置项(Configuration Item)
一个具体的可配置的参数与其值域,通常以 param-key=param-value形式存在,例如:我们常配置的系统日志输出基本(logLevel=INFO|WARN|ERROR)就是一个配置项。
Ø 配置集(Configuration Set)
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含老系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
Ø 配置集ID(Data ID)
Nacos中的某个配置集的ID。配置集ID是组织划分配置的维度之一。Data ID通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID通常采用类Java 包(如:com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,此命名规则非强制。
Ø 配置分组(Group)
Nacos中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如:Buy或Trace)对配置集进行分组,从而区分Data ID相同的配置集。当您在Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如:database_url配置和MQ_topic配置。
Ø 配置快照(Configuration Snapshot)
Nacos的客户端SDK会在本地生成配置的快照。当客户端无法连接到Nacos Server时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 的本地 Commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。
6)服务(Service)
通过预定义接口网络访问的提供给客户端的软件功能。
7)服务名(Service Name)
服务提供的标识,通过该标识可以唯一确定其指代的服务。
8)服务注册中(Service Registry)
存储服务实例和服务负载均衡策略的数据库。
9)服务发现(Service Discovery)
在计算机网络上,(通常使用服务名)对服务下的实例的地址和元数据进行探测,并以预定义的接口提供给客户端进行查询。
10)元信息(Metadata)
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签(label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
11)应用(Application)
英语标识服务提供方的服务的属性。
12)服务分组(Service Group)
不同的服务可以归档到同一分组。
13)虚拟集群(Virtual Cluster)
同一服务下的所有服务实例组成一个默认集群,集群可以被进一步按需求划分,划分的单位可以是虚拟集群。
14)实例(Instance)
提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。
15)权重(weight)
实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。
16)健康检查(Health Check)
以制定方式检查服务下挂载的实例(Instance)的健康度,从而确认该实例(Instance)是否能提供服务。根据检查结果,实例(Instance)会被判断为健康或不健康。对服务发起解析请求时,不健康的实例(Instance)不会返回给客户端。
17)健康保护阈值(Protect Threshold)
为了防止因过多实例(Instance)不健康导致流量全部流向健康实例(Instance),继而造成流量压力把健康实例压垮并形成雪崩效应,应将健康保护阈值定义为一个0到1之间的浮点数。当域名健康实例(Instance)占总服务实例的比例小于改值,无论实例是否健康,都会讲这个实例返回给客户端。这样做虽然损失了一部分流量,但保证了集群的剩余健康实例能正常工作。
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
使用nacos注册中心:
+ 易用
+ 功能性强
+ 支持AP 和CP
+ 集群
+ 支持负载均衡策略
下载:
nacos-server-2.0.3.zip
启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
登录:
http://localhost:8848/nacos/
输入账号密码:nacos/nacos ,即可登录Nacos
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.4.RELEASEversion>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Greenwich.SR1version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.4.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
dependencies>
启动类:
@SpringBootApplication
@EnableDiscoveryClient//启用服务注册于发现
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
@RestController
public class TestController {
@GetMapping("/hello")
public String hello() {
//获取url的值
System.out.println("url:");
return "hello";
}
}
}
配置:
application.yml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: nacos-client
Spring Boot 中application.yml与bootstrap.yml的区别
bootstrap与application
1.加载顺序
这里主要是说明application和bootstrap的加载顺序。
•bootstrap.yml(bootstrap.properties)先加载
•application.yml(application.properties)后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
父ApplicationContext 被加载到使用 application.yml 的之前。
•bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
•application.yml 可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
# 配置一些固定的值 把nacos当做使用配置中心
spring:
cloud:
nacos:
discovery:
server-addr: ${spring.cloud.nacos.server}
config:
server-addr: ${spring.cloud.nacos.server}
file-extension: yml # 默认是使用properties文件作为后缀
namespace: dev # 标识获取dev下的配置文件
group: STUDENT
server: localhost:8848
application:
name: nacos-client
nacos新建nacos-client.yaml
server:
port: 8001
jdbc:
url: localhost
名字为应用程序 的名字
启动类:
@SpringBootApplication
@EnableDiscoveryClient//启用服务注册于发现
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
@RestController
@RefreshScope //刷新Bean
public class TestController {
@Value("${jdbc.url:123456}")
private String url;
@GetMapping("/hello")
public String hello() {
//获取url的值
System.out.println("url:" + url);
return "hello";
}
}
}
主流配置中心对比
目前市面上用的比较多的配置中心有:SpringCloudConfig、Apollo、Nacos和Disconf等。由于Disconf不再维护,下面主要对比一下SpringCloudConfig、Apollo和Nacos。
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之SpringCloudConfig依赖Git场景不适合开放的大规模自动化运维API。功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而SpringCloudConfig不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
1)、初始化数据库
Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有
进入nacos-server-1.0.1\nacos\conf目录,初始化文件:nacos-mysql.sql
此处我创建一个名为 mynacos 的数据库,然后执行初始化脚本,成功后会生成 11 张表
2)、修改配置
这里是需要修改Nacos-server的配置文件
Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos-server-1.0.1\nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
Nacos集群(Linux下standalone模式和cluster模式)
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html