微服務
- 把每一個功能抽取成一個一個的服務
- 微服務之間通路是輕量級的,RPC
如何通信
- 網絡傳輸,用RPC(遠端過程調用)
- HTTP傳輸,GET POST PUT DELETE
- 基于TCP,更靠底層,RPC基于TCP,Dubbo(18年底改成支援各種語言),Grpc,Thrift
- 調用誰,用服務注冊和發現(分布式資料同步:etcd,consul,zk)
微服務層
RPC
簡介
- 遠端過程調用(Remote Procedure Call,RPC)是一個計算機通信協定
- 該協定允許運作于一台計算機的程式調用另一台計算機的子程式,而程式員無需額外地為這個互動作用程式設計
簡單的RPC案例
服務端(建立一個電腦服務)
package main
import (
"fmt"
"log"
"net/http"
"net/rpc"
)
func main() {
rpc.Register(new(Cal)) // 注冊一個服務
rpc.HandleHTTP() // 服務處理綁定到http協定上
// 監聽服務
if err := http.ListenAndServe(":8000", nil); err != nil {
log.Panicln(err)
}
}
// Params 參數
type Params struct {
A int
B int
}
// Cal (計算)定義一個接口結構體對象
type Cal struct{}
// Add 為Cal添加求和方法
func (o Cal) Add(p *Params, r *int) error {
fmt.Println("ok")
*r = p.A + p.B
return nil
}
用戶端(通過rpc函數調用服務)
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
conn, err := rpc.DialHTTP("tcp", ":8000")
if err != nil {
log.Panicln(err)
}
var result int
if err := conn.Call("Cal.Add", Params{A: 1, B: 3}, &result); err != nil {
log.Panicln(err)
}
defer conn.Close()
fmt.Println("result = ", result)
}
type Params struct {
A int
B int
}
總結
- 用戶端根據rpc協定進行網絡通信
- 用戶端是可以跨語言通信的
- 既然跨語言,那麼服務之間需要一個服務發現,用戶端從服務發現服務中擷取服務
- 綜上所訴,對于一個平台不通功能都将注冊進注冊中心,用戶端從注冊中心發現服務
- 前端怎麼調用?