基于go-micro微服务的实战-实现网关Gateway(三)

基于go-micro微服务的实战-实现网关Gateway(三)

文章最后附带完整代码

基于go-micro实现网关层
创建好网关层目录

基于go-micro微服务的实战-实现网关Gateway(三)_第1张图片

  • common: 公告模块,配置初始化等
  • conf: 配置文件
  • handler: 网关Http Api转发的业务逻辑处理
  • pbfile: 存放proto编译后文件
  • proto: proto文件
  • utils: 工具目录
  • router: Http Api路由注册

其它相关的.bat.sh是window和linux下快速执行的执行文件而已,方便使用,无特殊意义。

第一步:配置文件,编写service.conf

都是用的consul做服务注册和发现

##consul注册发现
consul_addr = "127.0.0.1"
consul_port = 8500
第二步:编写proto协议文件和编译生成

复制第2节的user.proto,并同样执行pb.bat或者pb.sh(根据自己的系统)
具体看第2节

第三步:编写网关Gateway服务

首先服务发现处理

	//服务注册
	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
}
第五步:编写网关Http Api的业务逻辑处理

也是基于第三方库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.batgateway.bat,其中用户服务在第2节,启动即可

基于go-micro微服务的实战-实现网关Gateway(三)_第2张图片


启动成功后,测试get请求,浏览器访问 localhost:55001/user/test/1001

get请求


测试post请求,使用Apipost或者postman都可
这里使用Apipost,选用json格式参数

基于go-micro微服务的实战-实现网关Gateway(三)_第3张图片

gitee完整代码链接

你可能感兴趣的:(golang,微服务,golang,微服务,gateway)