Buat aplikasi Spring Cloud yang mengunggah, mengunduh, dan membaca file dari Object Storage Service (OSS), lalu terapkan ke Enterprise Distributed Application Service (EDAS) tanpa mengubah kode atau konfigurasi.
Mengapa menggunakan OSS
OSS dikembangkan oleh Alibaba Cloud untuk menyediakan layanan penyimpanan yang aman, hemat biaya, dan sangat andal. Layanan ini memungkinkan Anda menyimpan data dalam jumlah besar di cloud. OSS menyediakan operasi API RESTful yang independen terhadap platform, sehingga Anda dapat menyimpan dan mengakses berbagai jenis data dalam aplikasi berbasis Spring Cloud.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Akun Alibaba Cloud dengan OSS diaktifkan
Pasangan Kunci Akses (ID AccessKey dan Rahasia AccessKey) dari halaman Security Management
Titik akhir OSS untuk wilayah bucket Anda (lihat Wilayah dan titik akhir)
JDK 8 atau versi lebih baru serta Maven yang telah diinstal secara lokal
Cara kerja
Spring Cloud AliCloud OSS mengintegrasikan aplikasi Spring Cloud dengan Alibaba Cloud OSS. Setelah menambahkan dependensi starter dan mengonfigurasi kredensial, Anda dapat:
Menyuntikkan client
OSSlangsung ke dalam bean Spring AndaMengakses objek OSS sebagai instance
ResourceSpring dengan menggunakan@Value("oss://...")Men-deploy aplikasi yang sama ke EDAS tanpa mengubah kode atau konfigurasi
Siapkan proyek Maven
Buat proyek Maven bernama
oss-example.Tambahkan dependensi berikut ke dalam
pom.xml:Spring Boot 1.x telah mencapai masa akhir dukungan. Jika Anda harus menggunakan Spring Boot 1.x, gunakan versi 1.5.x bersama Spring Cloud Edgware dan 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>Buat paket bernama
spring.cloud.alicloud.ossdi bawah direktorisrc/main/java.
Buat titik masuk aplikasi
Buat kelas startup OssApplication di dalam paket spring.cloud.alicloud.oss. Saat startup, kelas ini memeriksa apakah bucket target sudah ada dan membuatnya jika diperlukan.
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 {
// Ganti dengan nama bucket aktual Anda
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);
}
}
}
}Tambahkan file contoh
Buat file bernama oss-test.json di dalam direktori src/main/resources:
{
"name": "oss-test"
}Buat REST controller
Buat OssController di dalam paket spring.cloud.alicloud.oss. Controller ini menyediakan tiga titik akhir untuk mengunggah, mengunduh, dan membaca file melalui antarmuka Resource Spring.
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;
// Mengakses objek OSS sebagai Resource Spring
@Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json")
private Resource file;
/**
* Mengunggah oss-test.json dari classpath ke bucket OSS.
*/
@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";
}
/**
* Membaca objek OSS melalui antarmuka Resource Spring.
*/
@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();
}
}
/**
* Mengunduh objek OSS secara langsung melalui client OSS.
*/
@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();
}
}
}Ringkasan titik akhir:
| Titik Akhir | Metode | Deskripsi |
|---|---|---|
/upload | GET | Mengunggah oss-test.json dari classpath ke bucket OSS Anda |
/file-resource | GET | Membaca file dari OSS melalui abstraksi Resource Spring (@Value("oss://...")) |
/download | GET | Mengambil file secara langsung melalui client OSS |
Konfigurasikan kredensial dan titik akhir
Dapatkan ID AccessKey dan Rahasia AccessKey Anda dari halaman Security Management.
Dapatkan titik akhir untuk wilayah bucket Anda. Lihat Wilayah dan titik akhir.
Buat file
application.propertiesdi dalam direktorisrc/main/resources: Ganti placeholder berikut dengan nilai aktual Anda:Placeholder Deskripsi Contoh <your-access-key>ID AccessKey LTAI5tXxx<your-secret-key>Rahasia AccessKey xXxXxXx<your-endpoint>Awalan titik akhir regional oss-cn-hangzhouspring.application.name=oss-example server.port=18084 # Ganti dengan kredensial dan titik akhir aktual Anda 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=*
Verifikasi hasil
Jalankan metode
maindariOssApplicationuntuk memulai layanan.Buka
http://127.0.0.1:18084/uploaddi browser Anda. Jika munculupload success, berarti file berhasil diunggah.Verifikasi di Konsol OSS: buka bucket Anda, klik Files di panel navigasi sebelah kiri, dan pastikan
oss-test.jsonmuncul dalam daftar file.Buka
http://127.0.0.1:18084/downloaduntuk mengunduh file tersebut. Output yang diharapkan adalah:{ "name": "oss-test" }Buka
http://127.0.0.1:18084/file-resourceuntuk membaca file melalui antarmuka Resource Spring. Output yang diharapkan adalah:{ "name": "oss-test" }
Jika langkah apa pun gagal, periksa log konsol untuk menemukan kesalahan, perbaiki masalah tersebut, lalu restart aplikasi.
Terapkan ke EDAS
Spring Cloud AliCloud OSS dirancang untuk mendukung migrasi aplikasi dari lingkungan pengembangan aslinya ke EDAS. Anda dapat menerapkan aplikasi tanpa mengubah kode atau konfigurasi.
Untuk langkah-langkah penerapan, lihat:
Referensi konfigurasi
| Properti | Deskripsi | Contoh |
|---|---|---|
spring.cloud.alicloud.access-key | ID AccessKey untuk otentikasi | LTAI5tXxx |
spring.cloud.alicloud.secret-key | Rahasia AccessKey untuk otentikasi | xXxXxXx |
spring.cloud.alicloud.oss.endpoint | Titik akhir regional OSS | oss-cn-hangzhou.aliyuncs.com |
server.port | Port aplikasi | 18084 |
spring.application.name | Nama aplikasi Spring | oss-example |