在AWS上用SpringBoot建立API

紀錄去年底第一次接觸到AWS(Amazon Web Services)到在AWS上實作一個JSON格式的API,並在AWS上建立AP&DB的方式

有了目的之後,經過初步查詢後理解基礎功能後的想法是:

  1. 開一台RDB(postgreSQL)
  2. 建立table塞資料
  3. 開一台EC2(ubuntu)
  4. 將EC2環境建置好
  5. 寫CODE(java)
  6. 放到EC2中啟動web server

後來根本就卡在4啊!!!!!!!

因為不熟命令列&linux的環境,導致建置期各種問號
我在EC2開好之後,使用putty連線,並爬文找了相關指令來下載java環境..等
以及一直開鳥哥看怎麼操作vi瀏覽器,最後甚至還找了XRDP來連線看到桌面環境XD

後來我覺得應該要找更簡單輕鬆的方法來先實作出東西..
不然依我的腦容量又不常用的東西很快就忘了,
又繼續找更輕鬆的方法…就找到了Elastic Beanstalk! (#小叮噹圖)

這個只需我程式寫好,打包壓縮好上傳就會自己幫你長一台EC2出來,
剛剛上述各種痛苦(之於菜鳥我而言)就不見了,變成一條簡單的路。

流程改為:

  1. 開一台RDB(postgreSQL)
  2. 建立table塞資料
  3. 寫CODE(java)
  4. 打包丟到AWS上

總算是把環境搞定後就開始找如何透過JAVA實作API的方法了,
雖然對於使用JAVA的經驗很少,也是聽過Spring的,
發現spring boot很類似php的感覺,只要把專案設定好就可以開始了,
不用編輯pom.xml(對此實作而言),也沒有spring的web.xml之類要設定,
像是把xampp開好就可以自己生一個php file來實作的感覺了!

最後是使用spring boot開發,並使用data jpa & Rest Repositories來實作API,
所以就來紀錄一下如何使用Spring Boot來實作簡易的API,並上傳至AWS。

以下正文開始

開發環境:windows7
使用工具:sts

1. 開一台RDS

  • 進到RDS介面建立資料庫(我選用postgreSql)
  • 設定資料庫名稱、帳號密碼
  • 安全群組的部分是選擇default
  • 會花數分鐘時間建立RDS

2.建立Table

  • 下載PGadminPostgreSQLe管理工具
  • 設定PGadmin,建立連線

    在RDS查詢連線資訊

    範例如下

  • 接著透過介面操作資料庫來建立一個USERS table
1
2
3
4
5
6
7
CREATE TABLE USERS(
id serial PRIMARY KEY,
name varchar(20) NOT NULL,
email varchar(50) NOT NULL,
password varchar(50) NOT NULL,
create_date date
);
  • INSERT三筆資料
1
2
3
4
INSERT INTO USERS(id, name, email, password, create_date) VALUES
(1, 'testUser1', 'testUser1@email.com', '11111', CURRENT_TIMESTAMP),
(2, 'testUser2', 'testUser2@email.com', '22222', CURRENT_TIMESTAMP),
(3, 'testUser3', 'testUser3@email.com', '33333', CURRENT_TIMESTAMP)

3.寫CODE

  • 下載Spring Tool Suite(STS)
  • 建立專案(New->Other->Spring Starter Project)
  • 我的設定如圖,選擇war檔是為了最終上傳至Elastic Beanstalk的格式
  • 版本及使用項目如圖(JPA、PostgreSQL、Rest Repositories)
  • 建立好之後,於src/main/java建立一個packge:com.example.models
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.example.models;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

//這裡可加上@Table(name = "")來指定table名稱
//不加的話會自動以class name來找對應的表
//可避開java底線(_)保留字的問題
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;

//@Column可指定欄位名稱@Column(name = "")
//可避開java底線(_)保留字的問題
@Column(name = "name")
private String name;

@Column(name = "email")
private String email;

@Column(name = "password")
private String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}
  • 建立Packge:com.example.repostitories,並在底下建立UserRespository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.repostitories;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;

import com.example.models.User;

@RepositoryRestResource(collectionResourceRel = "Users", path="Users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {

@RestResource(path = "find", rel = "find")
Page<User> findByNameIgnoreCaseContaining(@Param("name") String name, Pageable pageable);
/*
* 方法findBy[column name]必須指定為欄位名稱,要注意的是要用domain建立的欄位名稱
* RepositoryRestResource的用途是指定一個路徑,對我來說是避免查詢名稱過長
* 因為以此例不指定的話會長這樣http://domain/users/findByNameIgnoreCaseContaining
* 若查詢結果需分頁可改為Page<Users>並加上參數Pageable pageable,
* 不然就是List<User> findByNameIgnoreCaseContaining(@Param("name") String name)就好了
*/
}
  • 設定application.properties設定連線資訊
1
2
3
4
5
6
7
8
9
10
11
12
13
#設定這個可指定連入api的路徑
spring.data.rest.base-path=/api
spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.database.driverClassName=org.postgresql.Driver
#要加port號及所建立的資料庫名稱
spring.datasource.url=jdbc:postgresql://domain:5432/database
spring.datasource.username=username
spring.datasource.password=password
#這裡改5000因為EB會用nginx來轉,port必須改為5000
server.port = 5000

####4.打包丟到AWS上面

結束!
從來沒想過會寫JAVA的心得囧..