Micro微服务框架解决了什么问题
- 为微服务业务开发提供了开箱即用的脚手架,包括服务治理、服务发现/注册,服务监控,调用链路追踪等
- 高度插件,支持定制业务开发
- Micro脚手架还提供了简单的网关功能
Micro V3代码目录结构
├── api
├── auth
├── broker <发布订阅>
├── client <rpc/http客户端>
├── cmd
├── codec <编码解码>
├── config <配置类>
├── logger
├── metadata
├── plugins <自定义插件接口>
├── registry <服务注册&发现>
├── selector <客户端负载均衡选择器>
├── server <服务端>
├── store <自定义存储>
├── transport <http请求翻译成rpc>
└── util <工具集>
Micro V3源码之Service
- Service也是一个接口,service是一个应用程序调用micro服务的最外层入口,一般在main中
- Service源码
type Service interface {
Name() string
Init(...Option)
Options() Options
Client() client.Client
Server() server.Server
Run() error
String() string
}
- Service实际上是Clien和Server的包装
- main中引入Service
func main() {
srv := rpc.GetNewOrderService()
_ = pb.RegisterOrderHandler(srv.Server(), new(handler.Order))
if err := srv.Run(); err != nil {
library.NewLogger().Fatalf("order-service.main srv.run() error: %v", err)
}
}
- Service初始化 - step 1
func newService(opts ...Option) Service {
service := new(service)
options := newOptions(opts...)
serviceName := options.Server.Options().Name
options.Client = wrapper.FromService(serviceName, options.Client)
options.Client = wrapper.TraceCall(serviceName, trace.DefaultTracer, options.Client)
err := options.Server.Init(
server.WrapHandler(wrapper.HandlerStats(stats.DefaultStats)),
server.WrapHandler(wrapper.TraceHandler(trace.DefaultTracer)),
)
if err != nil {
logger.Fatal(err)
}
service.opts = options
return service
}
func newOptions(opts ...Option) Options {
opt := Options{
Auth: auth.DefaultAuth,
Broker: broker.DefaultBroker,
Cmd: cmd.DefaultCmd,
Config: config.DefaultConfig,
Client: client.DefaultClient,
Server: server.DefaultServer,
Store: store.DefaultStore,
Registry: registry.DefaultRegistry,
Runtime: runtime.DefaultRuntime,
Transport: transport.DefaultTransport,
Context: context.Background(),
Signal: true,
}
for _, o := range opts {
o(&opt)
}
return opt
}
Micro V3源码之Server
type Server interface {
Init(...Option) error
Options() Options
Handle(Handler) error
NewHandler(interface{}, ...HandlerOption) Handler
NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
Subscribe(Subscriber) error
Start() error
Stop() error
String() string
}
type Router interface {
ProcessMessage(context.Context, Message) error
ServeRequest(context.Context, Request, Response) error
}
type rpcServer struct {
router *router
exit chan chan error
sync.RWMutex
opts Options
handlers map[string]Handler
subscribers map[Subscriber][]broker.Subscriber
started bool
registered bool
subscriber broker.Subscriber
wg *sync.WaitGroup
rsvc *registry.Service
}
未完待续...