>백엔드 개발 >Golang >Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

尚
앞으로
2019-11-26 13:19:534329검색

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

제품 입 안의 작은 프로젝트는 프로젝트 수립부터 개발, 출시까지 시간과 수요가 계속 급증함에 따라 초기 프로젝트 아키텍처를 설계하지 않으면 점점 더 복잡해지고 큰 프로젝트로 변하게 됩니다. 음, 코드는 점점 더 비대해지고 유지 관리가 어려워질 것이며, 이후의 각 제품 반복은 전체에 영향을 미칠 것입니다.

마이크로서비스 기반 프로젝트와 모듈 간의 느슨하게 결합된 관계는 유지 관리 비용이 증가하지만 여전히 가치가 있습니다.

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

마이크로서비스 프로젝트의 안정성 외에도 저는 개인적으로 다음과 같은 몇 가지 문제에 대해 우려하고 있습니다.

1: 서비스 간 데이터 전송의 효율성과 보안.

둘째: 서비스의 동적 확장, 즉 서비스 등록 및 검색, 서비스 클러스터링입니다.

셋: 마이크로서비스 기능은 사용자 정의가 가능합니다. 왜냐하면 모든 기능이 귀하의 요구 사항을 충족할 수는 없기 때문입니다. 귀하의 필요에 따라 일부 기능을 개발해야 하는 것은 불가피합니다.

go-micro는 go 언어를 기반으로 한 훌륭한 rpc 마이크로서비스 프레임워크입니다. 완벽한 기능을 갖추고 있으며 제가 우려하는 몇 가지 문제를 해결했습니다.

1: 서비스 간 전송 형식은 protobuf이므로 효율적입니다. 위에서 언급했듯이 매우 빠르고 안전합니다.

2: Go-micro의 서비스 등록 및 검색은 다양합니다. 저는 개인적으로 etcdv3의 서비스 검색 및 등록을 선호합니다.

3: 주요 기능에는 해당 인터페이스가 구현되어 있으므로 필요에 따라 플러그인을 사용자 정의할 수 있습니다.

여가시간에 go-micro의 소스코드를 체계적으로 읽어보니 이 프레임워크가 잘 작성되었다는 느낌이 들었고 많은 것을 배웠습니다. 나는 일련의 게시물을 편집하고 go-micro를 학습한 경험을 모든 사람과 공유하고 싶습니다.

go-micro의 통신 프로세스는 다음과 같습니다

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

서버는 클라이언트의 호출을 모니터링하고 Brocker가 푸시한 정보를 처리합니다. 그리고 서버는 클라이언트가 서버의 상태를 알 수 있도록 Register에 서버의 존재 또는 소멸을 등록해야 합니다.

등록 서비스를 검색하세요.

클라이언트는 등록기에서 서버 정보를 얻은 후 각 통화에 대한 알고리즘을 기반으로 통신할 서버를 선택합니다. 물론 통신에는 인코딩/디코딩 및 전송 프로토콜 선택과 같은 일련의 프로세스가 필요합니다.

모든 서버에 통보해야 하는 경우 Brocker를 사용하여 정보를 푸시할 수 있습니다.

브로커 정보 큐는 정보를 수신하고 게시합니다.

go-micro가 고도로 맞춤화될 수 있는 이유는 go-micro가 8개의 주요 인터페이스로 구성되어 있기 때문입니다. 각 인터페이스는 자체 요구 사항에 따라 다시 구현될 수 있습니다. 고마이크로의 구조.

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

이러한 go-micir 인터페이스에는 자체 기본 구현이 있으며 이러한 인터페이스 구현의 대안인 go-plugin도 있습니다. 필요에 따라 자체 플러그인을 구현할 수도 있습니다.

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

이 게시물은 주로 go-micro의 주요 구조와 이러한 인터페이스의 기능을 소개합니다. 자세한 내용은 향후 기사에서 다루겠습니다.

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
}

Transport의 Listen 메서드는 일반적으로 서버에 의해 호출됩니다. 포트를 수신하고 클라이언트가 호출할 때까지 기다립니다.

Transport의 다이얼은 클라이언트가 서비스에 연결하는 데 사용하는 방법입니다. 클라이언트 인터페이스를 반환합니다. 이 클라이언트는 소켓 인터페이스에 내장되어 있으며 통신 정보를 구체적으로 보내고 받습니다.

http 전송은 go-micro의 기본 동기식 통신 메커니즘입니다. 물론 grpc, nats, tcp, udp, Rabbitmq, nats 등 다른 플러그인도 많이 있으며 지금까지 모두 구현되었습니다. go-plugins에서 찾을 수 있습니다.

Codec

다음으로 해결해야 할 것은 전송 인코딩 및 디코딩 문제입니다. go-micro에는 기본 구현 방법이 protobuf입니다. , json, protobuf, jsonrpc, 머큐리 등

소스 코드

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
}

코덱 인터페이스의 Write 방식은 인코딩 과정이고, 두 개의 Read는 디코딩 과정입니다.

Registry

서비스 등록 및 검색, 현재 구현된 consul, mdns, etcd, etcdv3, 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
}

간단히 말하면 서비스는 등록을 위해 등록하고 클라이언트는 모니터링을 위해 watch 메서드를 사용합니다. 서비스가 추가되거나 삭제되면 클라이언트에게 서비스 정보를 업데이트하도록 알리기 위해 이 메서드가 트리거됩니다.

기본 서비스 등록 및 검색은 consul인데 consul 클러스터를 직접 사용할 수 없기 때문에 개인적으로는 추천하지 않습니다

Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개

我个人比较喜欢etcdv3集群。大家可以根据自己的喜好选择。

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
}

当然他也支持双工通信 Stream 这些具体的实现方式和使用方式,以后会详细解说。

默认的是rpc实现方式,他还有grpc和http方式,在go-plugins里可以找到

Server

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
}

 默认的是rpc实现方式,他还有grpc和http方式,在go-plugins里可以找到

Service

Service是Client和Server的封装,他包含了一系列的方法使用初始值去初始化Service和Client,使我们可以很简单的创建一个rpc服务。

源码:

type Service interface {
    Init(...Option)
    Options() Options
    Client() client.Client
    Server() server.Server
    Run() error
    String() string
}

위 내용은 Go 마이크로서비스 프레임워크 go-micro의 전체 아키텍처 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제