1. 简介
Spring Cloud阿里巴巴旨在为微服务开发提供一站式解决方案。该项目包括开发分布式应用程序和服务所需的组件,以便开发人员可以使用 Spring Cloud 编程模型轻松开发分布式应用程序。
使用春云阿里巴巴,你只需要添加一些注释和配置,就可以将阿里巴巴的分布式解决方案用于你的应用,用阿里巴巴中间件构建属于自己的分布式系统。
Spring Cloud阿里巴巴的特点:
-
流量控制和服务降级:支持WebServlet,WebFlux,OpenFeign,RestTemplate,Dubbo访问限制和降级流量的功能。它可以在运行时通过控制台实时修改限制和降级流的规则,并且还支持对限制和降级指标的监控。
- 服务注册和发现:可以注册服务,客户端可以使用 Spring 管理的 bean、自动集成功能区发现实例。
- 分布式配置:支持分布式系统中的外部化配置,配置发生变化时自动刷新。
-
Rpc 服务:扩展 Spring Cloud 客户端 RestTemplate 和 OpenFeign 以支持调用 Dubbo RPC 服务。
-
事件驱动:支持构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。
- 分布式事务:支持高性能、易用性的分布式事务解决方案。
- 阿里云对象存储:海量、安全、低成本、高可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
-
阿里云调度程序X:准确、高可靠、高可用的调度作业调度服务,响应时间在秒级。
-
阿里云短信:覆盖全球的消息服务,阿里短信提供便捷、高效、智能的通信能力,帮助企业快速联系客户。
2. 依赖管理
如果您是 Maven Central 用户,请将我们的 BOM 添加到您的 pom.xml <依赖项管理>部分。这将允许您省略任何 Maven 依赖项的版本,而是将版本控制委托给 BOM。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在以下部分中,将假定您使用的是 Spring Cloud 阿里巴巴 BOM,并且依赖项代码段将不包含版本。
3. Spring Cloud阿里巴巴纳科斯发现
Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
通过Spring Cloud阿里巴巴Nacos发现,您可以快速访问基于Spring Cloud编程模型的Nacos服务注册功能。
3.1. 服务注册/发现:Nacos 发现
服务发现是微服务体系结构中的关键组件之一。在这样的体系结构中,为每个客户端手动配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。 Nacos Discovery帮助您自动将服务注册到Nacos服务器,Nacos服务器会跟踪服务并动态刷新服务列表。此外,纳科斯 发现将服务实例的一些元数据(例如主机、端口、运行状况检查 URL、主页)注册到 Nacos。有关如何下载和启动 Nacos 的详细信息,请参阅Nacos 网站。
3.2. 如何引入 Nacos 发现进行服务注册/发现
请使用组 ID 为 和工件 ID 为 的启动器。com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3. 使用 Nacos 发现进行服务注册/发现和调用的示例
Nacos Discovery与Netflix Ribbon集成,RestTemplate或OpenFeign可用于服务到服务呼叫。
3.3.1. Nacos 服务器启动
有关如何下载和启动 Nacos 的详细信息,请参阅Nacos 网站。
Nacos 服务器启动后,进入http://ip:8848查看控制台(默认账号名/密码为 nacos/nacos):
有关更多 Nacos 服务器版本,您可以从发布页面下载最新版本。
3.3.2. 启动提供程序应用程序
以下示例说明了如何将服务注册到 Nacos。
- pom的配置.xml以下是pom.xml的完整示例:
绒球.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>open.source.test</groupId>
<artifactId>nacos-discovery-test</artifactId>
<version>1.0-SNAPSHOT</version>
<name>nacos-discovery-test</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- application.properties 的配置 Nacos 的一些基本配置必须包含在 application.properties(或 application.yaml)中,如下所示:
应用程序属性
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
注意 |
如果您不想使用 Nacos 进行服务注册和发现,则可以设置。spring.cloud.nacos.discovery false |
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
现在您可以在 Nacos 控制台上看到已注册的服务。
注意 |
在启动提供程序应用程序之前,请先启动 Nacos。详情请参阅Naco网站。 |
3.3.3. 启动消费者应用程序
这可能不像启动提供程序应用程序那么容易,因为使用者需要调用提供程序的 RESTful 服务。在这个例子中,我们将使用最原始的方式,即 显式组合 LoadBalanceClient 和 RestTemplate 以访问 RESTful 服务。 您可以参考第 1.2 节了解 pom.xml 和 application.properties 配置。以下是启动使用者应用程序的示例代码。
注意 |
您还可以通过使用具有负载平衡的 RestTemplate 和 FeignClient 来访问该服务。 |
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);
}
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
在此示例中,我们注入了一个 LoadBalancerClient 实例,并手动实例化了一个 RestTemplate。同时,我们将配置值注入到应用中, 以便在调用提供程序的服务时可以显示当前应用程序名称。spring.application.name
注意 |
请在启动消费者应用程序之前启动 Nacos。详情请参阅纳科斯网站。 |
接下来,访问消费者提供的接口。在这里,我们开始了 8082 的端口。访问结果如下所示:http://ip:port/echo/app-name
Address:http://127.0.0.1:8082/echo/app-name
Access result: Hello Nacos Discovery nacos-consumer
3.4. 纳科斯发现端点
Nacos Discovery 在内部为一个端点提供了一个相应的端点 ID。nacosdiscovery
终结点公开的 json 包含两个属性:
- 订阅:显示当前服务订阅者
- NacosDiscoveryProperties:显示当前服务的当前基本Nacos配置
下面显示了服务实例如何访问终结点:
{
"subscribe": [
{
"jsonFromServer": "",
"name": "nacos-provider",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "30.5.124.156#8081#DEFAULT#nacos-provider",
"ip": "30.5.124.156",
"port": 8081,
"weight": 1.0,
"healthy": true,
"enabled": true,
"cluster": {
"serviceName": null,
"name": null,
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {
}
},
"service": null,
"metadata": {
}
}
],
"lastRefTime": 1541755293119,
"checksum": "e5a699c9201f5328241c178e804657e11541755293119",
"allIPs": false,
"key": "nacos-provider",
"valid": true
}
],
"NacosDiscoveryProperties": {
"serverAddr": "127.0.0.1:8848",
"endpoint": "",
"namespace": "",
"logName": "",
"service": "nacos-provider",
"weight": 1.0,
"clusterName": "DEFAULT",
"metadata": {
},
"registerEnabled": true,
"ip": "30.5.124.201",
"networkInterface": "",
"port": 8082,
"secure": false,
"accessKey": "",
"secretKey": ""
}
}
3.5. 重量路线
3.5.1. 弹簧云负载均衡器
绒球.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
</dependencies>
应用程序属性
spring.cloud.loadbalancer.ribbon.enabled=false
spring.cloud.loadbalancer.nacos.enabled=true
3.6. 有关 Nacos 发现启动器配置的更多信息
下面显示了 Nacos Discovery 启动器的其他配置:
配置 |
钥匙 |
默认值 |
描述 |
服务器地址 |
spring.cloud.nacos.discovery.server-addr |
|
Nacos 服务器侦听器的 IP 和端口 |
服务名称 |
spring.cloud.nacos.discovery.service |
${spring.application.name} |
命名当前服务 |
重量 |
spring.cloud.nacos.discovery.weight |
1 |
值范围:1 到 100。值越大,权重越大 |
网卡名称 |
spring.cloud.nacos.discovery.network-interface |
|
如果未指定 IP 地址,则注册的 IP 地址为网卡的 IP 地址。如果未指定,则默认使用第一个网卡的 IP 地址。 |
注册的 IP 地址 |
spring.cloud.nacos.discovery.ip |
|
最高优先级 |
注册的 IP 地址类型 |
spring.cloud.nacos.discovery.ip-type |
IPv4 |
可以配置IPv4和IPv6,如果同一类型的网卡有多个IP地址,并且要指定特定的网段地址,则可以使用配置过滤器地址spring.cloud.inetutils.preferred-networks |
注册端口 |
spring.cloud.nacos.discovery.port |
-1 |
默认情况下将自动检测。不需要配置。 |
Namespace |
spring.cloud.nacos.discovery.namespace |
|
一个典型的场景是隔离不同环境的服务注册,例如测试环境和生产环境之间的资源(配置、服务等)隔离 |
访问密钥 |
spring.cloud.nacos.discovery.access-key |
|
阿里云账号访问密钥 |
密钥 |
spring.cloud.nacos.discovery.secret-key |
|
阿里云账号密钥 |
元数据 |
spring.cloud.nacos.discovery.metadata |
|
您可以以地图格式定义服务的一些元数据 |
日志文件名 |
spring.cloud.nacos.discovery.log-name |
|
|
群集名称 |
spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
纳科斯集群名称 |
端点 |
spring.cloud.nacos.discovery.endpoint |
|
特定地域内某项服务的域名。您可以使用此域名动态检索服务器地址 |
是否集成负载均衡器 |
spring.cloud.loadbalancer.nacos.enabled |
false |
|
启用纳科斯手表 |
spring.cloud.nacos.discovery.watch.enabled |
true |
设置为 false 以关闭监视 |
4. Spring Cloud阿里巴巴 Nacos 配置
Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
使用Spring Cloud Alibaba Nacos Config,基于Spring Cloud的编程模型,快速访问Nacos配置管理功能。
4.1. 如何引入 Nacos 配置进行配置
请使用组 ID 为 和工件 ID 为 的启动器。com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
4.2. 快速入门
Nacos Config使用DataId和GROUP来确定配置。
下图显示了 DataId 使用、GROUP 使用和配置格式为 Properties 的配置项:myDataid
DEFAULT_GROUP
4.2.1. 初始化 Nacos 服务器
具体启动方法请参考 Spring Cloud阿里巴巴 Nacos 发现版块的“Nacos 服务器启动”部分。
Nacos 服务器启动后,添加如何配置它:
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
Configuration format: Properties
Configuration content: user.name=nacos-config-properties
user.age=90
客户端上的使用情况
如果要使用 Nacos 管理应用程序的外部化配置,请使用组 ID 和工件 ID 的启动器。com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
现在我们可以创建一个标准的 Spring Boot 应用程序。
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" +userName+"; age: "+userAge);
}
}
注意 |
请注意,当你,因为获取文件中的配置将在文件之前加载。 根据 Spring 提到的官方文档 [bootstrap](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-first-bootstrap) 为了解决这个问题,我们建议您在项目根文件中添加以下依赖项spring-cloud-alibaba’s version is ``2021.1 nacos bootstrap.yml application.yml pom.xml |
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
在运行此示例之前,我们需要在 bootstrap.properties 中配置 Nacos 服务器的地址。例如:
bootstrap.properties
# DataId By default, the `spring.application.name` configuration is combined with the file extension (the configuration format uses properties by default), and the GROUP is not configured to use DEFAULT_GROUP by default. Therefore, the Nacos Config configuration corresponding to the configuration file has a DataId of nacos-config.properties and a GROUP of DEFAULT_GROUP
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
注意 |
如果您使用域名访问 Nacos,则格式应该是。 例如,如果 Nacos 域名是 abc.com.nacos,而 listerner port 是 80,那么配置应该是。 不能省略端口 80。spring.cloud.nacos.config.server-addr Domain name:port spring.cloud.nacos.config.server-addr=abc.com.nacos:80 |
运行此示例,您可以看到以下输出:
2018-11-02 14:24:51.638 INFO 32700 --- [main] c.a.demo.provider.NacosConfigApplication : Started NacosConfigApplication in 14.645 seconds (JVM running for 15.139)
user name :nacos-config-properties; age: 90
2018-11-02 14:24:51.688 INFO 32700 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a8c5e74: startup date [Fri Nov 02 14:24:51 CST 2018]; root of context hierarchy
4.3. 使用 YAML 格式添加具有数据 ID 的配置
Nacos Config也支持yaml格式。您只需要完成以下 2 个步骤。
1、在bootstrap.properties文件中,添加以下行,声明DataId的格式为yaml。如下:
bootstrap.properties
spring.cloud.nacos.config.file-extension=yaml
2、在 Nacos 控制台添加 yaml 格式的 DataId 配置,如下图所示:
Data ID: nacos-config.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: user.name: nacos-config-yaml
user.age: 68
完成前面的两个步骤后,重新启动测试程序,您将看到以下结果。
2018-11-02 14:59:00.484 INFO 32928 --- [main] c.a.demo.provider.NacosConfigApplication:Started NacosConfigApplication in 14.183 seconds (JVM running for 14.671)
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529 INFO 32928 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e: startup date [Fri Nov 02 14:59:00 CST 2018]; root of context hierarchy
4.4. 支持动态配置
Nacos Config还支持动态配置更新。启动 Spring 引导应用程序测试的代码如下:
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while(true) {
//When configurations are refreshed dynamically, they will be updated in the Enviroment, therefore here we retrieve configurations from Environment every other second.
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
更改 user.name 时,可以从应用程序中检索最新值,如下所示:
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
2018-11-02 15:04:25.069 INFO 32957 --- [-127.0.0.1:8848] o.s.boot.SpringApplication : Started application in 0.144 seconds (JVM running for 71.752)
2018-11-02 15:04:25.070 INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@10c89124: startup date [Fri Nov 02 15:04:25 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7
2018-11-02 15:04:25.071 INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7: startup date [Fri Nov 02 15:04:24 CST 2018]; root of context hierarchy
//Read the updated value from Enviroment
user name :nacos-config-yaml-update; age: 68
user name :nacos-config-yaml-update; age: 68
注意 |
您可以使用此设置“spring.cloud.nacos.config.refresh.enabled=false”禁用自动刷新。 |
4.5. 支持配置文件级别的配置
当 Nacos Configuration 加载配置时,还会加载具有 DataId of 和 DataId of 的基本配置。如果需要使用不同环境中的不同配置,可以使用 Spring 提供的配置。${spring.application.name}. ${file-extension:properties}
${spring.application.name}-${profile}. ${file-extension:properties}
${spring.profiles.active}
spring.profiles.active=develop
注意 |
在配置文件中指定时,${spring.profiles.active} 必须放在 bootstrap.properties 中。 |
在 Nacos 中添加一个基本配置,DataId 为 nacos-config-develop.yaml,如下所示:
Data ID: nacos-config-develop.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: current.env: develop-env
运行以下 Spring Boot 应用程序测试代码:
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
//Get the current deployment environment
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
启动后,您可以在控制台中看到如下输出:
in develop-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:34:25.013 INFO 33014 --- [ Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7: startup date [Fri Nov 02 15:33:57 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449
要切换到生产环境,只需更改参数即可。如下所示:${spring.profiles.active}
spring.profiles.active=product
同时,在生产环境的 Nacos 中添加具有 DataId 的基本配置。例如,您可以在生产环境的 Nacos 中添加使用 nacos-config-product.yaml 的 DataId 进行配置:
Data ID: nacos-config-product.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: current.env: product-env
启动测试程序,您将看到以下结果:
in product-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:42:14.628 INFO 33024 --- [Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6aa8e115: startup date [Fri Nov 02 15:42:03 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@19bb07ed
注意 |
在此示例中,我们使用该方法对配置文件中的配置进行了编码。在实际场景中,这个变量在不同的环境中需要不同。您可以使用参数指定配置,以便您可以轻松地在不同环境之间切换。spring.profiles.active=<profilename> -Dspring.profiles.active=<profile> |
4.6. 支持自定义命名空间
有关 Nacos 中命名空间的详细信息,请参阅Nacos 概念
命名空间用于隔离不同租户的配置。组和数据 ID 在不同的命名空间中可以相同。命名空间的典型场景是不同环境的配置隔离,例如开发/测试环境与生产环境(配置和服务等)之间的隔离。
如果未指定命名空间,则使用 Nacos 的“公共”命名空间。您还可以通过以下方式指定自定义命名空间:${spring.cloud.nacos.config.namespace}
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
注意 |
此配置必须位于 bootstrap.properties 文件中。的值 of 是命名空间的 id,id 的值可以从 Nacos 控制台检索。添加配置时不要选择其他命名空间。否则无法正确检索配置。spring.cloud.nacos.config.namespace |
4.7. 支持自定义组
定义 noconfiguration 时,默认情况下使用 DEFAULT_GROUP。如果需要定义自己的组,可以在以下属性中定义它:{spring.cloud.nacos.config.group}
spring.cloud.nacos.config.group=DEVELOP_GROUP
注意 |
此配置必须位于 bootstrap.properties 文件中,并且 Group 的值必须与 的值相同。spring.cloud.nacos.config.group |
4.8. 支持自定义数据ID
从Spring Cloud阿里Nacos配置开始,数据ID可以自定义。有关此部分的详细设计,请参阅Github 问题。 以下是完整示例:
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
# 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
# 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true
我们可以看到:
- 通过配置支持多个数据 ID。
spring.cloud.nacos.config.ext-config[n].data-id
- 通过配置自定义数据 ID 组。如果未指定,则使用 DEFAULT_GROUP。
spring.cloud.nacos.config.ext-config[n].group
- 通过配置更改配置时,控制是否支持动态刷新配置。 默认情况下不支持。
spring.cloud.nacos.config.ext-config[n].refresh
注意 |
当同时配置多个数据 ID 时,优先级由 “n” in 的值定义。值越大,优先级越高。spring.cloud.nacos.config.ext-config[n].data-id |
注意 |
的值必须具有文件扩展名,它可以是属性或 yaml/yml。 该设置对自定义数据 ID 文件扩展名没有任何影响。spring.cloud.nacos.config.ext-config[n].data-id spring.cloud.nacos.config.file-extension |
自定义 Data ID 的配置允许在多个应用程序之间共享配置,并且还支持一个应用程序的多个配置。
要以更清晰的方式在多个应用程序之间共享数据 ID,您还可以使用以下方法:
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
我们可以看到:
- 可以使用 配置多个共享数据 ID,并且数据 ID 用逗号分隔。
spring.cloud.nacos.config.shared-dataids
-
spring.cloud.nacos.config.refreshable-dataids
用于控制在更新配置时动态刷新哪些数据 ID,以及应用程序可以检索最新的配置值。数据 ID 用逗号分隔。 如果未指定,则不会动态刷新所有共享数据 ID。
注意 |
用于配置多个共享数据 ID 时, 我们同意共享配置之间的以下优先级: 优先级是根据配置出现的顺序决定的。稍后出现的优先级高于最先出现的优先级。spring.cloud.nacos.config.shared-dataids |
注意 |
使用时,数据 ID 必须具有文件扩展名,它可以是属性或 yaml/yml。 并且配置对自定义的数据ID文件扩展名没有任何影响。spring.cloud.nacos.config.shared-dataids spring.cloud.nacos.config.file-extension |
注意 |
指定支持动态刷新的数据 ID 时,数据 ID 的相应值也应指定文件扩展名。spring.cloud.nacos.config.refreshable-dataids |
4.9. Nacos 配置端点
Nacos Config 在内部提供了一个端点,其对应的端点 ID 为 。nacos-config
终结点公开的 json 包含三个属性:
- 来源:当前应用程序配置数据信息
- 刷新历史记录:配置刷新历史记录
- NacosConfigProperties:显示当前服务的当前基本Nacos配置
下面显示了服务实例如何访问终结点:
{
"NacosConfigProperties": {
"serverAddr": "127.0.0.1:8848",
"encode": null,
"group": "DEFAULT_GROUP",
"prefix": null,
"fileExtension": "properties",
"timeout": 3000,
"endpoint": null,
"namespace": null,
"accessKey": null,
"secretKey": null,
"contextPath": null,
"clusterName": null,
"name": null,
"sharedDataids": "base-common.properties,common.properties",
"refreshableDataids": "common.properties",
"extConfig": null
},
"RefreshHistory": [{
"timestamp": "2019-07-29 11:20:04",
"dataId": "nacos-config-example.properties",
"md5": "7d5d7f1051ff6571e2ec9f90887d9d91"
}],
"Sources": [{
"lastSynced": "2019-07-29 11:19:04",
"dataId": "common.properties"
}, {
"lastSynced": "2019-07-29 11:19:04",
"dataId": "base-common.properties"
}, {
"lastSynced": "2019-07-29 11:19:04",
"dataId": "nacos-config-example.properties"
}]
}
4.10. 禁用 Nacos 配置自动配置
设置 spring.cloud.nacos.config.enabled = false 以禁用 Spring Cloud Nacos Config AutoConfiguration。
4.11. 有关 Nacos 配置启动器配置的更多信息
下面显示了 Nacos 配置启动器的其他配置:
配置 |
钥匙 |
默认值 |
描述 |
服务器地址 |
spring.cloud.nacos.config.server-addr |
|
Nacos 服务器侦听器的 IP 和端口 |
来自 nacos config 的 Dataid |
spring.cloud.nacos.config.name |
|
先取前缀,再去名字,最后取 spring.application.name |
来自 nacos config 的 Dataid |
spring.cloud.nacos.config.prefix |
|
先取前缀,再去名字,最后取 spring.application.name |
对 nacos 配置内容进行编码 |
spring.cloud.nacos.config.encode |
|
对 nacos 配置内容进行编码 |
用于 nacos 配置的组 |
spring.cloud.nacos.config.group |
DEFAULT_GROUP |
用于 nacos 配置的组 |
nacos config dataId 的后缀,也是配置内容的文件扩展名。 |
spring.cloud.nacos.config.fileExtension |
properties |
nacos config dataId 的后缀,也是配置内容的文件扩展名(现在支持属性或 yaml(yml)) |
从 nacos 获取配置的超时 |
spring.cloud.nacos.config.timeout |
3000 |
从 nacos 获取配置的超时 |
端点 |
spring.cloud.nacos.config.endpoint |
|
端点 |
Namespace |
spring.cloud.nacos.config.namespace |
|
Namespace |
访问密钥 |
spring.cloud.nacos.config.accessKey |
|
阿里云账号访问密钥 |
密钥 |
spring.cloud.nacos.config.secretKey |
|
阿里云账号密钥 |
Nacos 服务器的上下文路径 |
spring.cloud.nacos.config.contextPath |
|
Nacos 服务器的上下文路径 |
群集名称 |
spring.cloud.nacos.config.clusterName |
|
群集名称 |
共享配置的数据标识 |
spring.cloud.nacos.config.sharedDataids |
|
共享配置的数据 ID,由“,” 拆分 |
共享配置的动态刷新数据 ID |
spring.cloud.nacos.config.refreshableDataids |
|
共享配置的动态刷新数据 ID,拆分为“,” |
自定义数据标识 |
spring.cloud.nacos.config.extConfig |
|
这是一个列表,由POJO建立,具有3个属性,并且Config Config dataId group refresh |
5. Spring Cloud阿里巴巴哨兵
5.1. 哨兵简介
随着微服务的普及,服务调用的稳定性变得越来越重要。哨兵以“流量”为突破口,在流量控制、断路、负载保护等多个领域开展工作,保障业务可靠性。
哨兵具有以下功能:
-
丰富的场景:Sentinel支持阿里巴巴双11购物节的关键场景超过10年,如秒杀(即控制流量的突然爆发,使其在系统容量的可接受范围内)、消息负载转移、不可靠的下游应用的熔断等。
-
全面的实时监控:Sentinel 提供实时监控功能。您可以以秒级的精度查看服务器的监控数据,甚至是节点数少于 500 的集群的整体运行时状态。
-
广泛的开源生态系统:Sentinel 提供了开箱即用的模块,可以轻松地与其他开源框架/库集成,例如 Spring Cloud、Dubbo 和 gRPC。要使用 Sentinel,你只需要引入相关的依赖关系,做一些简单的配置。
- 声音SPI扩展:Sentinel提供易于使用的声音SPI扩展接口。您可以使用 SPI 扩展快速自定义逻辑,例如,您可以定义自己的规则管理,或适应特定的数据源。
5.2. 如何使用哨兵
如果要在项目中使用 Sentinel,请使用组 ID 为 的初学者和工件 ID 作为的启动器。com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
以下是如何使用 Sentinel 的简单示例:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
@RestController
public class TestController {
@GetMapping(value = "/hello")
@SentinelResource("hello")
public String hello() {
return "Hello Sentinel";
}
}
@SentinelResource注释用于标识资源是否受速率限制或降级。在上面的示例中,注释的“hello”属性引用资源名称。
@SentinelResource还提供属性,例如,和,以识别速率限制或降级操作。有关更多详细信息,请参阅Sentinel 注释支持。blockHandler
blockHandlerClass
fallback
上面的例子都在WebServlet环境中使用。Sentinel 目前支持 WebFlux,需要与依赖关系配合,在 sentinel starter 中触发与 WebFlux 相关的自动化配置。spring-boot-starter-webflux
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
@RestController
public class TestController {
@GetMapping("/mono")
@SentinelResource("hello")
public Mono<String> mono() {
return Mono.just("simple string")
.transform(new SentinelReactorTransformer<>("otherResourceName"));
}
}
哨兵仪表板
Sentinel 仪表板是一个轻量级控制台,提供计算机发现、单服务器资源监控、群集资源数据概览以及规则管理等功能。要使用这些功能,您只需完成几个步骤。
注意:集群统计概述仅支持节点数小于 500 的集群,延迟约为 1 到 2 秒。
图3.哨兵仪表板
要使用 Sentinel 仪表板,只需完成以下 3 个步骤。
获取仪表板
您可以从发布页面下载最新的仪表板 JAR 文件。
您还可以获取最新的源代码来构建自己的 Sentinel 仪表板:
- 下载仪表板项目。
- 运行以下命令,将代码打包到 FatJar 中:
mvn clean package
启动仪表板
Sentinel 仪表板是一个标准的 SpringBoot 应用程序,您可以在 Spring Boot 模式下运行 JAR 文件。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如果与 8080 端口冲突,则可以使用 定义新端口。-Dserver.port=new port
5.2.2. 配置仪表板
应用程序.yml
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
中指定的端口号将在应用程序的相应服务器上启动 HTTP 服务器,并且此服务器将与 Sentinel 仪表板交互。例如,如果在 Sentinel 仪表板中添加了速率限制规则,则规则数据将被推送到 HTTP 服务器并由 HTTP 服务器接收,而 HTTP 服务器又会将规则注册到 Sentinel。spring.cloud.sentinel.transport.port
有关 Sentinel 仪表板的更多信息,请参阅Sentinel 仪表板。
5.3. 开放伪装支持
Sentinel与OpenFeign组件兼容。要使用它,除了引入依赖项外,还要完成以下 2 个步骤:sentinel-starter
- 在属性文件中启用对假装的 Sentinel 支持。
feign.sentinel.enabled=true
- 添加依赖项以触发并启用:
openfeign starter
sentinel starter
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这是以下的简单用法:FeignClient
@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);
}
class FeignConfiguration {
@Bean
public EchoServiceFallback echoServiceFallback() {
return new EchoServiceFallback();
}
}
class EchoServiceFallback implements EchoService {
@Override
public String echo(@PathVariable("str") String str) {
return "echo fallback";
}
}
注意 |
Feign 对应接口中的资源名称策略是:httpmethod:protocol://requesturl。注解中的所有属性都由 Sentinel 支持。@FeignClient |
接口中方法的相应资源名称是。echo
EchoService
GET:http://service-provider/echo/{str}
5.4. 休息模板支持
春云阿里巴巴哨兵支持使用哨兵保护服务调用。为此,您需要在构建 thebean 时添加注释。RestTemplate
@SentinelRestTemplate
RestTemplate
@Bean
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {
return new RestTemplate();
}
注解的属性支持流控制(,)和断路(,)。@SentinelRestTemplate
blockHandler
blockHandlerClass
fallback
fallbackClass
==
理论是静态方法ofor。blockHandler
fallback
blockHandlerClass
fallbackClass
方法in的参数和返回值与intinel相同,但它还有一个参数来捕获Sentinel的异常。@SentinelRestTemplate
org.springframework.http.client.ClientHttpRequestInterceptor#interceptor
BlockException
上面的方法签名应该是这样的:handleException
ExceptionUtil
public class ExceptionUtil {
public static ClientHttpResponse handleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) {
...
}
}
注意 |
当应用程序启动时,它将检查流控制或断路方法对应的注释是否存在,如果不存在,它将抛出异常。@SentinelRestTemplate |
注释的属性是可选的。@SentinelRestTemplate
当您使用被哨兵阻止时,它将返回。你可以用自己的逻辑覆盖它。我们提供处理响应。RestTemplate request block by sentinel
RestTemplate
SentinelClientHttpResponse
圣天诺 RestTemplate 为资源速率限制提供了两种粒度:
-
httpmethod:schema://host:port/path
:协议、主机、端口和路径
-
httpmethod:schema://host:port
:协议、主机和端口
注意 |
以 Http GET 为例。相应的资源名称具有两个粒度级别,并且。https://www.taobao.com/test GET:https://www.taobao.com GET:https://www.taobao.com/test |
5.5. 动态数据源支持
SentinelProperties
提供属性以配置数据源。datasource
例如,配置 4 个数据源:
spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
#spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
#spring.cloud.sentinel.datasource.ds1.file.data-type=custom
#spring.cloud.sentinel.datasource.ds1.file.converter-class=JsonFlowRuleListConverter
#spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
spring.cloud.sentinel.datasource.ds2.nacos.server-addr=127.0.0.1:8848
spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel
spring.cloud.sentinel.datasource.ds2.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=degrade
spring.cloud.sentinel.datasource.ds3.zk.path = /Sentinel-Demo/SYSTEM-CODE-DEMO-FLOW
spring.cloud.sentinel.datasource.ds3.zk.server-addr = localhost:2181
spring.cloud.sentinel.datasource.ds3.zk.rule-type=authority
spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application
spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = sentinel
spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = test
spring.cloud.sentinel.datasource.ds4.apollo.rule-type=param-flow
此方法遵循内部用于存储的弹簧云流 Binder.is 的配置,比较器是。TreeMap
String.CASE_INSENSITIVE_ORDER
注意 |
D1,DS2,DS3,DS4是的名称,可以根据需要进行编码。,,,指特定数据源。它们后面的配置是这些数据源的特定配置。ReadableDataSource file zk nacos apollo |
每个数据源都有 3 个常见的配置项:,和。data-type
converter-class
rule-type
data-type
指。春云阿里巴巴哨兵默认提供两个嵌入值:and(如果未指定,默认为 json)。如果不想使用嵌入式器,也可以填写表示你将定义自己的嵌入器,然后进行配置。您需要为此配置指定类的完整路径。Converter
json
xml
json
xml
Converter
custom
Converter
converter-class
rule-type
指数据源 (,,,,,,) 中的规则类型。flow
degrade
authority
system
param-flow
gw-flow
gw-api-group
注意 |
默认情况下不支持 XML 格式。要使其有效,您需要添加依赖项。jackson-dataformat-xml |
若要详细了解动态数据源在 Sentinel 中的工作方式,请参阅动态规则扩展。
5.6. 支持弹簧云网关
参考API 网关流控制
如果要将 Sentinel Starter 与 Spring Cloud Gateway 一起使用,则需要添加依赖关系并添加依赖项,让模块中的 Spring Cloud Gateway AutoConfiguration 类生效:spring-cloud-alibaba-sentinel-gateway
spring-cloud-starter-gateway
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
5.7. 断路器:带哨兵和配置哨兵断路器的弹簧云断路器
5.7.1. 默认配置
要为所有断路器提供默认配置,请创建传递 aor 的 abean。 该方法可用于提供默认配置。Customizer
SentinelCircuitBreakerFactory
ReactiveSentinelCircuitBreakerFactory
configureDefault
@Bean
public Customizer<SentinelCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new SentinelConfigBuilder(id)
.build());
}
您可以选择通过以下方式提供默认熔断规则。 您还可以选择稍后使用 Sentinel 的 API 或通过 Sentinel 仪表板在其他地方加载断路规则。SentinelConfigBuilder#rules(rules)
DegradeRuleManager.loadRules(rules)
反应式示例
@Bean
public Customizer<ReactiveSentinelCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new SentinelConfigBuilder(id)
.build());
}
5.7.2. 特定断路器配置
与提供默认配置类似,您可以创建传递 a 的 abean。Customizer
SentinelCircuitBreakerFactory
@Bean
public Customizer<SentinelCircuitBreakerFactory> slowCustomizer() {
String slowId = "slow";
List<DegradeRule> rules = Collections.singletonList(
new DegradeRule(slowId).setGrade(RuleConstant.DEGRADE_GRADE_RT)
.setCount(100)
.setTimeWindow(10)
);
return factory -> factory.configure(builder -> builder.rules(rules), slowId);
}
反应式示例
@Bean
public Customizer<ReactiveSentinelCircuitBreakerFactory> customizer() {
List<DegradeRule> rules = Collections.singletonList(
new DegradeRule().setGrade(RuleConstant.DEGRADE_GRADE_RT)
.setCount(100)
.setTimeWindow(10)
);
return factory -> factory.configure(builder -> builder.rules(rules), "foo", "bar");
}
5.8. 哨兵端点
Sentinel 在内部提供了一个终结点,其对应的终结点 ID 为 。sentinel
终结点公开的 json 包含多个属性:
- 应用程序名称:应用程序名称
- logDir:日志目录
- logUsePid:带有 pid ot not 的日志名称
- 阻止页面:在哨兵阻止后重定向页面
- 指标文件大小:指标文件的大小
- 指标文件字符集:指标文件字符集
- 总指标文件计数:指标文件的总文件计数
- 控制台服务器:哨兵仪表板地址
- 客户端 IP:客户端 IP
- 检测信号间隔Ms:具有仪表板的客户端检测信号间隔
- 客户端端口:客户端需要公开端口才能与仪表板交互
- 冷因子:冷因子
- filter:与 CommonFilter 相关的属性,例如 order、urlPatterns 和enable
- 数据源:客户端的数据源配置信息
- 规则:客户端内部生效的规则包含flowRules、degradRules、systemRules、authorityRule、paramFlowRule
下面显示了服务实例如何访问终结点:
{
"blockPage": null,
"appName": "sentinel-example",
"consoleServer": "localhost:8080",
"coldFactor": "3",
"rules": {
"flowRules": [{
"resource": "GET:http://www.taobao.com",
"limitApp": "default",
"grade": 1,
"count": 0.0,
"strategy": 0,
"refResource": null,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500,
"clusterMode": false,
"clusterConfig": null
}, {
"resource": "/test",
"limitApp": "default",
"grade": 1,
"count": 0.0,
"strategy": 0,
"refResource": null,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500,
"clusterMode": false,
"clusterConfig": null
}, {
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 1.0,
"strategy": 0,
"refResource": null,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500,
"clusterMode": false,
"clusterConfig": null
}]
},
"metricsFileCharset": "UTF-8",
"filter": {
"order": -2147483648,
"urlPatterns": ["/*"],
"enabled": true
},
"totalMetricsFileCount": 6,
"datasource": {
"ds1": {
"file": {
"dataType": "json",
"ruleType": "FLOW",
"converterClass": null,
"file": "...",
"charset": "utf-8",
"recommendRefreshMs": 3000,
"bufSize": 1048576
},
"nacos": null,
"zk": null,
"apollo": null,
"redis": null
}
},
"clientIp": "30.5.121.91",
"clientPort": "8719",
"logUsePid": false,
"metricsFileSize": 52428800,
"logDir": "...",
"heartbeatIntervalMs": 10000
}
5.9. 配置
下表显示,当有相应的 Bean 类型时,将采取一些操作:ApplicationContext
现有 Bean 类型 |
行动 |
功能 |
UrlCleaner |
WebCallbackManager.setUrlCleaner(urlCleaner) |
资源清理(资源(例如,将 /foo/:id 的所有 URL 分类到 /foo/* 资源)) |
UrlBlockHandler |
WebCallbackManager.setUrlBlockHandler(urlBlockHandler) |
自定义速率限制逻辑 |
RequestOriginParser |
WebCallbackManager.setRequestOriginParser(requestOriginParser) |
设置原点 |
春云阿里巴巴哨兵的所有配置如下表所示:
配置 |
描述 |
默认值 |
spring.application.name 或project.name |
哨兵项目名称 |
|
spring.cloud.sentinel.enabled |
圣天诺自动配置是否生效 |
真 |
spring.cloud.sentinel.eager |
是否提前触发哨兵初始化 |
假 |
spring.cloud.sentinel.transport.port |
应用程序与 Sentinel 仪表板交互的端口。使用此端口的 HTTP 服务器将在应用程序中启动 |
8719 |
spring.cloud.sentinel.transport.dashboard |
哨兵仪表板地址 |
|
spring.cloud.sentinel.transport.heartbeatIntervalMs |
应用程序和 Sentinel 仪表板之间的侦听间隔 |
|
spring.cloud.sentinel.transport.client-ip |
此配置的客户端 IP 将注册到 Sentinel 服务器端。 |
|
spring.cloud.sentinel.filter.order |
Servlet 过滤器的加载顺序。过滤器将在启动器中构建 |
Integer.MIN_VALUE |
spring.cloud.sentinel.filter.url-patterns |
数据类型为数组。指 Servlet Filter ULR 模式的集合 |
/* |
spring.cloud.sentinel.filter.enabled |
启用实例公共筛选器 |
真 |
spring.cloud.sentinel.metric.charset |
公制文件字符集 |
UTF-8 |
spring.cloud.sentinel.metric.fileSingleSize |
哨兵度量单个文件大小 |
|
spring.cloud.sentinel.metric.fileTotalCount |
哨兵指标文件总数 |
|
spring.cloud.sentinel.log.dir |
哨兵日志文件目录 |
|
spring.cloud.sentinel.log.switch-pid |
如果 Sentinel 日志文件名需要 PID |
假 |
spring.cloud.sentinel.servlet.blockPage |
自定义重定向 URL。当速率受限时,请求将被重定向到预定义的URL |
|
spring.cloud.sentinel.flow.coldFactor |
冷因子 |
3 |
spring.cloud.sentinel.scg.fallback.mode |
Spring Cloud Gateway 断路后的响应模式(选择器redirect response ) |
|
spring.cloud.sentinel.scg.fallback.redirect |
春云网关响应模式是对应的“重定向”模式 |
|
spring.cloud.sentinel.scg.fallback.response-body |
Spring 云网关响应模式是“响应”模式对应的响应内容 |
|
spring.cloud.sentinel.scg.fallback.response-status |
Spring 云网关响应模式是“响应”模式对应的响应代码 |
429 |
spring.cloud.sentinel.scg.fallback.content-type |
Spring 云网关响应模式是对应于“响应”模式的内容类型。 |
应用程序/JSON |
注意 |
这些配置只会在 servlet 环境中生效。RestTemplate 和 Feign 不会对这些配置生效。
|
6. Spring Cloud阿里巴巴火箭MQ活页夹
6.1. 火箭MQ的介绍
RocketMQ是一个开源的分布式消息系统。基于高可用分布式集群技术,提供低时延、高稳定性的消息发布和订阅服务。RocketMQ广泛应用于异步通信解耦、企业解决方案、金融结算、电信、电子商务、物流、营销、社交媒体、即时通讯、移动应用、手机游戏、视频、物联网、车联网等多种行业。
它具有以下功能:
- 消息发送和使用顺序严格
- 丰富的消息拉取模式
- 消费者的水平可扩展性
- 实时消息订阅
- 亿级消息聚合能力
6.2. 火箭MQ的使用
下载RocketMQ 的最新二进制文件,并解压。
解压目录如下:
apache-rocketmq
├── LICENSE
├── NOTICE
├── README.md
├── benchmark
├── bin
├── conf
└── lib
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
发送消息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
消息发送成功时的输出:SendResult [sendStatus=SEND_OK, msgId= …
接收消息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
成功接收消息时的输出:ConsumeMessageThread_%d Receive New Messages: [MessageExt…
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
6.3. Spring Cloud流简介
Spring Cloud Stream是一个微服务框架,用于基于消息构建架构。它可以帮助您基于SpringBoot创建生产就绪的单服务器Spring应用程序,并使用Broker连接。Spring Integration
Spring Cloud Stream 提供了消息中间件配置的统一抽象,并提出了发布-订阅、消费者组和分区等概念。
春云流有两个概念:绑定器和绑定
- 绑定器:用于与外部消息中间件集成的组件,用于创建绑定。不同的消息中间件产品有自己的绑定器实现。
例如,使用,使用,同时使用。Kafka
KafkaMessageChannelBinder
RabbitMQ
RabbitMessageChannelBinder
RocketMQ
RocketMQMessageChannelBinder
绑定充当消息中间件与应用程序的提供者和使用者之间的桥梁。开发人员只需要使用提供者或使用者来生成或使用数据,无需担心与消息中间件的交互。
图4.春云溪
现在我们来用春云流写一个简单的代码来收发消息:
MessageChannel messageChannel = new DirectChannel();
// Message subscription
((SubscribableChannel) messageChannel).subscribe(new MessageHandler() {
@Override
public void handleMessage(Message<? > message) throws MessagingException {
System.out.println("receive msg: " + message.getPayload());
}
});
// Message sending
messageChannel.send(MessageBuilder.withPayload("simple msg").build());
此代码中的所有消息类型都由“spring-messaging”模块提供。它屏蔽了消息中间件的下层实现。如果要更改消息中间件,只需在配置文件中配置相关的消息中间件信息,修改绑定器依赖。
Spring Cloud Stream 的下层也基于前面的代码实现了各种代码抽象。
6.4. 如何使用Spring Cloud阿里巴巴 RocketMQ 绑定器
要使用Spring Cloud Alibaba RocketMQ Binder,您只需使用以下Maven坐标将其添加到Spring Cloud Stream应用程序中:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rocketmq</artifactId>
</dependency>
或者,您也可以使用 Spring Cloud Stream RocketMQ Starter:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
6.5. Spring Cloud阿里巴巴 RocketMQ 活页夹的工作原理
这是Spring Cloud Stream RocketMQ Binder的实现架构:
RocketMQ Binder的实现依赖于RocketMQ-Spring框架。
RocketMQ Spring 框架是 RocketMQ 和 Spring Boot 的集成。它提供三个主要功能:
-
RocketMQTemplate
:发送消息,包括同步、异步和事务消息。
-
@RocketMQTransactionListener
:侦听并检查事务消息。
-
@RocketMQMessageListener
:使用消息。
RocketMQMessageChannelBinder
是 Binder 的标准实现,它将在内部构建。RocketMQInboundChannelAdapter
RocketMQMessageHandler
RocketMQMessageHandler
将基于绑定配置进行构造,将模块的消息类转换为 RocketMQ 消息类内部,然后将其发送出去。RocketMQTemplate
RocketMQTemplate
org.springframework.messaging.Message
spring-messaging
org.apache.rocketmq.common .message.Message
RocketMQInboundChannelAdapter
还将基于绑定配置进行构造,并将启动 RocketMQ 来接收消息。RocketMQListenerBindingContainer
RocketMQListenerBindingContainer
Consumer
注意 |
RocketMQ Binder Application 也可用于配置 rocketmq.** 以触发 RocketMQ Spring 相关的自动配置
|
目前,Binder 支持将相关密钥设置为设置 RocketMQ 消息的属性。Header
例如,,,,,,表示与 RocketMQ 消息对应的标签。TAGS
DELAY
TRANSACTIONAL_ARG
KEYS
WAIT_STORE_MSG_OK
FLAG
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(RocketMQHeaders.TAGS, "binder")
.setHeader(RocketMQHeaders.KEYS, "my-key")
.setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");
Message message = builder.build();
output().send(message);
或使用 StreamBridge
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(RocketMQHeaders.TAGS, "binder")
.setHeader(RocketMQHeaders.KEYS, "my-key")
.setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");
Message message = builder.build();
streamBridge.send("producer-out-0", message);
6.6. 配置选项
6.6.1. 火箭MQ 绑定器属性
spring.cloud.stream.rocketmq.binder.name 服务器
RocketMQ 服务器的名称服务器(旧版本使用 namerv-addr 配置项)。
违约:。127.0.0.1:9876
spring.cloud.stream.rocketmq.binder.access-key
阿里云账号的访问密钥。
默认值:空。
spring.cloud.stream.rocketmq.binder.secret-key
阿里云账号的密钥。
默认值:空。
spring.cloud.stream.rocketmq.binder.enable-msg-trace
为所有生产者和使用者启用邮件跟踪功能。
违约:。true
spring.cloud.stream.rocketmq.binder.customized-trace-topic
邮件跟踪的跟踪主题。
违约:。RMQ_SYS_TRACE_TOPIC
spring.cloud.stream.rocketmq.binder.access-channel
商业版rocketmq消息轨迹主题自适应,值为CLOUD。
默认值:空。
6.6.2. 火箭MQ 消费者属性
以下属性仅适用于 RocketMQ 生产者,并且必须带有前缀。spring.cloud.stream.rocketmq.bindings.<channelName>.consumer.
使
启用使用者绑定。
违约:。true
标签
消费者订阅标签表达式,标签拆分依据。||
默认值:空。
.sql
消费者订阅 sql 表达式。
默认值:空。
广播
控制消息模式,如果希望所有订阅者都收到消息全部消息,广播是一个不错的选择。
违约:。false
有序
并发或有序接收消息。
违约:。false
延迟级别何时下一次消费
并发使用的消息使用重试策略:
- -1,无需重试,直接放入DLQ
- 0,代理控制重试频率
- >0,客户端控制重试频率
违约:。0
suspendCurrentQueueTimeMillis
消息消费重试的时间间隔,以便有序使用。
违约:。1000
6.6.3. 火箭MQ 提供程序属性
以下属性仅适用于 RocketMQ 生产者,并且必须带有前缀。spring.cloud.stream.rocketmq.bindings.<channelName>.producer.
使
启用生产者绑定。
违约:。true
群
生产者组名称。
默认值:空。
最大消息大小
允许的最大邮件大小(以字节为单位)。
违约:。8249344
事务
发送事务性消息。
违约:。false
同步
以同步模式发送消息。
违约:。false
贵宾通道启用
使用VIP频道发送消息。
违约:。true
发送消息超时
发送消息超时的米利斯。
违约:。3000
压缩消息正文阈值
压缩消息体阈值,即默认压缩大于 4k 的消息正文。
违约:。4096
重试时间发送失败时
在同步模式下声明发送失败之前在内部执行的最大重试次数。
违约:。2
retryTimesWhenSendAsyncFailed
在异步模式下声明发送失败之前在内部执行的最大重试次数。
违约:。2
重试下一页服务器
指示是否在内部发送失败时重试另一个代理。
违约:。false
7. Spring Cloud阿里云ANS
ANS(应用程序命名服务)是 EDAS 的一个组件。Spring Cloud 阿里云 ANS 提供符合 Spring Cloud 规范的商业版服务注册和发现,以便您可以在本地开发应用程序并在云上运行它们。
注意 |
EDAS 目前支持直接部署 Nacos 发现应用
|
7.1. 如何引入Spring Cloud阿里云ANS
如果要在项目中使用 ANS,请使用组 ID 为 的初学者和工件 ID 作为的初学者。com.alibaba.cloud
spring-cloud-starter-alicloud-ans
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-ans</artifactId>
</dependency>
7.2. 使用 ANS 注册服务
当在客户端引入Spring Cloud阿里云ANS入门时,服务的IP、端口号、微权等元数据将自动注册到注册中心。客户端将与服务器保持检测信号,以证明它能够正确提供服务。
下面是一个简单的插图。
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ProviderApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
由于服务将注册到注册中心,因此我们需要配置注册中心的地址。我们还需要在 application.properties 中添加以下地址。
# The application name will be used as the service name, therefore it is mandatory.
spring.application.name=ans-provider
server.port=18081
# The following is the IP and port number of the registration center.
spring.cloud.alicloud.ans.server-list=127.0.0.1
spring.cloud.alicloud.ans.server-port=8080
注意 |
到目前为止,注册中心尚未启动,因此如果您的应用程序已启动,您将收到一条错误消息。因此,请在开始申请之前启动注册中心。
|
7.3. 启动注册中心
ANS 使用两种类型的注册中心。一个是免费的轻量级配置中心,另一个是云上的注册中心,通过 EDAS 提供。一般可以使用轻量级版本进行应用开发和本地测试,使用 EDAS 进行金丝雀部署或生产。
7.3.1. 启动轻量级配置中心
有关如何下载和安装轻量级配置中心的详细信息,请参阅配置轻量配置中心。
注意 |
您只需要执行步骤1(下载轻量级配置中心)和步骤2(启动轻量级配置中心)。如果同时使用 ANS,则不需要步骤 3(配置主机)。
|
启动轻量级配置中心后,直接启动提供程序应用程序,即可将服务注册到配置中心。轻量级配置中心的默认端口为 8080,因此您可以打开http://127.0.0.1:8080,单击左侧的“服务”,查看已注册的服务。
7.3.2. 云上的用户注册中心
在云上使用注册中心可以使您免于繁琐的服务器维护工作,同时提供更好的稳定性。使用云上的注册中心和轻量级配置中心在代码级别没有区别,但在配置上存在一些差异。
以下是在云上使用注册中心的简单示例。
# The application name will be used the service name, and is therefore mandatory.
spring.application.name=ans-provider
# Configure your own port number
server.port=18081
# The following is the IP and port number of the configuration center. The default value is 127.0.0.1 and 8080, so the following lines can be omitted.
spring.cloud.alicloud.ans.server-mode=EDAS
spring.cloud.alicloud.access-key=Your Alibaba Cloud AK
spring.cloud.alicloud.secret-key=Your Alibaba Cloud SK
spring.cloud.alicloud.edas.namespace=cn-xxxxx
服务器模式的默认值为本地。如果您想在云端使用注册中心,则需要将其更改为 EDAS。
访问密钥和密钥是您阿里云账号的AK/SK。首先注册阿里云账号,然后登录云控制台阿里云AK/SK复制您的访问密钥ID和访问密钥密钥。如果您尚未创建,请单击“创建访问密钥”按钮。
命名空间是 EDAS 中的一个概念,用于隔离环境,例如测试环境和生产环境。要查找您的命名空间,请先点击注册 EDAS。在即用即付模式下,您无需付费。然后登录EDAS 控制台,您将能够看到您的命名空间,例如 cn-杭州。
注意 |
EDAS 提供应用托管服务,会自动为托管应用填写所有配置。
|
8. Spring Cloud阿里云ACM
Spring Cloud阿里云ACM是春云客户端商业产品应用配置管理(ACM)的实现,是免费的。
使用Spring CloudSpring Cloud云ACM快速访问基于春云编程模型的ACM配置管理能力。
注意 |
目前 EDAS 已经支持 Nacos 配置应用的直接部署。
|
8.1. 如何引入Spring Cloud阿里云ACM
如果要在项目中使用 ACM,请使用组 ID 为 和工件 ID 的初学者。com.alibaba.cloud
spring-cloud-starter-alicloud-acm
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-acm</artifactId>
</dependency>
8.2. 使用 ACM 管理配置
当 Spring Cloud 阿里云 ACM Starter 引入客户端时,应用程序会在启动时自动从配置管理服务器获取配置信息,并将配置注入 Spring 环境。
下面是一个简单的插图。
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" +userName+"; age: "+userAge);
}
}
由于我们需要从配置服务器获取配置信息,因此我们需要配置服务器的地址。我们还需要在 bootstrap.properties 中添加以下信息。
# Required. The application name will be used as part of the keyword to get the configuration key from the server.
spring.application.name=acm-config
server.port=18081
# The following is the IP and port number of the configuration server.
spring.cloud.alicloud.acm.server-list=127.0.0.1
spring.cloud.alicloud.acm.server-port=8080
注意 |
到目前为止,配置中心尚未启动,因此如果应用程序已启动,您将收到一条错误消息。因此,请在启动应用程序之前启动配置中心。
|
8.2.1. 启动配置中心
ACM 使用两种类型的配置中心。一个是轻量级配置中心,另一个是阿里云上使用的 ACM。通常,您可以使用轻量级版本进行应用程序开发和本地测试,并使用 ACM 进行 Canary 部署或生产。
使用轻量配置中心
有关如何下载和安装轻量级配置中心的详细信息,请参阅配置轻量配置中心。
注意 |
您只需要执行步骤1(下载轻量级配置中心)和步骤2(启动轻量级配置中心)。
|
在阿里云上使用 ACM
在云上使用 ACM 可以使您免于繁琐的服务器维护工作,同时提供更好的稳定性。在云上使用 ACM 和轻量级配置中心在代码级别没有区别,但在配置上存在一些差异。
以下是使用 ACM 的简单示例。您可以在ACM 控制台上查看配置详细信息
# The application name will be used as part of the keyword to obtain configuration key from the server, and is mandatory.
spring.application.name=acm-config
# Configure your own port number
server.port=18081
# The following is the IP and port number of the configuration center.
spring.cloud.alicloud.acm.server-mode=EDAS
spring.cloud.alicloud.access-key=Your Alibaba Cloud AK
spring.cloud.alicloud.secret-key=Your Alibaba Cloud SK
spring.cloud.alicloud.acm.endpoint=acm.aliyun.com
spring.cloud.alicloud.acm.namespace=Your ACM namespace(You can find the namespace on the ACM console)
注意 |
EDAS 提供应用托管服务,会自动为托管应用填写所有有关 ACM 的配置。
|
8.2.2. 在配置中心添加配置
- 启动轻量级配置中心后,在控制台添加以下配置。
Group: DEFAULT_GROOUP
DataId: acm-config.properties
Content: user.name=james
user.age=18
注意 |
dataId 的格式是。“前缀”默认从 spring.application.name 获取,“文件扩展名”的值默认为“属性”。{prefix}. {file-extension} |
8.2.3. 开始应用验证
从以下示例开始,您可以看到控制台上打印的值是我们在轻量级配置中心配置的值。
user name :james; age: 18
8.3. 修改配置文件扩展名
在 spring-cloud-starter-alicloud-acm 中 dataId 的默认文件扩展名是属性。除了属性之外,还支持 yaml。 您可以使用spring.cloud.alicloud.acm.file-extension设置文件扩展名。只需将其设置为“yml”对于yaml格式。yaml
注意 |
更改文件扩展名后,需要在配置中心的 DataID 和内容中进行相应的格式更改。
|
8.4. 动态配置刷新
春云-云启动器-阿里云-ACM支持动态配置更新。Spring 中的 RefreshEvent 是在配置中心更新配置时发布的。 所有带有@RefreshScope和@ConfigurationProperties注释的类将自动刷新。
注意 |
您可以通过此设置禁用自动刷新:spring.cloud.alicloud.acm.refresh.enabled=false
|
8.5. 配置配置文件粒度
当配置由 spring-cloud-starter-alicloud-acm 加载时,使用 DataId {spring.application.name} 进行配置。{文件扩展名}将首先加载。如果 spring.profiles.active 中有内容,则 spring.profile 的内容,以及 dataid 格式为 {spring.application.name}-{profile} 的配置。{文件扩展名}也会依次加载,后者的优先级更高。
spring.profiles.active 是配置元数据,也应该在 bootstrap.properties 或 bootstrap.yaml 中进行配置。例如,您可以在 bootstrap.properties 中添加以下内容。
spring.profiles.active={profile-name}
注意:您还可以通过 JVM 参数(例如 -Dspring.profiles.active=development 或 --spring.profiles.active=develop)来配置粒度,这些参数具有更高的优先级。只需遵循Spring Boot的规格即可。
8.6. 支持自定义 ACM 超时
ACM 客户端从服务器获取配置的默认超时为 3000 毫秒。如果需要定义超时,设置配置,单位为毫秒。spring.cloud.alicloud.acm.timeout
8.7. 支持自定义组配置
定义 noconfiguration 时,默认情况下使用 DEFAULT_GROUP。如果需要定义自己的组,可以使用以下方法:{spring.cloud.alicloud.acm.group}
spring.cloud.alicloud.acm.group=DEVELOP_GROUP
注意 |
此配置必须放在 bootstrap.properties 文件中,并且 Group 的值必须与 的值相同。spring.cloud.alicloud.acm.group |
8.7.1. 支持共享配置
ACM 提供了一种在多个应用程序之间共享相同配置的解决方案。您可以通过在引导程序中添加配置来执行此操作。spring.application.group
spring.application.group=company.department.team
然后,应用程序将依次从以下 DataId 检索配置,然后再检索自己的配置:company:application.properties、company.Department:application.properties、company.Department.team:application.properties。 之后,它还从 {spring.application.group} 检索配置:{spring.application.name}。{文件扩展名} 顺序越晚,优先级越高,应用程序本身的唯一配置具有最高优先级。
注意 |
DataId 的默认后缀是 properties,您可以使用 spring.cloud.alicloud.acm.file-extension..{spring.application.group}: {spring.application.name}. {file-extension} |
注意 |
如果配置了,则 的 DataId 格式也受支持,并且优先级高于spring.profiles.active {spring.application.group}: {spring.application.name}-{spring.profiles.active}. {file-extension} {spring.application.group}: {spring.application.name}. {file-extension} |
8.8. 执行器端点
ACM的执行器终端节点是,表示ACM元数据配置信息,对应从ACM服务器获取的配置信息和上次刷新时间,对应动态刷新历史。/acm
config
runtime.sources
runtime.refreshHistory
9. Spring Cloud阿里云OSS
OSS(对象存储服务)是阿里云上的存储产品。Spring Cloud 阿里云 OSS 提供符合 Spring Cloud 规范的商业化存储服务。我们提供易于使用的API,并支持在Spring框架中集成Resource。
9.1. 如何引入Spring Cloud阿里云 OSS
我们已经发布了Spring Cloud Alibaba版本0.2.1。您需要先添加依赖项管理 POM。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接下来我们需要介绍Spring Cloud阿里云OSS入门版。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>
9.2. 如何使用开放源码软件接口
9.2.1. 配置OSS
在开始使用春云阿里云OSS之前,请在app.properties中添加以下配置。
spring.cloud.alicloud.access-key=Your Alibaba Cloud AK
spring.cloud.alicloud.secret-key=Your Alibaba Cloud SK
spring.cloud.alicloud.oss.endpoint=***.aliyuncs.com
访问密钥和私有密钥是您的阿里云账号的AK/SK。如果您没有账号,请先注册一个账号,然后登录阿里云AK/SK管理获取您的访问密钥ID和访问密钥密钥。如果您尚未创建访问密钥,请单击“创建访问密钥”以创建一个。
有关终端节点信息,请参考 OSS文档,获取您所在地区的终端节点。
9.2.2. 开放源码软件接口简介
Spring 云阿里云 OSS 的 OSS API 基于 OSS 官方 SDK,包含上传、下载、查看文件的 API。
下面是一个使用 OSS API 的简单应用程序。
@SpringBootApplication
public class OssApplication {
@Autowired
private OSS ossClient;
@RequestMapping("/")
public String home() {
ossClient.putObject("bucketName", "fileName", new FileInputStream("/your/local/file/path"));
return "upload success";
}
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(OssApplication.class, args);
}
}
在上传文件之前,请先注册阿里云账号。如果您已经有OSS,请注册OSS。
登录OSS控制台,单击“新建存储空间”,按照提示创建存储空间。将之前代码的“存储桶名称”中的存储桶名称替换为新的存储桶名称。“文件名”可以是你喜欢的任何名称,“/your/local/file/path”可以是任何本地文件路径。接下来,您可以运行 'curl http://127.0.0.1:port number/上传文件,您将在OSS 控制台看到您的文件。
有关 OSS API 的更多说明,请参阅OSS SDK 文档。
9.3. 与 Spring 的资源规范集成
Spring 云阿里云 OSS 集成了 Spring 资源框架,让您轻松使用 OSS 资源。
下面是如何使用资源的一个简单示例。
@SpringBootApplication
public class OssApplication {
@Value("oss://bucketName/fileName")
private Resource file;
@GetMapping("/file")
public String fileResource() {
try {
return "get file resource success. content: " + StreamUtils.copyToString(
file.getInputStream(), Charset.forName(CharEncoding.UTF_8));
} catch (Exception e) {
return "get resource fail: " + e.getMessage();
}
}
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(OssApplication.class, args);
}
}
注意 |
上述示例的前提是,OSS上需要有一个名为“bucketName”的存储桶,并且该存储桶中有一个名为“fileName”的文件。
|
9.4. 使用 STS 身份验证
除了 AccessKeys 之外,Spring Cloud 阿里云 OSS 还支持 STS 认证。STS 是一种具有临时安全令牌的身份验证方法,通常用于第三方临时访问其资源。
第三方临时访问资源,只需完成以下配置即可。
spring.cloud.alicloud.oss.authorization-mode=STS
spring.cloud.alicloud.oss.endpoint=***.aliyuncs.com
spring.cloud.alicloud.oss.sts.access-key=Your authenticated AK
spring.cloud.alicloud.oss.sts.secret-key=Your authenticated SK
spring.cloud.alicloud.oss.sts.security-token=Your authenticated ST
其中,spring.cloud.alicloud.oss.authorization-mode 是枚举类型。此处填写 STS 表示使用 STS 身份验证。有关终端节点信息,请参阅OSS 文档并填写您所在区域的终端节点。
访问密钥、密钥和安全令牌需要由身份验证端颁发。有关 STS 的详细信息,请参阅STS 文档。
9.5. 客户端的更多配置
除了基本配置外,Spring 云阿里云 OSS 还支持许多其他配置,这些配置也包含在 application.properties 文件中。
以下是一些示例。
spring.cloud.alicloud.oss.authorization-mode=STS
spring.cloud.alicloud.oss.endpoint=***.aliyuncs.com
spring.cloud.alicloud.oss.sts.access-key=Your authenticated AK
spring.cloud.alicloud.oss.sts.secret-key=Your authenticated SK
spring.cloud.alicloud.oss.sts.security-token=Your authenticated ST
spring.cloud.alicloud.oss.config.connection-timeout=3000
spring.cloud.alicloud.oss.config.max-connections=1000
更多配置请参考OSS信用配置底部的表格。
注意 |
大多数情况下,OSSClient 配置表中的参数需要用“-”连接参数名,所有字母都应为小写。例如,应将“连接超时”更改为“连接超时”。 |
10. Spring Cloud阿里云调度程序X
SchedulerX(分布式作业调度)是阿里云产品 EDAS 的一个组件。Spring Cloud 阿里云 SchedulerX 提供符合 Spring Cloud 规范的分布式作业调度。SchedulerX 提供秒级高精度、高稳定性、高可用性的定时作业调度服务,支持简单单服务器作业、简单多主机作业、脚本作业、网格作业等多种作业类型。
10.1. 如何引入Spring Cloud阿里云调度程序X
如果要在项目中使用 SchedulerX,请使用组 ID 为 的启动器,将工件 ID 设置为 。com.alibaba.cloud
spring-cloud-starter-alicloud-schedulerX
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-schedulerX</artifactId>
</dependency>
10.2. 启动调度程序X
将 Spring 云阿里云 SchedulerX Starter 引入客户端后,您只需要完成一些简单的配置,就可以自动初始化 SchedulerX 服务。
下面是一个简单的示例。
@SpringBootApplication
public class ScxApplication {
public static void main(String[] args) {
SpringApplication.run(ScxApplication.class, args);
}
}
在应用程序属性文件中添加以下配置。
server.port=18033
# cn-test is the test region of SchedulerX
spring.cloud.alicloud.scx.group-id=***
spring.cloud.alicloud.edas.namespace=cn-test
在获取组 ID 之前,请先注册阿里云账号,然后注册 EDAS和SchedulerX。
要获取组 ID,请参阅SchedulerX 文档。
10.3. 编译一个简单的作业
简单作业是最常用的作业类型。您只需要实现 ScxSimpleJobProcessor 接口。
下面是一个简单的单服务器作业的示例。
public class SimpleTask implements ScxSimpleJobProcessor {
@Override
public ProcessResult process(ScxSimpleJobContext context) {
System.out.println("-----------Hello world---------------");
ProcessResult processResult = new ProcessResult(true);
return processResult;
}
}
10.4. 作业调度
进入SchedulerX作业页面,选择“测试”区域,点击右上角的“创建作业”即可创建作业,如下图所示。
Job Group: Test——***-*-*-****
Job process interface:SimpleTask
Type: Simple Single-Server Job
Quartz Cron Expression: Default Option——0 * * * * ?
Job Description: Empty
Custom Parameters: Empty
上面的作业是“简单单服务器作业”,并指定了 Cron 表达式“0 * * * * ?” 。这意味着作业将执行一次,并且每分钟仅执行一次。
有关更多作业类型,请参阅调度程序 X 文档。
10.5. 在生产环境中的使用
前面的示例展示了如何在“Test”区域中使用 SchedulerX,该区域主要用于本地测试。
在生产级别,除了上述组 ID 和命名空间之外,还需要完成其他一些配置。请参阅以下示例:
server.port=18033
# cn-test is the test region of SchedulerX
spring.cloud.alicloud.scx.group-id=***
spring.cloud.alicloud.edas.namespace=***
# If your application runs on EDAS, you do not need to configure the following.
spring.cloud.alicloud.access-key=***
spring.cloud.alicloud.secret-key=***
# The following configurations are not mandatory. You can refer to the SchedulerX documentation for details.
spring.cloud.alicloud.scx.domain-name=***
获取 group-id 的方式与前面的示例相同,您可以通过在 EDAS 控制台左侧导航栏点击 “命名空间”获取命名空间。
访问密钥和密钥是您阿里云账号的AK/SK。如果您在 EDAS 上部署应用,则无需填写此信息。否则,请转到安全信息以获取您的访问密钥。
域名不是强制性的。您可以参考SchedulerX 文档了解详细信息。
11. Spring Cloud阿里云短信
SMS(短消息服务)是一种覆盖全球的消息服务,阿里巴巴短信提供便捷、高效、智能的通信功能,帮助企业快速联系客户。
Spring Cloud阿里云短信提供了一个更易于使用的API,用于快速访问基于Spring Cloud阿里短信的阿里云短信服务。
11.1. 如何引入Spring Cloud阿里云短信
如果要在项目中使用 SMS,请使用组 ID 和工件 ID 的启动器。com.alibaba.cloud
spring-cloud-starter-alicloud-sms
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-sms</artifactId>
</dependency>
11.2. 如何使用短信接口
11.2.1. 配置短信
在开始使用Spring Cloud阿里云短信之前,请在 application.properties 中添加以下配置。
spring.cloud.alicloud.access-key=AK
spring.cloud.alicloud.secret-key=SK
访问密钥和私有密钥是您的阿里云账号的AK/SK。如果您没有账号,请先注册一个账号,然后登录阿里云AK/SK管理获取您的访问密钥ID和访问密钥密钥。如果您尚未创建访问密钥,请单击“创建访问密钥”以创建一个。
11.2.2. 引入短信接口
Spring Cloud阿里云短信中的短信API基于阿里云短信SDK。它具有单条短信发送、多条短信群发、短信查询、短信(短信接收消息和上游短信)类操作API。
以下是如何使用短信 api 发送短消息的简单示例:
@SpringBootApplication
public class SmsApplication {
@Autowired
private ISmsService smsService;
@RequestMapping("/batch-sms-send.do")
public SendBatchSmsResponse batchsendCheckCode(
@RequestParam(name = "code") String code) {
SendSmsRequest request = new SendSmsRequest();
// Required:the mobile number
request.setPhoneNumbers("152******");
// Required:SMS-SignName-could be found in sms console
request.setSignName("******");
// Required:Template-could be found in sms console
request.setTemplateCode("******");
// Required:The param of sms template.For exmaple, if the template is "Hello,your verification code is ${code}". The param should be like following value
request.setTemplateParam("{\"code\":\"" + code + "\"}");
SendSmsResponse sendSmsResponse ;
try {
sendSmsResponse = smsService.sendSmsRequest(request);
}
catch (ClientException e) {
e.printStackTrace();
sendSmsResponse = new SendSmsResponse();
}
return sendSmsResponse ;
}
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(SmsApplication.class, args);
}
}
在发送消息之前,请先注册阿里云账号。如果您已经有一个,请打开短信服务。
有关短信的更多信息,请参阅短信官方短信(SendSms)---JAVA] 文档。
注意 |
由于早期短信SDK版本存在问题,如果短信发送失败,请删除包含显式MethodType作为POST的代码行。如果您仍有问题,请尽快与我们联系。
|
11.3. 短信 API 的高级功能
为了降低学习成本,Spring Cloud 阿里云短信包的 API 接口与官网提供的 API 和示例保持一致。
请参考以下示例,快速开发批量短信发送功能。在控制器中添加以下代码或创建新的控制器:
@RequestMapping("/batch-sms-send.do")
public SendBatchSmsResponse batchsendCheckCode(
@RequestParam(name = "code") String code) {
SendBatchSmsRequest request = new SendBatchSmsRequest();
request.setMethod(MethodType.GET);
request.setPhoneNumberJson("[\"177********\",\"130********\"]");
request.setSignNameJson("[\"*******\",\"*******\"]");
request.setTemplateCode("******");
request.setTemplateParamJson(
"[{\"code\":\"" + code + "\"},{\"code\":\"" + code + "\"}]");
SendBatchSmsResponse sendSmsResponse ;
try {
sendSmsResponse = smsService
.sendSmsBatchRequest(request);
return sendSmsResponse;
}
catch (ClientException e) {
e.printStackTrace();
sendSmsResponse = new SendBatchSmsResponse();
}
return sendSmsResponse ;
}
注意 |
请求的 MethodType 设置为 GET,这与官网给出的示例有些不同。这是因为依赖阿里云 POP API 版本的不一致版本会导致不兼容问题,设置为 GET。
|
更多参数说明可以参考 这里
请参考以下示例,快速开发基于指定号码发送 SMS 消息的历史记录。在控制器中添加以下代码或创建新的控制器:
@RequestMapping("/query.do")
public QuerySendDetailsResponse querySendDetailsResponse(
@RequestParam(name = "tel") String telephone) {
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
request.setPhoneNumber(telephone);
request.setSendDate("20190103");
request.setPageSize(10L);
request.setCurrentPage(1L);
try {
QuerySendDetailsResponse response = smsService.querySendDetails(request);
return response;
}
catch (ClientException e) {
e.printStackTrace();
}
return new QuerySendDetailsResponse();
}
更多参数说明可在此处参考
通过订阅短信报告短信状态报告,您可以知道每条短信的状态以及它是否知道终端用户的状态和相关信息。这些努力已经通过Spring Cloud AliCloud SMS在内部进行了封装。您只需要完成以下两个步骤。
1、在配置文件(也可以是application.yaml)中配置短信报告的队列名称。application.properties
应用程序属性
spring.cloud.alicloud.sms.report-queue-name=Alicom-Queue-********-SmsReport
2、实现短信监听接口,初始化一颗春豆。
@Component
public class SmsReportMessageListener
implements SmsReportMessageListener {
@Override
public boolean dealMessage(Message message) {
//do something
System.err.println(this.getClass().getName() + "; " + message.toString());
return true;
}
}
可以在此处参考消息的更多消息正文格式。
通过订阅 SmsUp 上游短信,您可以知道最终用户回复短信的内容。这些努力也被Spring Cloud AliCloud SMS打包。您只需要完成以下两个步骤。
1、在配置文件(也可以是application.yaml)中配置短信报告的队列名称。application.properties
应用程序属性
spring.cloud.alicloud.sms.up-queue-name=Alicom-Queue-********-SmsUp
2、实现短信监听接口,初始化一个春豆。
@Component
public class SmsUpMessageListener
implements org.springframework.cloud.alicloud.sms.SmsUpMessageListener {
@Override
public boolean dealMessage(Message message) {
//do something
System.err.println(this.getClass().getName() + "; " + message.toString());
return true;
}
}