제품 입 안의 작은 프로젝트는 프로젝트 수립부터 개발, 출시까지 시간과 수요가 계속 급증함에 따라 초기 프로젝트 아키텍처를 설계하지 않으면 점점 더 복잡해지고 큰 프로젝트로 변하게 됩니다. 음, 코드는 점점 더 비대해지고 유지 관리가 어려워질 것이며, 이후의 각 제품 반복은 전체에 영향을 미칠 것입니다.
마이크로서비스 기반 프로젝트와 모듈 간의 느슨하게 결합된 관계는 유지 관리 비용이 증가하지만 여전히 가치가 있습니다.
마이크로서비스 프로젝트의 안정성 외에도 저는 개인적으로 다음과 같은 몇 가지 문제에 대해 우려하고 있습니다.
1: 서비스 간 데이터 전송의 효율성과 보안.
둘째: 서비스의 동적 확장, 즉 서비스 등록 및 검색, 서비스 클러스터링입니다.
셋: 마이크로서비스 기능은 사용자 정의가 가능합니다. 왜냐하면 모든 기능이 귀하의 요구 사항을 충족할 수는 없기 때문입니다. 귀하의 필요에 따라 일부 기능을 개발해야 하는 것은 불가피합니다.
go-micro는 go 언어를 기반으로 한 훌륭한 rpc 마이크로서비스 프레임워크입니다. 완벽한 기능을 갖추고 있으며 제가 우려하는 몇 가지 문제를 해결했습니다.
1: 서비스 간 전송 형식은 protobuf이므로 효율적입니다. 위에서 언급했듯이 매우 빠르고 안전합니다.
2: Go-micro의 서비스 등록 및 검색은 다양합니다. 저는 개인적으로 etcdv3의 서비스 검색 및 등록을 선호합니다.
3: 주요 기능에는 해당 인터페이스가 구현되어 있으므로 필요에 따라 플러그인을 사용자 정의할 수 있습니다.
여가시간에 go-micro의 소스코드를 체계적으로 읽어보니 이 프레임워크가 잘 작성되었다는 느낌이 들었고 많은 것을 배웠습니다. 나는 일련의 게시물을 편집하고 go-micro를 학습한 경험을 모든 사람과 공유하고 싶습니다.
go-micro의 통신 프로세스는 다음과 같습니다
서버는 클라이언트의 호출을 모니터링하고 Brocker가 푸시한 정보를 처리합니다. 그리고 서버는 클라이언트가 서버의 상태를 알 수 있도록 Register에 서버의 존재 또는 소멸을 등록해야 합니다.
등록 서비스를 검색하세요.
클라이언트는 등록기에서 서버 정보를 얻은 후 각 통화에 대한 알고리즘을 기반으로 통신할 서버를 선택합니다. 물론 통신에는 인코딩/디코딩 및 전송 프로토콜 선택과 같은 일련의 프로세스가 필요합니다.
모든 서버에 통보해야 하는 경우 Brocker를 사용하여 정보를 푸시할 수 있습니다.
브로커 정보 큐는 정보를 수신하고 게시합니다.
go-micro가 고도로 맞춤화될 수 있는 이유는 go-micro가 8개의 주요 인터페이스로 구성되어 있기 때문입니다. 각 인터페이스는 자체 요구 사항에 따라 다시 구현될 수 있습니다. 고마이크로의 구조.
이러한 go-micir 인터페이스에는 자체 기본 구현이 있으며 이러한 인터페이스 구현의 대안인 go-plugin도 있습니다. 필요에 따라 자체 플러그인을 구현할 수도 있습니다.
이 게시물은 주로 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 클러스터를 직접 사용할 수 없기 때문에 개인적으로는 추천하지 않습니다
我个人比较喜欢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 중국어 웹사이트의 기타 관련 기사를 참조하세요!