1、前言
前面章节较多使用了 Netflix 的项目,现在它大部分项目都进入了维护模式,也就是说不会再进行更新和开发新的组件了。有一些组件都开始使用代替版了,比如 Ribbon 由 Loadbalance 代替等等。
SpringCloud Alibaba 支持以下功能:
1、服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RabbitMQ 限流降级功能的介入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控;
2、服务注册与发现:适配 SpringCloud 服务注册与发现标准,默认集成了 Ribbon 的支持;
3、分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新;
4、阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据;
5、分布式任务调度:提供秒级、精确、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网络任务。网络任务支持海量子任务均匀分配到所有 Worker(shedulerx-client)上执行。
具体组件有:
Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Sentinel:阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:Apache RocketMQ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。
Dubbo:Apache Dubbo 是一款高性能 Java RPC 框架。
Seate:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
2、Nacos:下载与安装
Nacos = Eureka + Config + Bus。
Nacos 的下载地址:https://github.com/alibaba/nacos/tags,下面使用1.1.4 版本做讲解。
windows 版本下载后解压进入 bin 目录双击 startup.cmd 即可开启 nacos,输入网址 http://localhost:8848/nacos ,默认账号密码都是 nacos ,即可访问控制台:
3、Nacos:服务注册
对于要注册到 Nacos 的微服务,先导入核心依赖:
<!--spring cloud Alibaba 核心依赖-->
<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>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改配置文件 application.yaml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
主启动类加注解激活:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication9001 {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication9001.class, args);
}
}
再复制两个 9002 、9003,配置一模一样,三个都启动后,可以看到注册成功:
4、Nacos:负载均衡
再创建一个 83 端口模块,依赖和上面的 9001 一样,修改一下配置文件:
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
配置一个 RestTemplate 的 Bean:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
写个控制器类做测试:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
控制器是调用 RestTemplate 去访问微服务,启动后,也注册到了 nacos:
访问网址:http://localhost:83/consumer/payment/nacos/13 ,多刷几次,可以看到实现了负载均衡:
我们通过依赖就可以看出其实是用了 Ribbon 的负载均衡。
5、Nacos:配置中心
我们从 Nacos 的网页控制面板看到它还有配置中心的功能:
一个需要从配置中心获取配置的模块,先导入核心依赖:
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
类似 SpringCloud Config,编写 bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 注册到服务中心
config:
server-addr: localhost:8848 # 配置中心的地址
file-extension: yaml # 配置文件的格式
编写 application.yaml
spring:
profiles:
active: dev # 开发环境
主启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
写一个控制器:
@RestController
@RefreshScope // 支持 nacos 的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
在配置列表新增一个配置文件:
新增后,可以看到:
启动这个 3355 模块,可以看到已经注册到 nacos 了:
输入访问网址:http://localhost:3377/config/info,可以看到:
成功从配置中心获取到了配置。此时我更新 Nacos 上的配置为如下:
发布后再次访问 http://localhost:3377/config/info,可以看到:
可以看到,实时更新了。不像 SpringCloud Config,还得增加多余的操作去刷新。
Nacos 的配置功能有两个概念:命名空间和分组。其实可以看成两级文件夹,就是为了区分不同地区集群、不同环境(开发环境、测试环境或生产环境)的配置。
命名空间可以在下面这里点击增加:
比如我新增了一个 GZ 命名空间,表示广州的微服务集群都从这个命名空间获取配置:
他会随机生成一个 ID,需要从这个命名空间获取配置的微服务的 bootstrap.yml 中都要标明:
有了命名空间来区分不同地区机房,还提供一个叫做分组的概念来区分不同的开发环境:
选择我们的 GZ 命名空间,然后新增一个配置文件:
这个 Group 是可以自己编辑的,然后在 bootstrap.yml 指明哪个分组:
重启这个 3377 ,输入网址 http://localhost:3377/config/info 可以看到:
这里还要注意一个点,就是 Nacos 中的 Data Id
它的命名方式为:
${prefix}-${spring.profile.active}.${file-extension}
prefix:当前服务的名称;
spring.profile.active:在 application.yaml 中指定;
file-extension:配置文件的后缀
用一张图说明:
6、Nacos:持久化配置
继续考虑一个问题:我们在 Nacos 中的配置文件,为什么重启 Nacos 还是继续存在?
这是因为 Nacos 自带一个嵌入式数据库 derby,我们可以更换成自己的 mysql。首先打开 Nacos 的所在文件夹:
conf 里面有一个文件:
打开可以看出,它就是我们 Nacos 中的数据表:
我们在 mysql 中创建一个数据库叫做 nacos_config,然后执行这个 sql 文件:
接着,修改 Nacos 的配置文件,让他把默认的 derby 切换成我们自己的 mysql:
在文件的末尾,添加以下内容:
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=root
除了 db.user 和 db.password ,其他的直接复制上面的即可。