>  기사  >  백엔드 개발  >  Go-Zero를 이용한 분산 검색 엔진 구현

Go-Zero를 이용한 분산 검색 엔진 구현

WBOY
WBOY원래의
2023-06-22 17:59:181410검색

인터넷 시대의 도래와 함께 검색엔진의 역할이 더욱 중요해지고 있습니다. 인터넷 사용자가 가장 일반적으로 사용하는 도구 중 하나인 검색 엔진은 편리한 검색 방법을 제공할 뿐만 아니라 네트워크 정보 필터링 및 분류를 지원합니다. 그러나 대규모 데이터 볼륨과 사용자 방문을 처리하기 위해 기존 검색 엔진 아키텍처는 더 이상 요구 사항을 충족할 수 없습니다.

분산 검색 엔진 아키텍처는 기존 아키텍처의 병목 현상 문제를 효과적으로 해결할 수 있습니다. 실행을 위해 다양한 작업을 다양한 노드에 할당함으로써 클러스터의 컴퓨팅 리소스를 최대한 활용하고 시스템의 응답 속도와 안정성을 향상시킬 수 있습니다. 현재의 분산 아키텍처 기술에서 Go-Zero 프레임워크는 매우 탁월한 선택입니다.

go-zero는 Golang을 기반으로 개발된 경량 오픈 소스 마이크로서비스 프레임워크입니다. 코드 생성, 매개변수 확인, 라우팅, 로깅, 오류 처리, 캐싱, 전류 제한 및 기타 기능을 포함한 완전한 도구 체인 세트를 제공하여 마이크로서비스의 개발 및 유지 관리를 크게 단순화합니다. 분산 검색 엔진 구축 시, go-zero 프레임워크는 고성능 및 고가용성 시스템을 신속하게 구현하는 데 도움이 될 수 있습니다.

아래에서는 go-zero를 사용하여 분산 검색 엔진을 구축하는 방법을 예제와 함께 소개합니다.

1단계: 환경 구축

먼저 Golang 및 go-zero 프레임워크를 설치해야 합니다. 설치 후 go-zero에서 제공하는 도구 명령줄을 사용하여 프로젝트 템플릿을 생성합니다. 새 프로젝트를 생성하려면 명령줄에

goctl api new search

를 입력하세요. 이를 바탕으로 개발을 시작할 수 있습니다.

2단계: 구성 설정

분산 검색 엔진을 개발할 때 가장 중요한 단계는 시스템의 분산 구성을 정의하는 것입니다. 프로젝트 루트 디렉터리에 search-api.yaml이라는 구성 파일을 생성하고 그 안에 다음 구성 정보를 정의해야 합니다.

Name: search # 服务名
Description: "搜索服务" # 服务描述
Version: 1.0.0 # 服务版本

Host: 127.0.0.1 # 服务绑定IP地址
Port: 8888 # 服务绑定端口号

Redis:
  Host: 127.0.0.1 # Redis服务地址
  Port: 6379 # Redis服务端口号
  Password: "" # Redis密码

Etcd:
  Hosts:
    - 127.0.0.1:2379 # Etcd集群地址

구성 파일에서 서비스 이름, 설명, 버전, 서비스 바인딩 주소 및 포트 번호, Redis 및 Etcd의 구성 정보도 포함됩니다. 그 중 Redis는 검색 결과를 캐시하는 데 사용되고 Etcd는 서비스 등록 및 검색을 구현하는 데 사용됩니다.

3단계: API 인터페이스 정의

다음으로 검색 엔진의 API 인터페이스를 정의해야 합니다. search/api/search.api에서 다음을 정의합니다.

syntax = "proto3";

package search.api;

option go_package = "search/api/search";

message Request {
    string keyword = 1;
    int32 page = 2;
    int32 size = 3;
}

message Response {
    repeated Result result = 1;
}

message Result {
    string title = 1;
    string url = 2;
    string abstract = 3;
}

service Search {
    rpc Query(Request) returns (Response);
}

검색 API에서는 요청 요청 및 응답 매개변수와 결과 검색 결과 구조를 정의합니다. 검색 API에는 사용자 검색 키워드, 페이징 정보 및 기타 매개변수를 받아들이고 검색 결과를 반환하는 쿼리 인터페이스가 포함되어 있습니다.

4단계: 비즈니스 로직 구현

API 인터페이스 정의가 끝나면 비즈니스 로직 코드 작성을 시작할 수 있습니다. search/internal/search/search.go에서는 검색 요청 처리 및 검색 결과 캐싱이 구현됩니다. 특정 코드 구현 세부 정보는 주석을 참조하세요.

package search

import (
    "context"
    "encoding/json"

    "github.com/Yesterday17/go-search-engine/global"
    "github.com/Yesterday17/go-search-engine/internal/search/model"
    "github.com/Yesterday17/go-search-engine/internal/search/service"
    "github.com/Yesterday17/go-zero/core/stores/redis"
    "github.com/Yesterday17/go-zero/rest/httpx"
)

type Search struct {
    redis      *redis.Redis
    searchFunc func(string, int32, int32) ([]model.Result, error)
}

func NewSearch(redis *redis.Redis) *Search {
    return &Search{
        redis: redis,
        searchFunc: service.Search.implement,
    }
}

func (s *Search) Query(ctx context.Context, req *model.Request) (*model.Response, error) {
    resp := &model.Response{}
    key := generateKey(req.Keyword, req.Page, req.Size)

    // 搜索结果缓存
    result, err := s.redis.Get(key).Result()
    if err == nil {
        if err := json.Unmarshal([]byte(result), resp); err != nil {
            return nil, err
        }
        return resp, nil
    }

    result, err = s.searchFunc(req.Keyword, req.Page, req.Size)
    if err != nil {
        return nil, err
    }

    // 将搜索结果序列化为json,存储至redis
    data, err := json.Marshal(result)
    if err != nil {
        return nil, err
    }

    if err := s.redis.Set(key, string(data), global.SearchResultExpire).Err(); err != nil {
        return nil, err
    }

    resp.Result = result
    return resp, nil
}

func generateKey(keyword string, page, size int32) string {
    return "search_" + keyword + "_" + httpx.ConvertIntToString(int(page)) + "_" +
        httpx.ConvertIntToString(int(size))
}

코드에서는 사용자 요청을 수신하고 Redis에서 검색 결과를 검색하는 Query 메서드를 구현합니다. 검색 결과가 Redis에 있으면 캐시된 결과가 직접 반환되고, 존재하지 않으면 service.Search.implement 메서드가 호출되어 검색을 수행하며 검색 결과는 json으로 직렬화되어 Redis에 캐시됩니다.

5단계: 서비스 시작

마지막 단계는 검색 서비스를 시작하는 것입니다. 검색 디렉터리의 명령줄에서 다음 명령을 실행합니다.

go run search.go -f api/search.api -s svc.yaml -c search-api.yaml

서비스가 성공적으로 시작된 후 localhost:8888/search/query 인터페이스에 액세스하여 검색 기능 구현을 테스트할 수 있습니다.

요약

이 글에서는 Go-Zero 프레임워크를 사용하여 분산 검색 엔진을 빠르게 구축하는 방법을 소개합니다. 분산 시스템 개발에서는 go-zero 프레임워크의 유연성과 효율성이 널리 인정되어 마이크로서비스 및 동시성이 높은 비즈니스 시나리오에서 널리 사용되었습니다. 이 글이 분산 시스템 개발 기술을 마스터하려는 독자들에게 도움이 되기를 바랍니다.

위 내용은 Go-Zero를 이용한 분산 검색 엔진 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.