这是我参与「第五届青训营 」伴学笔记创作活动的第 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 一般的都具有自定义传输协议,其网络字节流一般包含 固定长度消息头 和 变长消息体 两部分