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');
Đ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&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.
<?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
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;
}
}
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;
}
}
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
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ả.
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.
Nhận xét
Đăng nhận xét