文章最后附带完整代码
其它相关的.bat
和.sh
是window和linux下快速执行的执行文件而已,方便使用,无特殊意义。
都是用的consul做服务注册和发现
##consul注册发现
consul_addr = "127.0.0.1"
consul_port = 8500
复制第2节的user.proto
,并同样执行pb.bat或者pb.sh(根据自己的系统)
具体看第2节
首先服务发现处理
//服务注册
consulRegis := consul.NewRegistry( func(options *registry.Options){
addr := common.EConfig.String("consul_addr")
port, _ := common.EConfig.Int("consul_port")
addrs := fmt.Sprintf("%v:%d", addr, port)
options.Addrs = []string{
addrs,
}
})
接着注册http请求服务,这里是基于go-micro提供的http包来注册web服务,github.com/asim/go-micro/plugins/server/http/v3
//创建web服务
srv := httpServer.NewServer(
server.Name(common.ServerName),
server.Address(address),
)
注册和初始化路由
//注册路由和初始化路由
rou := router.Router()
hd := srv.NewHandler(rou)
if err := srv.Handle(hd); err != nil {
log.Fatalf("Http Handle Err:%v", err)
}
启动服务
//启动服务
common.Service = micro.NewService(
micro.Server(srv),
micro.Registry(consulRegis),
)
if err := common.Service.Run(); err != nil {
log.Fatalf("Http Service Err:%v", err)
}
编写服务快速启动脚本,使用参数指定端口,方便扩容
gateway.bat
go run gateway.go -gate_address :55001
路由是使用第三方库github.com/julienschmidt/httprouter
,具体规则可以查看github查看文档,这里不细讲
func Router() *httprouter.Router{
router := httprouter.New()
//注册路由Get请求
router.GET("/user/test/:user_id", handler.TestUserGet)
//注册路由Post请求
router.POST("/user/test1", handler.TestUserPost)
return router
}
也是基于第三方库github.com/julienschmidt/httprouter
的请求处理
提供了Get和Post的使用方式,以及请求micro的grpc服务的处理
//Get请求参数直接再params取就可以了
func TestUserGet(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
user_id := utils.GetInt(params.ByName("user_id"))
//请求micro的用户服务
service := pb.NewUserService("emicro.user", common.Service.Client())
resp, err := service.TestUser(context.Background(), &pb.TestReq{Id:int32(user_id)})
if err !=nil{
log.Println("TestUserGet err:", err)
http.Error(w, err.Error(), 500)
return
}
log.Println(user_id, resp.Msg, params)
w.Write([]byte(resp.Msg))
}
//获取用户信息1
//Post请求参数要解析
func TestUserPost(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
//解析post参数
var request map[string]interface{}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
log.Println("TestUserPost ParseForm err:", err)
http.Error(w, err.Error(), 500)
return
}
user_id := utils.GetInt(request["user_id"])
//请求micro的用户服务
service := pb.NewUserService("emicro.user", common.Service.Client())
resp, err := service.TestUser(context.Background(), &pb.TestReq{Id:int32(user_id)})
if err !=nil{
log.Println("TestUserGet err:", err)
http.Error(w, err.Error(), 500)
return
}
log.Println(user_id, resp.Msg)
w.Write([]byte(resp.Msg))
}
执行user.bat
和gateway.bat
,其中用户服务在第2节,启动即可
启动成功后,测试get请求,浏览器访问 localhost:55001/user/test/1001
测试post请求,使用Apipost或者postman都可
这里使用Apipost,选用json格式参数
gitee完整代码链接