Deploy project Springboot MIỄN PHÍ sử dụng Render

   Deploy project spring boot MIỄN PHÍ sử dụng render

Đối với những bạn sử dụng Spring boot vì mục đích học tập, nghiên cứu, thì việc chi nhiều tiền để chạy một server là không cần thiết. Trước đó, việc deploy miễn phí trên heroku là lựa chọn của rất nhiều học sinh, sinh viên. Tuy nhiên, công ty này đã cắt đi gói miễn phí vào ngày 28/11/2022, buộc người dùng phải trả phí để sử dụng. Ở bài viết này, mình sẽ hướng dẫn các bạn chạy một project spring boot nhỏ trên Render miễn phí. Cùng tìm hiểu nhé.

Yêu cầu và mô tả: 

- Sử dụng IDE Intellij để dễ dàng package

- Tài khoản git 

- Tài khoản render.

- Sử dụng MySQL và Mybatis để thực hiện tạo lập và quản lý CSDL.



1. Tạo một project spring boot

Truy cập vào trang https://start.spring.io/ và tạo một project spring boot như sau:
Group – com.8techblog
Artifact – App 
Package name – com.8techblog.App 
Packaging – Jar 
Java – 17
Project  Gradle - Groovy (ở đây mình hướng dẫn build dùng gradle)
Language - Java

Đồng thời ở mục ADD DEPENDENCIES thêm một số thành phần
Spring Web
Lombok
Mybatis Framework
MySQL Driver
(Có thể thêm Thymeleaf hoặc Angular cho front end, ở đây mình chỉ dùng REST API để hiện thông tin)

Sau đó nhấn GENERATE.




Tải về, giải nén và mở bằng intellij.
(Trong project tại build.gralde nhớ thêm dòng  trong 
dependencies{
...

runtimeOnly 'com.mysql:mysql-connector-j'} nếu MySQL Driver chạy không được)

2. Tạo một database MySQL online

Sử dụng trang https://freedb.tech/ để tạo MySQL online miễn phí.
Dùng lệnh MySQL để tạo:

CREATE TABLE Users (
    username varchar(255),
    password varchar(255)
);
INSERT INTO Users VALUE('8TECHBLOG','12345678');

3. Thiết lập thư viện mybatis trên project
Điều chỉnh và tạo các file sau.

AppApplication.java
package com.techblog.App;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)
public class AppApplication {

public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}

}
Tạo file mybatis-config.xml trong thư mục main/resources như sau.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias = "Users" type = "com.techblog.App.models.Users"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://sql.freedb.tech:3306/freedb_8techblog?allowPublicKeyRetrieval=true&amp;useSSL=false"/>
<property name="username" value="freedb_techblog"/>
<property name="password" value="X$CaRNU5Qa%7YvW"/>
</dataSource>

</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/sql/UsersMapper.xml"/>

</mappers>

</configuration>

Với url, username và password theo database mình tạo.

Tạo UserMapper.xml
 trong thư mục main/resources như sau.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.techblog.App.mappers.UserMapper" >
<resultMap id = "result" type = "com.techblog.App.models.Users">
<result property = "username" column = "username"/>
<result property = "password" column = "password"/>
</resultMap>
<select id="getUserByUsernameAndPassword" resultMap="result">
SELECT * FROM Users WHERE username = #{username} AND password = #{password};
</select>
</mapper>

Tạo hai thư mục models và mappers 


Với interface UserMapper như sau
package com.techblog.App.mappers;


import com.techblog.App.models.Users;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
@Component
@Mapper
public interface UserMapper {
public Users getUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}





Với class Users như sau
package com.techblog.App.models;

import lombok.Data;

@Data
public class Users {
String username;
String password;

}

Với class MySqlSessionFactory như sau

package com.techblog.App.mappers;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.io.InputStream;


@Configuration
public class MySqlSessionFactory {

@Bean
public SqlSessionFactory startSqlSession() {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}


}




Tạo class TechBlogController trong thư mục controller như sau:
package com.techblog.App.controller;


import com.techblog.App.mappers.MySqlSessionFactory;
import com.techblog.App.mappers.UserMapper;
import com.techblog.App.models.Users;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("8techblog/users")
public class TechBlogController {

@GetMapping
public Users findAllCustomers(){
MySqlSessionFactory msf = new MySqlSessionFactory();
SqlSessionFactory sessionFactory = msf.startSqlSession();
Users user = null;
try(SqlSession session = sessionFactory.openSession()){
UserMapper userMapper = session.getMapper(UserMapper.class);
user = userMapper.getUserByUsernameAndPassword("8techblog", "12345678");
}

return user;
}

}
Chương trình sẽ lấy user có username là 8techblog và password là 12345678 để trả về kết quả.
Cấu trúc thư mục sẽ như sau



4. Package thành file jar và chạy kiểm thử
IDE Intellij hỗ trợ sẵn cho chúng ta công cụ giúp package một project maven hoặc gradle thành dạng .jar (Bạn vẫn có thể tải mvn hoặc gradle rồi dùng terminal thực thi để build file .jar, tuy nhiên sẽ dễ bị lỗi)
Bạn chọn App > build > build


File jar chúng ta sau khi build được sẽ là App/build/libs/App-0.0.1-SNAPSHOT.jar

Chúng ta mở terminal (Alt + F12) và thực thi lệnh để chạy kiểm thử file jar
java -jar build/libs/App-0.0.1-SNAPSHOT.jar
Mở trình duyệt và truy cập localhost:8080/8techblog/users để kiểm tra kết quả.

Như vậy ta đã hoàn thành build file jar

5. Tạo Dockerfile 

Vì Render chạy trên Docker, nên ta cần tạo một Dockerfile để yêu cầu render thiết lập một image cho file jar.
Tại root của project, tạo file tên Dockerfile và ghi nội dung setup như sau.
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY build/libs/*.jar App-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/App-0.0.1-SNAPSHOT.jar"]
EXPOSE 8080
6. Đẩy project lên Github 

Sử dụng git hoặc github desktop để đẩy project của bạn lên Github. Ở đây mình hướng dẫn dùng git với terminal trên Intellij.
Mở .gitignore và xóa dòng sau để github có thể đưa file jar vào git 
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/


Sau đó tại terminal (Alt + F12), nhập lệnh git như sau.
git remote rm origin
git remote add origin https://github.com/lecongdien2000/8techblog-springbot.git
git branch -M main
git push -u origin main
Với đường dẫn https là đường dẫn github trống bạn đã tạo trước đó



7. Deploy project trên Render
 Tạo tài khoản render.com, liên kết với tài khoản Github, và thực hiện deploy.
Chọn New > Web Service

Chọn Build and deploy from a Git repository

Chọn repo bạn đã tạo. Ở đây mình chọn 8techblog-springbot (gõ nhanh nên sai chính tả thông cảm nhé :>)
Nhập vài thông tin cơ bản, và bắt đầu tạo


Chờ một lát và server đã deploy thành công.

Và đây là kết quả:

Lời kết: Như vậy là mọi người đã tìm hiểu được cách tạo project spring boot miễn phí. Hy vọng bài viết này sẽ hỗ trợ các bạn, đặc biệt là các bạn sinh viên trong quá trình học và làm project. ^^ Cảm ơn các bạn đã đọc.

Người viết: Lê Công Diễn

Mang đi nhớ ghi nguồn









Nhận xét

Bài đăng phổ biến từ blog này

Ứng dụng Mã hóa bất đối xứng (Asymmetric cryptography) vào Chữ ký số (Digital Signature)

API và HTTP - Một số khái niệm cơ bản cần biết về Web (Phần 2)