标签: grpc-web

在本地主机上使用 TLS 的 web gRPC

我有一个使用本地可信证书的 Go 服务器和客户端,它们相互通信完美无缺。现在我希望 Go 服务器也与 web-grpc 实例进行通信。Insecure 不起作用,因为浏览器强制 HTTP2 通过 TLS 或完全拒绝它。毕竟;无论如何,它也应该适用于生产中的 TLS。另一个问题也是 CORS,我无法弄清楚要给https://github.com/improbable-eng/grpc-web的服务器实现版本添加原始标头。但首先。

我提供了一个简单的 HTML 和 Webpack 构建 JS,我通过 TLS 为它提供了一个简单的 Golang FileServer。

我首先生成了一个新的 TLS 证书/密钥(已成功使用的 Go Server/Client 对):

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=State/L=Town/O=Office/CN=www.wp-ts.loc" -keyout ./www.wp-ts.loc.key -out ./www.wp-ts.loc
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到 macOS 钥匙串中以供信任:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain www.wp-ts.loc
Run Code Online (Sandbox Code Playgroud)

这是我使用的 Protobuf 文件:

syntax = "proto3";

package pb;

service GCDService {
    rpc Compute (GCDRequest) returns (GCDResponse) {}
}

message GCDRequest { …
Run Code Online (Sandbox Code Playgroud)

javascript protocol-buffers grpc grpc-web grpc-go

5
推荐指数
1
解决办法
1732
查看次数

Protobuf Build Protoc 选择目录中的所有 .proto 文件

我运行以下.sh文件来构建我的原型。

mkdir -p ./src/gen

protoc -I=../protos/                                       \
       ../protos/common/*.proto                            \
       ../protos/service/protos/*.proto                    \
       ../protos/ui/*.proto                                \
       ../protos/*.proto                                   \
       --js_out=import_style=commonjs,binary:./src/gen     \
       --grpc-web_out=import_style=commonjs+dts,mode=grpcwebtext:./src/gen
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是,我的团队可能会将其他目录添加到protos该文件看不到的目录中。

有没有办法更新此脚本以获取目录.proto中的所有文件protos

我尝试了以下方法,但没有成功:

mkdir -p ./src/gen

protoc -I=../protos/**/*.proto                                             \
       --js_out=import_style=commonjs,binary:./src/gen                     \
       --grpc-web_out=import_style=commonjs+dts,mode=grpcwebtext:./src/gen
Run Code Online (Sandbox Code Playgroud)

我确信这只是一些语法问题,但我不知道该怎么做。

编辑:

我已经实现了一些东西来使我的生成器更加灵活,但它仍然很混乱:

mkdir -p ./src/gen

protoc -I=../protos/                                   \
       ../protos/*.proto                               \
       ../protos/**/*.proto                            \
       ../protos/**/**/*.proto                         \
       ../protos/**/**/**/*.proto                      \
       ../protos/**/**/**/**/*.proto                   \
       --js_out=import_style=commonjs,binary:./src/gen \
       --grpc-web_out=import_style=commonjs+dts,mode=grpcwebtext:./src/gen
Run Code Online (Sandbox Code Playgroud)

sh protoc grpc-web

5
推荐指数
1
解决办法
7549
查看次数

安装 protoc-gen-grpc-web

我目前正在使用 grpc-web 为我的服务编写一个简单的客户端。我创建了一个 service.proto 文件,该文件已使用 protoc 成功编译。当我尝试使用插件 protoc-gen-grpc-web 生成 gRPC-Web 服务客户端存根时,问题出现了,尽管安装了后者,但该插件仍无法工作。

出现以下错误:

protoc -I=./ service.proto --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./
protoc-gen-grpc-web: program not found or is not executable
--grpc-web_out: protoc-gen-grpc-web: Plugin failed with status code 1.
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题有什么建议吗?谢谢你!

grpc-web

5
推荐指数
1
解决办法
1万
查看次数

在 Flutter 项目中使用 Grpc Web

我希望有人可以帮助解决我目前正在创建一个适用于 Web 和移动设备的 Flutter 应用程序的问题,并且我想使用 GRPC 和 WebGrpc。使用 Grpc 一切都运行良好,但使用 Web Grpc 时出现错误

   if (kIsWeb) {
    print("flutter web");
    clientChannel =
        GrpcWebClientChannel.xhr(Uri.parse('http://192.168.2.146:8880'));
    AuthClient(clientChannel).authenticate(AuthenticationRequest()
      ..login = "Apfel"
      ..password= "Hello").then((res) => print(res)).catchError((err) => print(err));
  } else {
    print("flutter mobil");
    clientChannel = ClientChannel('192.168.2.146',
        port: 3009,
        options:
        ChannelOptions(credentials: ChannelCredentials.insecure()));
  }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误预期为“ClientChannel”类型的值,但得到了“GrpcWebClientChannel”类型之一

dart grpc flutter grpc-web grpc-dart

5
推荐指数
0
解决办法
1557
查看次数

通过 Envoy docker 将 React Web 客户端连接到 gRPC 服务器不起作用

我在 scala Play Framework 中有 gRPC 服务器,它在端口 9000 上公开了 gRPC hello world 示例服务。我正在尝试将它与 React Web 客户端连接。我似乎遇到了部署到 Mac 上 docker 容器的 Envoy 代理的连接问题。

\n

我总是遇到同样的错误,我认为这意味着 Envoy 无法与后端连接:

\n
\xe2\x80\x8bcode: 2\xe2\x80\x8b\nmessage: "Http response at 400 or 500 level"\n\xe2\x80\x8bmetadata: Object {  }\n
Run Code Online (Sandbox Code Playgroud)\n

我用来构建 Envoy 的 docker 文件是:

\n
FROM envoyproxy/envoy:v1.12.2\nCOPY ./envoy.yaml /etc/envoy/envoy.yaml\nCMD /usr/local/bin/envoy -c /etc/envoy/envoy.yaml -l trace --log-path /tmp/envoy_info.log\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用这个脚本构建它:

\n
echo --- Building my-envoy docker image ---\ndocker build -t my-envoy:1.0 .\n\necho --- Running my-envoy docker image ---\ndocker run -d -p …
Run Code Online (Sandbox Code Playgroud)

docker grpc grpc-web envoyproxy

5
推荐指数
0
解决办法
708
查看次数

带角度6的GRPC Web客户端

我已经使用grpc .net客户端和使用Java创建的grpc服务器,如何在带有Typescript的angular 6上实现grpc Web客户端?另外我该如何创建原型文件,它是为打字稿打字的?我正在关注此存储库,但无法生成原始文件。

typescript grpc angular grpc-web

4
推荐指数
2
解决办法
8690
查看次数

我们可以在不依赖 docker 的情况下使用 nginx 代理进行 gRPC-web 集成吗?

需要在没有 docker 的情况下使用 NGINX

我尝试使用具有 docker 依赖关系的 envoy 代理使用 gRPC-web 集成,所以我转移到 NGINX,如何在没有 docker 依赖关系的情况下使用 NGINX?

grpc-web

4
推荐指数
2
解决办法
2900
查看次数

使用 golang 客户端的 GRPC Web 请求?

我正在尝试使用 grpc-web 包装器创建一个 grpc 服务器。这个想法是将此 grpc 服务器与基于浏览器的应用程序以及普通的 grpc 客户端一起使用。但我很困惑如何才能使其适用于这两个应用程序?

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net/http"
    "strconv"
    "time"

    "github.com/repo/test-grpc-server/greet/greetpb"
    "github.com/improbable-eng/grpc-web/go/grpcweb"
    "google.golang.org/grpc"
)

type server struct{}

func (*server) Greet(ctx context.Context, req *greetpb.GreetRequest) (*greetpb.GreetResponse, error) {
    fmt.Printf("Greet function was invoked with %v", req)
    firstName := req.GetGreeting().GetFirstName()
    result := "Hello " + firstName
    res := greetpb.GreetResponse{
        Result: result,
    }
    return &res, nil
}

func (*server) GreetManyTimes(req *greetpb.GreetManyTimesRequest, stream greetpb.GreetService_GreetManyTimesServer) error {
    fmt.Printf("GreetMany function was invoked with %v", req)

    firstName := req.GetGreeting().GetFirstName() …
Run Code Online (Sandbox Code Playgroud)

go grpc grpc-web

4
推荐指数
1
解决办法
4295
查看次数

如何使用 Envoy 和 gRPC-Web 配置 GKE Autopilot

我的本地计算机上运行一个应用程序,它使用 React -> gRPC-Web -> Envoy -> Go 应用程序,一切运行都没有问题。我正在尝试使用 GKE Autopilot 进行部署,但无法获得正确的配置。我对所有 GCP/GKE 都是新手,因此我正在寻求帮助以找出问题所在。

我最初关注的是这个文档,尽管我只有一个 gRPC 服务: https://cloud.google.com/architecture/exusing-grpc-services-on-gke-using-envoy-proxy

据我所知,GKE Autopilot 模式需要使用外部 HTTP(s) 负载平衡,而不是上述解决方案中所述的网络负载平衡,因此我一直在尝试使其发挥作用。经过各种尝试,我目前的策略有Ingress、BackendConfig、Service、Deployment。该部署包含三个容器:我的应用程序、用于转换 gRPC-Web 请求和响应的 Envoy sidecar,以及云 SQL 代理 sidecar。我最终想使用 TLS,但现在我将其排除在外,以免事情变得更加复杂。

当我应用所有配置时,后端服务显示一个区域中的一个后端,并且运行状况检查失败。健康检查设置为端口 8080 和路径 /healthz,这是我在部署配置中指定的内容,但我很怀疑,因为当我查看 envoy-sidecar 容器的详细信息时,它显示了 Readiness 探针如:http-get HTTP://:0/healthz headers=x-envoy-livenessprobe:healthz。“:0”只是意味着它使用容器的默认地址和端口,还是表明存在配置问题?

我一直在阅读各种文档,但无法将它们拼凑在一起。有没有一个例子可以说明如何做到这一点?我一直在寻找,但没有找到。

我当前的配置是:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grammar-games-ingress
  #annotations:
    # If the class annotation is not specified it defaults to "gce".
    # kubernetes.io/ingress.class: "gce"
    # kubernetes.io/ingress.global-static-ip-name: <IP addr>
spec:
  defaultBackend:
    service:
      name: grammar-games-core
      port:
        number: 80
---
apiVersion: …
Run Code Online (Sandbox Code Playgroud)

google-kubernetes-engine grpc-web autopilot

4
推荐指数
1
解决办法
1249
查看次数

Google 端点 + grpc-web

正如谷歌端点的 esp 代理(https://github.com/cloudendpoints/esp/pull/283)的变更日志中所见,已经为其添加了对 grpc-web 的支持。

然而,我无法让它工作。我使用以下 cors 配置部署了 esp

# Note: The following lines are included in a server block, so we cannot use all Nginx constructs here.
set $cors_expose_headers "";
set $cors_max_age "";

if ($request_method = 'OPTIONS') {
    set $cors_max_age 1728000;
    return 204;
}

if ($request_method = 'POST') {
    set $cors_expose_headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout';
}

if ($request_method = 'GET') {
    set $cors_expose_headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout';
}

add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout';
add_header 'Access-Control-Expose-Headers' $cors_expose_headers;
add_header …
Run Code Online (Sandbox Code Playgroud)

google-cloud-endpoints google-cloud-platform grpc grpc-web

3
推荐指数
1
解决办法
581
查看次数

TLS 中的 GRPC-Web 连接问题

我有一个 GRPC Web 客户端和一个 GRPC 服务器,我正在使用从 HTTP 1.1 到 HTTP2 的转换的特使代理。

我的服务器创建逻辑使用 TLS。代码如下:

    var opts []grpc.ServerOption
    creds, err := credentials.NewServerTLSFromFile("cert/server.crt", "cert/server.key")
    if err != nil {
        log.Fatalf("Failed to generate credentials %v", err)
    }
    opts = []grpc.ServerOption{grpc.Creds(creds)}
    server := grpc.NewServer(opts...)
Run Code Online (Sandbox Code Playgroud)

我正在从我的反应客户端调用如下:

const client = new LiveClient('http://localhost:8080')
const request = new GetLiveRequest()
    request.setApi(1)
    request.setTrackkey(trackKey)

    // on success response
    const stream = client.getLive(request, {})
    stream.on('data', response => {
         console.log(response);
    }
Run Code Online (Sandbox Code Playgroud)

envoy.yaml 如下:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 } …
Run Code Online (Sandbox Code Playgroud)

grpc grpc-web envoyproxy grpc-node

3
推荐指数
1
解决办法
1804
查看次数

无法在 Uno Platform WebAssembly 中创建 GrpcChannel (System.NullReferenceException)

我正在尝试使用gRPC-Web制作Uno Platform的示例。

因此我从这篇文章提供的内容中得到了启发。我按照文章的说明创建了一个BlazorApp,它使用gRPC-Web 的天气服务。之后,我还添加了另一个服务,即计数器服务,如gRPC-Web 示例中所示。

一切正常后,我添加了一个Uno Platform WebAssembly应用程序来替换BlazorApp客户端。

当前问题:

当尝试创建应用程序时,GrpcChannel应用程序会获得一个System.NullReferenceException.

创建通道的代码片段如下所示:

var baseUri = "https://localhost:44366";
var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions());
Run Code Online (Sandbox Code Playgroud)

这与BlazorApp中使用的代码完全相同。

BlazorAppUno Platform WebAssembly的示例代码可以在此存储库中找到。

任何想法/建议/帮助将不胜感激。

c# webassembly grpc-web uno-platform blazor-webassembly

1
推荐指数
1
解决办法
233
查看次数

如何在同一个项目中使用Traefik和Envoy来处理grpc-web?

我已经在 grpc.mydomain.com 上使用 LetsEncrypt 在 traefik 上启动并运行了一项服务。但是,由于 CORS 的一些问题,traefik 不支持路由 grpc-web 请求(https://github.com/containous/traefik/issues/4210)。Envoy 似乎是 traefik 的替代品,它与 grpc-web 一起使用,但我不想重新配置所有内容。

如果我将 envoy 放在 envoy.mydomain.com 上,那么它实际上会首先访问 traefik,并且 traefik 无法将 grpc-web 请求路由到 envoy。所以这是行不通的。

如果我将 envoy 置于 traefik (mydomain.com:9091) 之外,则 envoy 不具备 traefik 所具备的 TLS 支持。

我需要将所有内容都切换为 Envoy 吗?还有我没有考虑过的替代方案吗?欢迎任何指导:)

当前 Traefik 设置:

  traefik:
    image: traefik:v2.0.0
    container_name: traefik
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --entrypoints.grpc.address=:8090
      - --providers.docker
      - --api
      - --serversTransport.rootCAs=/certs/grpc.cert
      # Lets Encrypt Resolvers
      - --certificatesresolvers.leresolver.acme.email=${EMAIL}
      - --certificatesresolvers.leresolver.acme.storage=/etc/acme/cert.json
      - --certificatesresolvers.leresolver.acme.tlschallenge=${TLS_CHALLENGE}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - …
Run Code Online (Sandbox Code Playgroud)

traefik grpc-web envoyproxy

0
推荐指数
1
解决办法
2238
查看次数