五邑隱俠,本名關健昌,12年遊戲生涯。 本教程以Go語言為例。
 
P2P網絡為服務進程間、服務進程與客戶端間通信提供了便利,在這個基礎上可以搭建服務。
在服務層,通信包可以通過定義協議號來確定該包怎樣處理。每個協議號對應一個Processor,Processor定義為一個interface
type Processor interface {
    OnHandleRequest(req *Request, resp *Response) (int32, error)
}

協議號又可以拆分為模塊號和命令號。一個模塊對應一個Service,該模塊下每個命令對應一個Processor,通過map結構做映射

type Service struct {
    mapCmd2Processor map[uint16]Processor
}
Service提供方法添加、删除、獲取Processor
func AddProcessor(cmd uint16, p Processor) error
func GetProcessor(cmd uint16) Processor
func RemoveProcessor(cmd uint16) error
提供個入口方法,把該模塊的Service的請求分發到對應的Processor
func (s *Service) OnHandleRequest(req *Request, resp *Response) (int32, error) {
p, ok := s.mapCmd2Processor[req.Cmd]
    if ok {
        return p.OnHandleRequest(req, resp)
    }
}
服務 Server 是 Service 的集合,通過模塊號進行映射
type Server struct {
    mapMod2Service map[uint16]*Service
    rpc            *Rpc
}
同樣提供方法添加、删除、獲取Service
func AddService(mod uint16, srv *Service) error
func GetService(mod uint16) *Service
func RemoveService(mod uint16) error
這樣當收到一個請求包,對協議號拆分為模塊號和命令號,通過模塊號獲取到對應的Service,調用Service的 OnHandleRequest 進行處理
serv := s.GetService(req.Mod)
if serv != nil {
code, err := serv.OnHandleRequest(req, resp)
}
Server 基於 P2P 層,P2P的包是通用的格式,不同的遊戲服務端進程,都有可能有不同的包格式,例如,客戶端包格式和服務內部通信的包格式是有差別的。為了讓服務通用,引入服務適配器,在請求和響應時做預處理,轉化為通用的 Request 和 Response
type ServerAdapter interface {
    OnRequest(payload []byte) (*Request, error)
    OnResponse(pack *Response) ([]byte, error)
} type Server struct {
    mapMod2Service map[uint16]*Service
    rpc            *Rpc adapter        ServerAdapter
}
這樣在服務層都是基於 Request 和 Response進行處理,由具體業務對業務包做轉換
type Request struct {
    Mod      uint16
    Cmd      uint16
    Payload  []byte
} type Response struct {
    Mod      uint16
    Cmd      uint16
    Payload  []byte
}
服務 Server 還可以提供攔截器,攔截器的好處是對一些階段進行統一處理,而且可以通過插入新攔截器進行擴展,隨時都可以替換這個階段的邏輯(例如從 json 包變成 proto 包、增加二進制頭等),攔截器可以針對3個階段: 請求處理前,請求處理後,響應發送後
type Interceptor interface {
    OnPreHandle(req *Request, resp *Response) (int32, error)
    OnHandleCompletion(req *Request, resp *Response) (int32, error)
    OnResponseCompletion(req *Request, resp *Response) error
}
除了全局攔截器,還可以添加針對某個模塊 Service 的攔截器,對某個 Service 做特殊攔截處理
type InterceptorList []Interceptor
type Server struct {
    mapMod2Service map[uint16]*Service
    rpc            *Rpc adapter        ServerAdapter
globalInterceptors InterceptorList
mapMod2Interceptors map[uint16]InterceptorList
}
這樣一個請求的處理過程就變成
// adapter
req, err := s.adapter.OnRequest(payload)
resp := NewResponse(req)
// prehandle
interList, ok := s.mapMod2Interceptors[req.Mod]
s.prehandle(interList, ok, req, resp)
// handle
serv := s.GetService(req.Mod)
code, err := serv.OnHandleRequest(req, resp)
// handle complete
s.handleCompletion(interList, ok, req, resp)
s.push(resp)
// response complete
s.responseCompletion(interList, ok, req, resp)
服務機制介紹到這裏,接下來聊聊 RPC 機制

