①建立HTTP协议
http.InitServlet(HTTP_PROT)
初始化一个路由
func InitServlet(port int) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
//初始化一个路由
router := newRouter()
server := http.Server{
Addr: fmt.Sprintf(":%d", port),
Handler: router,
}
log.Printf(("HTTP SERVER STARTING AND LISTENING AT: %d"), port)
err := server.ListenAndServe()
if err != nil {
log.Panic("HTTP SERVER STARTING AND LISTENING" + err.Error())
}
}
②定义路由
封装路由
func newRouter() *httprouter.Router {
router := httprouter.New()
//notFound方法的实现(具体见源码)
router.NotFound = new(notFound)
//methodNotAllow方法的实现(具体见源码)
router.MethodNotAllowed = new(methodNotAllow)
router_user(router)
return router
}
绑定路由
func router_user(router *httprouter.Router) {
router.POST("/add", handler(c.POST_AddUser))
router.GET("/find", handler(c.GET_FindUser))
}
③实现路由绑定的方法(controller)
func POST_AddUser(response http.ResponseWriter, request *http.Request, ps httprouter.Params) {
req := new(bean.UserRequest)
err := rw.ReadBody(request, req)
if err != nil {
rw.WriteErrResp(errCode.PAR_PARAMETER_NOT_LEGAL, "参数不合法", response)
return
}
//调用service
res, err := service.AddUser(req)
if err != nil {
rw.WriteErrResp(errCode.SERVICE_BUSSY, "服务繁忙", response)
}
rw.WriteDataResult(int(res.Code), res.Msg, res, response)
}
(具体实现见源码)
WriteErrResp:返回表示错误的数据
WriteDataResult:返回表示成功和传给前端的数据
errCode.PAR_PARAMETER_NOT_LEGAL:4012
errCode.SERVICE_BUSSY:5000
④实现路由绑定的方法(service)
func AddUser(req *bean.UserRequest) (*bean.UserResponse, error) {
//由service调用grpc的client端
return client.AddUser(req)
}
⑤实现路由绑定的方法(service→grpc.client)
func AddUser(req *bean.UserRequest) (*bean.UserResponse, error) {
//获取一个RPC连接
conn := getRPCClient()
if conn == nil {
return nil, errors.New("RPC连接失败")
}
defer conn.Close()
client := bean.NewUserServiceClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), TIME_OUT*time.Second)
defer cancel()
res, err := client.User(ctx, req)
if err != nil {
return nil, err
}
return res, nil
}
获取grpc连接
func getRPCClient() *grpc.ClientConn {
conn, err := grpc.Dial("127.0.0.1:7801", grpc.WithInsecure())
if err != nil {
return nil
}
return conn
}
最后结合grpc服务端使用postman测试