Crie uma aplicação Spring Cloud que faz upload, download e leitura de arquivos no Object Storage Service (OSS) e implante-a no Enterprise Distributed Application Service (EDAS) sem modificar o código ou a configuração.
Por que usar o OSS
OSSOSS é desenvolvido pela Alibaba Cloud para oferecer serviços de armazenamento seguros, econômicos e altamente confiáveis. Com ele, você armazena grandes volumes de dados na nuvem. O OSS disponibiliza operações RESTful API independentes de plataforma, permitindo armazenar e acessar todos os tipos de dados em aplicações desenvolvidas com Spring Cloud.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma conta da Alibaba Cloud com o OSS ativado
Um par de AccessKey (AccessKey ID e AccessKey secret) obtido na página Security Management
O endpoint do OSS para a região do seu bucket (consulte Regiões e endpoints)
JDK 8 ou posterior e Maven instalados localmente
Como funciona
O Spring Cloud AliCloud OSS integra aplicações Spring Cloud ao Alibaba Cloud OSS. Após adicionar a dependência do starter e configurar suas credenciais, você pode:
Injetar um cliente
OSSdiretamente nos seus Spring beansAcessar objetos OSS como instâncias Spring
Resourceusando@Value("oss://...")Implantar a mesma aplicação no EDAS sem modificar o código ou a configuração
Configurar o projeto Maven
Crie um projeto Maven chamado
oss-example.Adicione as seguintes dependências ao
pom.xml:O Spring Boot 1.x chegou ao fim do ciclo de vida. Se for necessário usar o Spring Boot 1.x, use a versão 1.5.x com Spring Cloud Edgware e Spring Cloud Alibaba 1.5.1.RELEASE.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>Crie um pacote chamado
spring.cloud.alicloud.ossemsrc/main/java.
Criar o ponto de entrada da aplicação
Crie a classe de inicialização OssApplication no pacote spring.cloud.alicloud.oss. Ao iniciar, ela verifica se o bucket de destino existe e o cria, se necessário.
package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.net.URISyntaxException;
@SpringBootApplication
public class OssApplication {
// Replace with your actual bucket name
public static final String BUCKET_NAME = "test-bucket";
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(OssApplication.class, args);
}
@Bean
public AppRunner appRunner() {
return new AppRunner();
}
class AppRunner implements ApplicationRunner {
@Autowired
private OSS ossClient;
@Override
public void run(ApplicationArguments args) throws Exception {
try {
if (!ossClient.doesBucketExist(BUCKET_NAME)) {
ossClient.createBucket(BUCKET_NAME);
}
} catch (Exception e) {
System.err.println("oss handle bucket error: " + e.getMessage());
System.exit(-1);
}
}
}
}Adicionar um arquivo de exemplo
Crie um arquivo chamado oss-test.json em src/main/resources:
{
"name": "oss-test"
}Criar o controlador REST
Crie o OssController no pacote spring.cloud.alicloud.oss. Esse controlador expõe três endpoints para upload, download e leitura de arquivos por meio da interface Spring Resource.
package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.IOUtils;
import com.aliyun.oss.model.OSSObject;
import org.apache.commons.codec.CharEncoding;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.Charset;
@RestController
public class OssController {
@Autowired
private OSS ossClient;
// Access an OSS object as a Spring Resource
@Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json")
private Resource file;
/**
* Uploads oss-test.json from the classpath to the OSS bucket.
*/
@GetMapping("/upload")
public String upload() {
try {
ossClient.putObject(OssApplication.BUCKET_NAME, "oss-test.json", this
.getClass().getClassLoader().getResourceAsStream("oss-test.json"));
} catch (Exception e) {
e.printStackTrace();
return "upload fail: " + e.getMessage();
}
return "upload success";
}
/**
* Reads the OSS object through the Spring Resource interface.
*/
@GetMapping("/file-resource")
public String fileResource() {
try {
return "get file resource success. content: " + StreamUtils.copyToString(
file.getInputStream(), Charset.forName(CharEncoding.UTF_8));
} catch (Exception e) {
e.printStackTrace();
return "get resource fail: " + e.getMessage();
}
}
/**
* Downloads the OSS object directly through the OSS client.
*/
@GetMapping("/download")
public String download() {
try {
OSSObject ossObject = ossClient.getObject(OssApplication.BUCKET_NAME, "oss-test.json");
return "download success, content: " + IOUtils
.readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8);
} catch (Exception e) {
e.printStackTrace();
return "download fail: " + e.getMessage();
}
}
}Resumo dos endpoints:
| Endpoint | Método | Descrição |
|---|---|---|
/upload | GET | Faz upload de oss-test.json do classpath para o seu bucket do OSS |
/file-resource | GET | Lê o arquivo do OSS pela abstração Resource do Spring (@Value("oss://...")) |
/download | GET | Recupera o arquivo diretamente pelo cliente OSS |
Configurar credenciais e endpoint
Obtenha seu AccessKey ID e AccessKey secret na página Security Management.
Obtenha o endpoint para a região do seu bucket. Consulte Regiões e endpoints.
Crie o arquivo
application.propertiesemsrc/main/resourcese substitua os seguintes espaços reservados pelos valores reais:Espaço reservado Descrição Exemplo <your-access-key>AccessKey ID LTAI5tXxx<your-secret-key>AccessKey secret xXxXxXx<your-endpoint>Prefixo do endpoint regional oss-cn-hangzhouspring.application.name=oss-example server.port=18084 # Replace with your actual credentials and endpoint spring.cloud.alicloud.access-key=<your-access-key> spring.cloud.alicloud.secret-key=<your-secret-key> spring.cloud.alicloud.oss.endpoint=<your-endpoint>.aliyuncs.com management.endpoints.web.exposure.include=*
Verificar o resultado
Execute o método
maindoOssApplicationpara iniciar o serviço.Abra
http://127.0.0.1:18084/uploadno seu navegador. Se a mensagemupload successaparecer, o arquivo foi carregado com sucesso.Verifique no console do OSS: acesse o seu bucket, clique em Files no painel de navegação à esquerda e confirme que
oss-test.jsonaparece na lista de arquivos.Abra
http://127.0.0.1:18084/downloadpara fazer o download do arquivo. O resultado esperado é:{ "name": "oss-test" }Abra
http://127.0.0.1:18084/file-resourcepara ler o arquivo pela interface Spring Resource. O resultado esperado é:{ "name": "oss-test" }
Se alguma etapa falhar, verifique os logs do console em busca de erros, corrija o problema e reinicie a aplicação.
Implantar no EDAS
O Spring Cloud AliCloud OSS foi desenvolvido para atender às necessidades de migração de aplicações dos ambientes de desenvolvimento originais para o EDAS. Implante sua aplicação sem modificar o código ou a configuração.
Para as etapas de implantação, consulte:
Referência de configuração
| Propriedade | Descrição | Exemplo |
|---|---|---|
spring.cloud.alicloud.access-key | AccessKey ID para autenticação | LTAI5tXxx |
spring.cloud.alicloud.secret-key | AccessKey secret para autenticação | xXxXxXx |
spring.cloud.alicloud.oss.endpoint | Endpoint regional do OSS | oss-cn-hangzhou.aliyuncs.com |
server.port | Porta da aplicação | 18084 |
spring.application.name | Nome da aplicação Spring | oss-example |