23.创建grpc网关的基本设置和运行方法

首先创建grpc服务原来是micro.NewService还支持http等其他访问方式,但是grpc.NewService这种方法只支持grpc访问,所以需要创建网关让其支持http访问

package main

import (
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/registry/etcd"
    "github.com/micro/go-micro/service/grpc"
    "micro/Services"
    "micro/ServicesImpl"
)

func main() {
    //consulReg := consul.NewRegistry(registry.Addrs("localhost:8500"))
    etcdReg := etcd.NewRegistry(registry.Addrs("106.12.72.181:23791"))
    myservice := grpc.NewService( //原来是micro.NewService还支持http等其他访问方式,但是grpc这种方法只支持grpc访问,所以需要创建网关让其支持http访问
        micro.Name("api.xiahualou.com.test"),
        micro.Address(":8001"),
        micro.Registry(etcdReg),
        //micro.Registry(consulReg),
    )
    Services.RegisterTestServiceHandler(myservice.Server(), new(ServicesImpl.TestService))
    myservice.Run()
}

先安装下面几个工具

因为grpc-gateway生成出来的文件会和go-micro生成的文件有几个函数会同名,所以不能放在一个package下面,所以我们把新建一个文件夹serviceGW用来放网关文件,避免冲突

cd Services/protos
protoc --micro_out=../ --go_out=../ test.proto
protoc-go-inject-tag -input=../test.pb.go

#生成网关文件
protoc --go_out=plugins=grpc:../../ServiceGW test.proto
protoc --grpc-gateway_out=logtostderr=true:../../ServiceGW test.proto
cd .. && cd ..

把生成网关文件的package改成ServiceGW,原來是Services,因为我们proto文件中定义的是Services

启动grpc服务

package main

import (
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/registry/etcd"
    "github.com/micro/go-micro/service/grpc"
    "micro/Services"
    "micro/ServicesImpl"
)

func main() {
    //consulReg := consul.NewRegistry(registry.Addrs("localhost:8500"))
    etcdReg := etcd.NewRegistry(registry.Addrs("106.12.72.181:23791"))
    myservice := grpc.NewService(
        micro.Name("api.xiahualou.com.test"),
        micro.Address(":8001"),
        micro.Registry(etcdReg),
        //micro.Registry(consulReg),
    )
    Services.RegisterTestServiceHandler(myservice.Server(), new(ServicesImpl.TestService))
    myservice.Run()
}

启动网关服务

package main

import (
    "context"
    "github.com/grpc-ecosystem/grpc-gateway/runtime"
    "google.golang.org/grpc"
    "log"
    "micro/ServiceGW"
    "net/http"
)

func main() {
    ctx := context.Background()
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()
    gRpcEndPoint := "localhost:8001"
    mux := runtime.NewServeMux()
    opts := []grpc.DialOption{grpc.WithInsecure()} //不使用证书校验
    err := ServiceGW.RegisterTestServiceHandlerFromEndpoint(ctx, mux, gRpcEndPoint, opts) //gRpcEndPoint在这里的作用是当有请求来到9000端口会转发给8001端口
    if err != nil {
        log.Fatal(err)
    }
    http.ListenAndServe(":9000", mux)//通过postman访问9000端口服务会转发给8001端口的rpc服务
}

通过post使用http请求访问可以拿到结果,这里请求的url就是我们proto文件中定义好的

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/hualou/p/12142153.html

时间: 2024-11-05 20:26:38

23.创建grpc网关的基本设置和运行方法的相关文章

[.Net Core] - 在 .NET Core 中创建 gRPC 服务端和客户端

gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户端 2.1 基于控制台应用程序模板创建 gRPC Client 项目,并安装 Nuget 包(Google.Protobuf,Grpc,Grpc.Core,Grpc.Tools). 2.2 拷贝 Server 项目中的 Protos/greet.proto 文件到 Client 项目中 2.3 更新

Python学习笔记(四十三)virtualenv (创建一套“隔离”的Python运行环境)

摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432712108300322c61f256c74803b43bfd65c6f8d0d0000 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下.(Linux) 如果我们要同时开发多个应用程序,那这些应用程

由ORACLE_SID想到脚本的四种运行方法

以前学习脚本知道一个概念,关于脚本运行方式的问题,我们熟知的脚本运行方式有以下几种: (1)../script.sh (点斜线脚本) (2).sh script.sh (sh空格脚本) (3).source script.sh (source空格脚本) (4).. script.sh (点空格脚本) 先写个简单的脚本,把执行结果贴在下面,然后分别对这几种脚本运行方式作解释. script.sh内容如下: ------------------------------- #!/bin/bash ec

微信Android SDK示例代码及运行方法

最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一个是微信的开发文档,一个是微信SDK的范例代码.无奈文档小白很难看懂,范例代码又没有详细的解释,导致我折腾了好多天,现在有点眉目了,先记下来. 1.申请应用AppKey 微信的SDK要求应用的包名.签名的MD5.AppID严格对应,所以没有申请的应用是肯定无法使用的.申请了的应用如果这三个对不上,是无法使用的. ·包名,是应用建立时候的名称,你可以在AndroidManifest.xml文件的package项中找到 ·签名

23种设计模式(2):工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } interface IFactory { publ

浅析设计模式(四)——创建型模式之simple-factory(简单工厂方法,非设计模式)

简单工厂方法simple-factory 注:部分内容参考自<Head First设计模式>和GoF<设计模式:可复用面向对象软件的基础> 首先需要说明的是:简单工厂方法不是一种设计模式,它更像是一种编程习惯. 定义:简单工厂方法把变化的部分(即创建对象的细节)封装起来,即通过工厂类(Factory)来处理创建对象的细节. 这种处理方式把创建对象的细节进行了简单的封装,单独进行管理,使之解耦,便于维护. 例如:要创建不同类型的Pizza,我们不在PizzaStore的方法中直接根据

SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法

不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑.SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本文我们主要要介绍的内容,情况是这样的:我们在用SQL Server 2008 建完表后,插入或修改任意列时,提示:当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成

利用JavaScript如何创建一个table表格[第2种方法]

创建一个五行五列的表格(使用循环) <style> td{border:1px solid #ccc;} </style> <script> window.onload=function(){ var oTable=document.createElement("table"); var row; var cell; for(var i=0;i<5;i++){ row=document.createElement("tr")

泊松表面重建项目运行方法

1.打开项目的试图如下: 2.右键项目属性-->配置属性-->调试-->命令参数 添加如下命令代码 --in bunny.points.ply --out 1.ply --verbose 3.运行后生成的结果 4.运行时的控制台窗口视图 现在已经有新版的,不过运行方法是类似的.可参这个来运行.Good luck!