创建 http 服务器

  1. package main
  2.  
  3. import (
  4. "net/http"
  5.  
  6. "github.com/hprose/hprose-golang/rpc"
  7. )
  8.  
  9. func hello(name string) string {
  10. return "Hello " + name + "!"
  11. }
  12.  
  13. func main() {
  14. service := rpc.NewHTTPService()
  15. service.AddFunction("hello", hello)
  16. http.ListenAndServe(":8080", service)
  17. }

创建 fasthttp 服务器

  1. package main
  2.  
  3. import (
  4. rpc "github.com/hprose/hprose-golang/rpc/fasthttp"
  5. "github.com/valyala/fasthttp"
  6. )
  7.  
  8. func hello(name string) string {
  9. return "Hello " + name + "!"
  10. }
  11.  
  12. func main() {
  13. service := rpc.NewFastHTTPService()
  14. service.AddFunction("hello", hello)
  15. fasthttp.ListenAndServe(":8080", service.ServeFastHTTP)
  16. }

对比上面两个服务,我们发现服务函数(方法)的编写和发布上是没有区别的,区别只在于创建服务器所使用的构造函数和启动服务器所使用的库。

hello
import

创建 TCP 服务器

  1. package main
  2.  
  3. import (
  4. "github.com/hprose/hprose-golang/rpc"
  5. )
  6.  
  7. func hello(name string) string {
  8. return "Hello " + name + "!"
  9. }
  10.  
  11. func main() {
  12. server := rpc.NewTCPServer("tcp4://0.0.0.0:4321/")
  13. server.AddFunction("hello", hello)
  14. server.Start()
  15. }
TCPServerTCPServiceTCPService
  1. service := rpc.NewTCPService()
  2. service.AddFunction("hello", hello)
  3. addr, _ := net.ResolveTCPAddr("tcp", ":4321")
  4. listener, _ := net.ListenTCP("tcp", addr)
  5. service.ServeTCP(listener)
serviceservicelistener

创建 Unix Socket 服务器

  1. package main
  2.  
  3. import (
  4. "github.com/hprose/hprose-golang/rpc"
  5. )
  6.  
  7. func hello(name string) string {
  8. return "Hello " + name + "!"
  9. }
  10.  
  11. func main() {
  12. server := rpc.NewUnixServer("unix:/tmp/my.sock")
  13. server.AddFunction("hello", hello)
  14. server.Start()
  15. }
UnixServiceTCPService

创建 WebSocket 服务器

  1. package main
  2.  
  3. import (
  4. "net/http"
  5.  
  6. rpc "github.com/hprose/hprose-golang/rpc/websocket"
  7. )
  8.  
  9. func hello(name string) string {
  10. return "Hello " + name + "!"
  11. }
  12.  
  13. func main() {
  14. service := rpc.NewWebSocketService()
  15. service.AddFunction("hello", hello)
  16. http.ListenAndServe(":8080", service)
  17. }

这个跟 HTTP 服务器的创建很类似,而且这个 WebSocket 的 hprose 服务器,同时也是一个 HTTP 的 hprose 服务器,它可以同时接受 HTTP 和 WebSocket 的 hprose 客户端请求。

import

跟 gin 框架结合

HTTP\HTTPS 和 WebSocket 服务并没有单独实现 Server,而只是实现了 Service,所以,这些服务器的启动与关闭依赖于你所使用的 http 库或框架。上面在创建服务器一节中,我们已经介绍了使用 net/http 和 fasthttp 如何来创建服务器。下面我们再举一个在 gin 框架下面如何发布服务的例子:

  1. package main
  2.  
  3. import (
  4. "github.com/hprose/hprose-golang/rpc"
  5. "gopkg.in/gin-gonic/gin.v1"
  6. )
  7.  
  8. func hello(name string) string {
  9. return "Hello " + name + "!"
  10. }
  11.  
  12. func main() {
  13. service := rpc.NewHTTPService()
  14. service.AddFunction("hello", hello)
  15. router := gin.Default()
  16. router.Any("/path", func(c *gin.Context) {
  17. service.ServeHTTP(c.Writer, c.Request)
  18. })
  19. router.Run(":8080")
  20. }
"/path"
rpc.NewHTTPService()rpc.NewWebSocketService()

跟 echo 框架结合

  1. package main
  2.  
  3. import (
  4. "github.com/hprose/hprose-golang/rpc"
  5. "github.com/labstack/echo"
  6. )
  7.  
  8. func hello(name string) string {
  9. return "Hello " + name + "!"
  10. }
  11.  
  12. func main() {
  13. service := rpc.NewHTTPService()
  14. service.AddFunction("hello", hello)
  15. e := echo.New()
  16. e.Any("/path", echo.WrapHandler(service))
  17. e.Start(":8080")
  18. }
"/path"
rpc.NewHTTPService()rpc.NewWebSocketService()

跟 beego 框架结合

  1. package main
  2.  
  3. import (
  4. "github.com/astaxie/beego"
  5. "github.com/hprose/hprose-golang/rpc"
  6. )
  7.  
  8. func hello(name string) string {
  9. return "Hello " + name + "!"
  10. }
  11.  
  12. func main() {
  13. service := rpc.NewHTTPService()
  14. service.AddFunction("hello", hello)
  15. beego.Handler("/path", service)
  16. beego.Run()
  17. }

发布 WebSocket 服务的方式,跟 gin 和 echo 一样。

跟 iris 框架结合

  1. package main
  2.  
  3. import (
  4. rpc "github.com/hprose/hprose-golang/rpc/fasthttp"
  5. "github.com/kataras/iris"
  6. )
  7.  
  8. func hello(name string) string {
  9. return "Hello " + name + "!"
  10. }
  11.  
  12. func main() {
  13. service := rpc.NewFastHTTPService()
  14. service.AddFunction("hello", hello)
  15. iris.Any("/path", func(c *iris.Context) {
  16. service.ServeFastHTTP(c.RequestCtx)
  17. })
  18. iris.Listen(":8080")
  19. }
FastHTTPService

Socket 服务器的启动与关闭

TCPServerUnixServer

Start 和 Handle 方法区别

TCPServerUnixServerStartHandle
HandleHandle
StartStart
syscall.SIGHUP

Stop 和 Close 方法的区别

StopStartCloseHandleStopsyscall.SIGQUITStartHandleStopCloseHandle

Restart 方法

RestartStartHandle