天天看點

golang快速入門--RPC-微服務微服務如何通信微服務層RPC

微服務

  • 把每一個功能抽取成一個一個的服務
  • 微服務之間通路是輕量級的,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協定進行網絡通信
  • 用戶端是可以跨語言通信的
  • 既然跨語言,那麼服務之間需要一個服務發現,用戶端從服務發現服務中擷取服務
  • 綜上所訴,對于一個平台不通功能都将注冊進注冊中心,用戶端從注冊中心發現服務
  • 前端怎麼調用?