新聞中心
引言?
"微服務(wù)"這個(gè)概念想必不用我說(shuō)大家都知道,就算沒(méi)接觸過(guò)也聽(tīng)說(shuō)過(guò)。簡(jiǎn)單來(lái)說(shuō)就是以前系統(tǒng)中的,用戶,搜索,內(nèi)容,等等模塊都在一起,這樣會(huì)導(dǎo)致代碼「越來(lái)越冗余,越來(lái)越難維護(hù)」,所以往往需要拆分這些服務(wù),微服務(wù)在拆分的時(shí)候,會(huì)根據(jù)業(yè)務(wù)功能模塊把一個(gè)單體的應(yīng)用拆分成許多個(gè)獨(dú)立的項(xiàng)目,每個(gè)項(xiàng)目完成一部分的業(yè)務(wù)功能,然后獨(dú)立開發(fā)和部署。這些獨(dú)立的項(xiàng)目就成為一個(gè)微服務(wù)。進(jìn)而構(gòu)成一個(gè)「服務(wù)集群」。看下面兩張圖可能會(huì)對(duì)微服務(wù)的概念更加直觀。

成都創(chuàng)新互聯(lián)公司長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昌平企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),昌平網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
單體服務(wù)
單體服務(wù)
微服務(wù)
微服務(wù)
RPC介紹?
微服務(wù)中很重要的一個(gè)內(nèi)容就是「RPC」遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,縮寫為 RPC)是一個(gè)計(jì)算機(jī)通信協(xié)議,他的主要作用是「允許運(yùn)行于一臺(tái)計(jì)算機(jī)的程序調(diào)用另一臺(tái)計(jì)算機(jī)的子程序,而程序員無(wú)需額外地為這個(gè)交互作用編程」。
那么RPC是如何實(shí)現(xiàn)的呢?今天咱們就以golang為工具,給大家實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用rpc輸出helloWorld。
RPC實(shí)現(xiàn)步驟?
其實(shí)RPC的實(shí)現(xiàn)和網(wǎng)絡(luò)編程有點(diǎn)像,A服務(wù)需要遠(yuǎn)程調(diào)用B服務(wù)的某個(gè)方法,在這種情況下我們就把B服務(wù)稱為「服務(wù)端」,A稱為「客戶端」。
具體實(shí)現(xiàn)步驟如下圖:
RPC實(shí)現(xiàn)步驟
服務(wù)端?
1、注冊(cè)服務(wù)對(duì)象,綁定類方法
rpc.ResisterName("服務(wù)名","回調(diào)對(duì)象")ResisterName函數(shù)解釋
func RegisterName(name string, rcvr interface{}) error
//參數(shù)解釋
//name 服務(wù)名(自己隨便取),字符串類型
//rcvr 對(duì)應(yīng)的RPC對(duì)象,該對(duì)象綁定的方法需要滿足如下條件
1)方法必須是導(dǎo)出的(包外可見(jiàn)),在golang中的體現(xiàn)為,方法名首字母大寫
2)方法必須有兩個(gè)參數(shù),都是導(dǎo)出類型,內(nèi)建類型
3) 方法的第二個(gè)參數(shù)(也就是客戶端調(diào)用遠(yuǎn)程函數(shù)中的傳出參數(shù)),必須指針(傳出參數(shù))
4) 該方法只有一個(gè)返回值,就是error接口類型的返回值下面我們針對(duì)參數(shù)2舉個(gè)例子,比如下面這個(gè)方法TestMethod 就是符合條件的。
type Test struct{
}
//這是符合RegisterName的參數(shù)2的方法名
func (this *Test) TestMethod(name string, resp *string)error{
return nil
}
rpc.RegisterName("test", new(Test)) //注冊(cè)rpc服務(wù)對(duì)象2、創(chuàng)建監(jiān)聽(tīng)器
listener, err := net.Listen()
3、啟動(dòng)監(jiān)聽(tīng),建立鏈接
conn, err := listener.Accept()
4、將鏈接綁定RPC服務(wù)
rpc.ServerConn(conn)
ServerConn函數(shù)解釋
func (server *Server) ServeConn(conn io.ReadWriteCloser)
//參數(shù)conn為成功建立好連接的socket,也就是前面的conn
客戶端?
1、用RPC連接服務(wù)器(服務(wù)端)
conn, err := rpc.Dail()
2、調(diào)用遠(yuǎn)程函數(shù)
conn.Call("服務(wù)名.方法名", "傳入?yún)?shù)", "傳出參數(shù)")func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error
//參數(shù)含義
//serviceMethod "服務(wù)名"."方法名"
//args "傳入?yún)?shù)" 調(diào)用方法需要的參數(shù)
//reply "傳出參數(shù)" 定義一個(gè)變量,對(duì)變量名取地址 &變量,完成傳參代碼示例?
服務(wù)端代碼?
server.go:
package main
import (
"fmt"
"net"
"net/rpc"
)
type Hello struct {
}
func (this *Hello) HelloWorld(name string, resp *string) (err error) {
*resp = name + "您好!"
return err
}
func main() {
//注冊(cè)rpc服務(wù),指定對(duì)象和方法
err := rpc.RegisterName("hello", new(Hello))
if err != nil {
fmt.Println("注冊(cè) err:", err)
return
}
//設(shè)置監(jiān)聽(tīng)
listener, err := net.Listen("tcp", "127.0.0.1:8088")
if err != nil {
fmt.Println("listen err:", err)
return
}
defer listener.Close()
//建立連接
conn, err := listener.Accept()
if err != nil {
fmt.Println("accept err:", err)
return
}
defer conn.Close()
//綁定服務(wù)
rpc.ServeConn(conn)
}
客戶端代碼?
client.go:
package main
import (
"fmt"
"net/rpc"
)
func main() {
//用rpc鏈接服務(wù)器
conn, err := rpc.Dial("tcp", "127.0.0.1:8088")
if err != nil {
fmt.Println("Dial err:", err)
return
}
defer conn.Close()
var resp *string
conn.Call("hello.HelloWorld", "小飯", &resp)
fmt.Println(*resp)
}
分享題目:手把手教你用Golang擼Rpc
地址分享:http://m.fisionsoft.com.cn/article/cciehih.html


咨詢
建站咨詢
