微服务学习 | 青训营笔记

34 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

认识微服务

微服务的概念

对于项目中的每个应用模块,使用一套相对独立的小服务来实现。每个应用模块的小服务都有自己独立的进程,不同的进程之间采用轻量级的通讯机制互联,并且可以通过自动化的方式进行部署。

微服务的特点

  • 职责单一
  • 轻量通信
  • 数据隔离
  • 技术多样

微服务架构

通常将微服务划分为硬件层、通信层、应用平台层以及微服务层四个层级。

微服务详解

RPC

  • RPC 意为远程过程调用,是一个计算机通信协议,该协议允许一台计算机程序调用另一台计算机的子程序,而程序员无需为这一交互作用编程,常用的RPC框架有,Dubbo, Motan, Thrift, Grpc

Golang 中 RPC 的实现

golang 官方提供了封装完善的用于 RPC 通信的库,直接参照说明文档上手即可

使用 golang 编写 RPC 程序的注意事项

  • 结构体字段首字母必须大写
  • 函数名首字母必须大写
  • 函数的第一个参数是接收参数,第二个参数是返回参数,都必须是指针类型
  • 函数必须有返回值 error

RPC实现简单的实现两数相加

// 服务端
package main

import (
   "log"
   "net/http"
   "net/rpc"
)

type SumRequest struct {
   Num1 int
   Num2 int
}

type Rect struct {
}

func (r *Rect) MySum(s SumRequest, ret *int) error {
   *ret = s.Num1 + s.Num2
   return nil
}

func main() {
   // 注册服务
   r := new(Rect)
   // 注册一个 rect 服务
   rpc.Register(r)
   // 将服务处理绑定到 http 协议上
   rpc.HandleHTTP()
   // 监听服务
   err := http.ListenAndServe(":8080", nil)
   if err != nil {
      log.Panicln(err)
   }
}

// 客户端
package main

import (
   "log"
   "net/rpc"
)

type Request struct {
   Num1 int
   Num2 int
}

func main() {
   // 远程链接 RPC 服务器
   coon, err := rpc.DialHTTP("tcp", ":8080")
   if err != nil {
      log.Fatal(err)
   }

   // 调用方法
   sum := 0
   err = coon.Call("Rect.MySum", Request{Num1: 50, Num2: 80}, &sum)
   if err != nil {
      log.Println("???")
   }
   log.Println(sum)
}

RPC 网络传输数据格式

RPC 一般的都具有自定义传输协议,其网络字节流一般包含 固定长度消息头 和 变长消息体 两部分