Go Micro 마스터 디자인

Go - micro 가 뭐 예요?
Go - micro 프레임 워 크 는 마이크로 서비스 분포 식 의 프레임 워 크 로 개발 효율 을 대폭 높 일 수 있다.원본 주소:https://github.com/micro/go-microGo-micro많은 특성 을 가지 고 있 습 니 다:
  • 서비스 등록, 발견
  • 부하 균형
  • 메시지 디 코딩 및 기본 지원 json 및 protobuf
  • rpc 기반 요청 응답
  • 비동기 적 인 정보 통신
  • 인터페이스 플러그 가능
  • 그 중에서 가장 중요 한 것 은 마지막 특성 으로 인 터 페 이 스 를 꽂 을 수 있다 는 것 이다.위의 그림 의 8 개의 관건 적 인 인터페이스 만 실현 하면 수요 에 따라 8 개의 인터페이스의 기능 을 마음대로 다시 시작 할 수 있다.이 8 개의 인 터 페 이 스 는 고 미 크 로 의 전체적인 구 조 를 실현 했다.이 인터페이스 들 은 기본 적 인 실현 방식 을 가지 고 있 으 며, 플러그 인 을 쓰 지 않 아 도 이 마이크로 서비스 구 조 를 사용 할 수 있다 는 것 을 의미한다.또한 하나의 그림 도 전체 Micro 의 전체적인 절 차 를 잘 볼 수 있다. 전체 구조 에서 각 모듈 의 역할 과 상호 간 의 호출 관 계 를 볼 수 있다.서비스 발견 을 바탕 으로 broker 나 Transport 를 통 해 서비스 간 의 통신 을 한다.쉽게 말 하면 Client 는 Selector 모듈 을 통 해 부하 균형 을 이 루 고 등록 센터 에서 서비스 노드 를 받 은 다음 에 노드 정 보 를 통 해 Transport 가 정의 한 통신 협 의 를 통 해 통신 을 하 는 것 이다.
    주 인터페이스
    전체 Go Micro 는 이 8 개의 인터페이스 로 구성 되 어 있다. 다시 말 하면 이 8 개의 인 터 페 이 스 를 이해 하고 그 중의 하 나 를 자세히 연구 하면 전체 구조의 실현 과 구 조 를 알 수 있다.다음은 이 8 개의 인 터 페 이 스 를 살 펴 보 겠 습 니 다.
    Transort
    서비스 간 통신 의 인터페이스.즉, 서비스 전송 과 수신 의 최종 실현 방식 은 이러한 인터페이스 에 의 해 맞 춤 형 으로 만들어 진 것 이다.
    type Socket interface {
        Recv(*Message) error
        Send(*Message) error
        Close() error
    }
    
    type Client interface {
        Socket
    }
    
    type Listener interface {
        Addr() string
        Close() error
        Accept(func(Socket)) error
    }
    
    type Transport interface {
        Dial(addr string, opts ...DialOption) (Client, error)
        Listen(addr string, opts ...ListenOption) (Listener, error)
        String() string
    }

    Codec
    전송 방식 이 있 습 니 다. 다음은 전송 코드 와 디 코딩 문 제 를 해결 해 야 합 니 다. go - micro 는 여러 가지 인 코딩 디 코딩 방식 이 있 습 니 다. 기본 적 인 실현 방식 은 protobuf 입 니 다. 물론 다른 실현 방식 도 있 습 니 다. json, protobuf, jsonrpc, mercury 등 이 있 습 니 다.
    소스 코드
    
    type Codec interface {
        ReadHeader(*Message, MessageType) error
        ReadBody(interface{}) error
        Write(*Message, interface{}) error
        Close() error
        String() string
    }
    
    type Message struct {
        Id     uint64
        Type   MessageType
        Target string
        Method string
        Error  string
        Header map[string]string
    }

    Codec 인터페이스의 Write 방법 은 인 코딩 과정 이 고 두 개의 Read 는 디 코딩 과정 입 니 다.
    Registry
    서비스의 등록 과 발견, 현재 실 현 된 consul, mdns, etcd, etdv 3, zookeeper, kubernetes 등,
    type Registry interface {
        Register(*Service, ...RegisterOption) error
        Deregister(*Service) error
        GetService(string) ([]*Service, error)
        ListServices() ([]*Service, error)
        Watch(...WatchOption) (Watcher, error)
        String() string
        Options() Options
    }

    Selector
    Registry 를 바탕 으로 selector 는 클 라 이언 트 등급 의 부하 균형 으로 클 라 이언 트 가 서비스 에 요청 을 보 낼 때 selector 는 서로 다른 알고리즘 에 따라 Registery 의 호스트 목록 에서 사용 가능 한 Service 노드 를 얻어 통신 을 한다.현재 실 현 된 순환 알고리즘 과 랜 덤 알고리즘 은 기본적으로 랜 덤 알고리즘 이다.
    type Selector interface {
        Init(opts ...Option) error
        Options() Options
        // Select returns a function which should return the next node
        
        Select(service string, opts ...SelectOption) (Next, error)
        // Mark sets the success/error against a node
        
        Mark(service string, node *registry.Node, err error)
        // Reset returns state back to zero for a service
        
        Reset(service string)
        // Close renders the selector unusable
        
        Close() error
        // Name of the selector
        
        String() string
    }

    기본 값 은 로 컬 캐 시 입 니 다. 현재 구현 되 는 것 은 Blacklist, label, named 등 이 있 습 니 다.
    Broker
    Broker 는 메시지 발표 와 구독 의 인터페이스 입 니 다.간단 한 예 이다. 서비스의 노드 가 고정 되 지 않 기 때문에 모든 서비스 행 위 를 수정 해 야 하 는 수요 가 있 으 면 서비스 가 특정한 주 제 를 구독 할 수 있다. 정보 가 발표 되면 모든 감청 서 비 스 는 정 보 를 받 고 귀하 의 수요 에 따라 해당 하 는 행 위 를 할 수 있다.
    type Broker interface {
        Options() Options
        Address() string
        Connect() error
        Disconnect() error
        Init(...Option) error
        Publish(string, *Message, ...PublishOption) error
        Subscribe(string, Handler, ...SubscribeOption) (Subscriber, error)
        String() string
    }

    Broker 의 기본 적 인 실현 방식 은 http 방식 이지 만 이런 방식 은 생산 환경 에서 사용 하지 마 십시오.go - plugins 에는 성숙 한 메시지 큐 실현 방식 이 많 습 니 다. kafka, nsq, rabbitmq, redis 등 이 있 습 니 다.
    Client
    Client 는 서 비 스 를 요청 하 는 인터페이스 로 Transport 와 Codec 를 패키지 하여 rpc 호출 을 하고 Brocker 를 패키지 하여 정 보 를 발표 합 니 다.
    type Client interface {
        Init(...Option) error
        Options() Options
        NewMessage(topic string, msg interface{}, opts ...MessageOption) Message
        NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
        Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
        Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
        Publish(ctx context.Context, msg Message, opts ...PublishOption) error
        String() string
    }

    물론 그 는 쌍 공 통신 스 트림 이라는 구체 적 인 실현 방식 과 사용 방식 을 지지 하 며 앞으로 상세 하 게 설명 할 것 이다.기본적으로 rpc 구현 방식 입 니 다. grpc 와 http 방식 도 있 습 니 다. go - plugins 에서 찾 을 수 있 습 니 다.
    Server
    서버 이름 보니까 뭐 하 는 사람 인지 다 들 알 겠 다.rpc 요청 을 기다 리 고 있 습 니 다.broker 의 구독 정 보 를 감청 하고 정보 큐 의 푸 시 등 을 기다린다.
    type Server interface {
        Options() Options
        Init(...Option) error
        Handle(Handler) error
        NewHandler(interface{}, ...HandlerOption) Handler
        NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
        Subscribe(Subscriber) error
        Register() error
        Deregister() error
        Start() error
        Stop() error
        String() string
    }

    Service
    Service 는 Client 와 Server 의 패키지 입 니 다. 그 는 일련의 방법 을 포함 하여 Service 와 Client 를 초기 화하 여 rpc 서 비 스 를 간단하게 만 들 수 있 도록 합 니 다.
    type Service interface {
        Init(...Option)
        Options() Options
        Client() client.Client
        Server() server.Server
        Run() error
        String() string
    }

    좋은 웹페이지 즐겨찾기