go語言遊戲服務端開發(三)——服務機制的更多相關文章

  1. Swift3.0服務端開發(三) Mustache頁面模板與日志記錄

    本篇博客主要介紹如果在Perfect工程中引入和使用Mustache頁面模板與日志記錄系統.Mustache頁面模板類似於PHP中的smarty模板引擎或者Java中的JSTL標簽.當然Mustach ...

  2. kafka客戶端和服務端開發(三)

    前面我們已經搭建了kafka的單機和集群環境,分別寫了簡單的實例代碼,對於代碼裏面使用到的參數並沒有做解釋.下面我們來詳細說一下各個參數的作用. 1. 創建kafka生產者 kafka生產者有3個必選 ...

  3. 俯瞰 Java 服務端開發

    原文首發於 github ,歡迎 star . Java 服務端開發是一個非常寬廣的領域,要概括其全貌,即使是幾本書也講不完,該文將會提到許多的技術及工具,但不會深入去講解,旨在以一個俯瞰的視角去探尋 ...

  4. Swift3.0服務端開發(一) 完整示例概述及Perfect環境搭建與配置(服務端+iOS端)

    本篇博客算是一個開頭,接下來會持續更新使用Swift3.0開發服務端相關的博客.當然,我們使用目前使用Swift開發服務端較為成熟的框架Perfect來實現.Perfect框架是加拿大一個創業團隊開發 ...

  5. 微服務項目開發學成在線_day01_CMS服務端開發

    05-CMS需求分析-什麼是CMS 什麼是CMS?CMS (Content Management System)即內容管理系統,不同的項目對CMS的定比特不同.CMS有哪些類型? 每個公司對每個項目的C ...

  6. Day01_搭建環境&CMS服務端開發

    學成在線 第1天 講義-項目概述 CMS接口開發 1 項目的功能構架 1.1 項目背景 受互聯網+概念的催化,當今中國在線教育市場的發展可謂是百花齊放.如火如荼. 按照市場領域細分為:學前教育.K12 ...

  7. Swift3.0服務端開發(五) 記事本的開發(iOS端+服務端)

    前邊以及陸陸續續的介紹了使用Swift3.0開發的服務端應用程序的Perfect框架.本篇博客就做一個階段性的總結,做一個完整的實例,其實這個實例在<Swift3.0服務端開發(一)>這篇 ...

  8. 如何有效快速提高Java服務端開發人員的技術水平?

    我相信很多工作了3-5年的開發人員都會經常問自己幾個問題: 1.為什麼總是感覺技術沒有質的提高? 2.如何能够有效和快速的提高自身的技術水平? 3.如何進入到一個牛逼的大公司,認識牛逼的人? 這篇文章 ...

  9. 從架構師視角看是否該用Kotlin做服務端開發?

    前言 自從Oracle收購Sun之後,對Java收費或加强控制的嘗試從未間斷,穀歌與Oracle圍繞Java API的官司也跌宕起伏.雖然Oracle只是針對Oracle JDK8的昇級收費,並釋放了 ...

  10. RTSP服務端開發概述

    一 概述 RTSP(Real Time Streaming Protocol),RFC2326,實時音視頻流傳輸協議,是TCP/IP協議體系中的一個應用層協議.該協議定義了一對多應用程序如何有效地通過 ...

隨機推薦

  1. 【HTML5&amp;CSS3進階04】CSS3動畫應該如何在webapp中運用

    動畫在webapp的現狀 webapp模式的網站追求的就是一個體驗,是HTML5&CSS3浪潮下的產物,拋開體驗不說,webapp模式門檻比較高: 而體驗優化的一個重點便是動畫,可以說動畫是w ...

  2. Java NIO3:通道和文件通道

    通道是什麼 通道式(Channel)是java.nio的第二個主要創新.通道既不是一個擴展也不是一項增强,而是全新的.極好的Java I/O示例,提供與I/O服務的直接連接.Channel用於在字節緩 ...

  3. C語言程序設計第六次作業

    同學們,本周我們已經學完了順序結構.選擇結構和循環結構,你都理解並掌握了嗎?現在就好好理理思路,做個階段總結吧.本周的知識點總結要求大家在理解的基礎上對結構化程序設計的三種基本結構做一個全面的總結. ...

  4. tomee 消息持久化

    http://tomee.apache.org/jms-resources-and-mdb-container.html http://activemq.apache.org/xml-configur ...

  5. 百萬程序員的苦惱-選擇VB.NET還是C#

    在過去的一年中,互聯網上的各大討論區或者電子郵件的討論列錶都對微軟的VB.NET以及C#的各種優越性做了探討.這些討論圍繞的主要問題就是,我應該先學哪一個,VB.NET還是C#?? 我寫這篇文章的目的 ...

  6. linux的nohup命令的用法

    在應用Unix/Linux時,我們一般想讓某個程序在後臺運行,於是我們將常會用 & 在程序結尾來讓程序自動運行.比如我們要運行mysql在後臺: /usr/local/mysql/bin/my ...

  7. Core Data(數據持久化)

    Core Data可能是OS X和iOS中最容易被誤解的框架之一了.為了幫助大家理解,我們將快速研究Core Data,來看一下它是關於什麼的.為了正確使用Core Data, 有必要理解其概念.幾乎 ...

  8. Mybatis Cause: java.lang.ClassNotFoundException: Cannot find class:

    MyBatis原因:java.lang.ClassNotFoundException:找不到類. 原因你的xml文件中的返回類型錯誤,沒有找到這個類. 檢查類名是否正確,檢查路徑是否正確. 在複制my ...

  9. python操作Excel的庫openpyxl

    http://openpyxl.readthedocs.io/en/default/tutorial.html 這裏先上該庫的文檔鎮文. 1,遇到合並後的單元格信息讀取的問題,通過使用cell中off ...

  10. Codeforces 17E Palisection 【Manacher】

    Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...