Golang 및 Cassandra DB를 사용한 Rest API

6134 단어
Apache Cassandra는 많은 상용 서버에서 대량의 데이터를 처리하도록 설계된 확장성이 뛰어난 고성능 분산 데이터베이스로 단일 장애 지점 없이 고가용성을 제공합니다. NoSQL 데이터베이스의 일종입니다.

이 게시물에서는 Golang 및 Cassandra DB 형식의 REST API를 생성합니다.

먼저 이 블로그의 개요를 설명하겠습니다.
  • Cassandra의 키스페이스 생성(MySQL의 데이터베이스와 유사)
  • 키스페이스 내부에 테이블 생성
  • go-cql 커넥터로 연결
  • 나머지 API 생성

  • 참고: 이 블로그는 우분투 시스템에 따라 작성되므로 OS에 따라 약간의 변경이 있을 수 있습니다.

    1. 카산드라 키스페이스 생성

    CREATE KEYSPACE users
    WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};
    


    복제 계수가 1이라는 것은 Cassandra 클러스터에 각 행의 복사본이 하나만 있음을 의미합니다. 복제 팩터가 2라는 것은 각 행에 대해 두 개의 복사본이 있으며 각 복사본이 다른 노드에 있음을 의미합니다.

    이 용어의 세부 사항은 이 블로그의 초점이 아니므로 나중에 블로그에서 설명하겠습니다.

    2. 키스페이스 내부에 테이블 생성

    use users;
    
    CREATE TABLE stu(
       username text PRIMARY KEY,
       email text
       );
    


    골랑을 위한 시간!!!

    먼저 main.go 파일을 만들고 그 안에 데이터베이스 구조와 매핑할 구조체를 만듭니다.

    type Student struct {
        Username string `json:"username"`
        Email    string `json:"email"`
    }
    
    


    cassandra와 연결하기 위해 우리는 gocql 패키지를 사용할 것이고 그것의 링크는 아래에 주어집니다.

    이제 주요 기능을 만들고 서버를 시작합니다.

    func main() {
        http.HandleFunc("/", handleRequest)
        if err := http.ListenAndServe(":8080", nil); err != nil {
            log.Fatal(err)
        }
        fmt.Println("Server has Started")
    
    }
    


    cassandra 클라이언트의 경우 데이터베이스와 상호 작용하는 데 필요한 모든 기능이 있는 gocql.Session에 대한 포인터가 있는 Client라는 새 구조체를 만듭니다.

    type Client struct {
        cassandra *gocql.Session
    }
    
    var cassandraClient *Client
    
    


    IniitalizeDB() 함수

    이 함수는 cassandra와 Go 사이의 연결을 만들고 *Client 유형 변수를 반환합니다.

    func InitializeDB() *Client {
        cluster := gocql.NewCluster("127.0.0.1")
        cluster.Consistency = gocql.Quorum
        cluster.Keyspace = "users"
        session, _ := cluster.CreateSession()
        fmt.Println("********************** Cassandra Initialized")
        return &Client{cassandra: session}
    }
    


    이제 main 함수에서 InitializeDb()를 호출하고 cassandraClient를 변수에 전달합니다.

    cassandraClient = InitializeDB();
    


    이제 POST, GET, PUT, DELETE에 따라 요청을 함수에 매핑합니다.

    func handleRequest(w http.ResponseWriter, r *http.Request) {
        switch true {
        case r.Method == "POST":
            createStudent(w, r)
        case r.Method == "GET":
            getStudent(w, r)
        case r.Method == "PUT":
            updateStudent(w, r)
        case r.Method == "DELETE":
            deleteStudent(w, r)
        }
    
    }
    


    Atlast 모든 설정이 완료되었습니다. 이제 CRUD 작업을 생성합니다.

    1. CreateStudent 기능

    먼저 사후 요청을 받아 데이터베이스 쿼리를 수행하는 CreateStudent 함수를 라우팅하는 createStudent 함수가 있습니다.

    cassandra에 삽입하기 위해 쿼리를 사용합니다.

    사용자(사용자 이름, 이메일) 값(?,?)에 삽입한 다음 값을 추가합니다.

    기능은 아래와 같습니다.

    func createStudent(w http.ResponseWriter, r *http.Request) {
        var NewUser Student
        reqBody, err := ioutil.ReadAll(r.Body)
        if err != nil {
            fmt.Fprintf(w, "wrong data")
        }
        json.Unmarshal(reqBody, &NewUser)
        //Call the DB
        err = cassandraClient.CreateStudent(NewUser)
        if err != nil {
            panic(err)
        }
        fmt.Println(NewUser)
    
    }
    
    
    
    func (s *Client) CreateStudent(stu Student) error {
        err := s.cassandra.Query("INSERT INTO users (username, email) VALUES(?,?)", stu.Username, stu.Email).Exec()
        if err != nil {
            return err
        }
    
        return nil
    }
    
    


    다른 방법에 대해서도 마찬가지로

    2. 학생 업데이트

    업데이트 사용자 SET 이메일=? WHERE 사용자 이름=?

    
    func updateStudent(w http.ResponseWriter, r *http.Request) {
        var UpdateStu Student
        reqBody, err := ioutil.ReadAll(r.Body)
        if err != nil {
            fmt.Fprintf(w, "Kindly enter data properly")
        }
        json.Unmarshal(reqBody, &UpdateStu)
        //DB Call
        err = cassandraClient.UpdateStudent(UpdateStu)
        if err != nil {
            panic(err)
        }
        fmt.Println(UpdateStu)
    
    }
    
    
    
    func (s *Client) UpdateStudent(stu Student) error {
        err := s.cassandra.Query("UPDATE users SET email=? WHERE username=?", stu.Email, stu.Username).Exec()
        if err != nil {
            return err
        }
        return nil
    }
    
    
    


    3. 학생 확보

    SELECT * FROM users WHERE username=?

    func getStudent(w http.ResponseWriter, r *http.Request) {
        name := r.URL.Query().Get("username")
        //DB call
        stu, err := cassandraClient.GetStudent(name)
        if err != nil {
            panic(err)
        }
        fmt.Println(stu)
    }
    
    func (s *Client) GetStudent(username string) (Student, error) {
    
        stu := Student{}
        ctx := context.Background()
        err := s.cassandra.Query("SELECT * FROM users WHERE username=?", username).WithContext(ctx).Consistency(gocql.One).Scan(&stu.Username, &stu.Email)
        if err != nil {
            return stu, err
        }
        return stu, nil
    }
    
    
    


    4. 학생 삭제

    func deleteStudent(w http.ResponseWriter, r *http.Request) {
        name := r.URL.Query().Get("username")
        //Db Call
        err := cassandraClient.DeleteStudent(name)
        if err != nil {
            panic(err)
        }
        fmt.Println("Successfully Deleted")
    
    }
    
    
    func (s *Client) DeleteStudent(name string) error {
        err := s.cassandra.Query("DELETE FROM users WHERE username=?", name).Exec()
        if err != nil {
            return err
        }
        return nil
    }
    
    
    


    이제 전체 코드에 액세스하려면 여기 링크가 있습니다.
    https://github.com/mrshukla1805/golang-cassandra

    저장소에 별표를 제공해주세요!!

    즐기면서 계속 배우세요 ;)

    좋은 웹페이지 즐겨찾기