Ambassador 可以从您的应用程序外部轻松访问您的服务。这包括gRPC服务,虽然需要一些额外的配置:默认情况下,Envoy使用HTTP / 1.x连接到上游服务,然后尽可能升级到HTTP / 2。但是,gRPC建立在HTTP / 2上,而大多数gRPC服务器根本不会说HTTP / 1.x. Ambassador 必须告诉底层 Envoy 你的gRPC服务只想通信到HTTP/2,使用grpc属性 `Mapping`。
## Writing a gRPC service for Ambassador
### Dockerize
在构建我们的gRPC应用程序并在本地测试它之后,我们需要将其打包为Docker容器并将其部署到Kubernetes。
要运行gRPC应用程序,我们需要包括client/server和proto定义。
### 映射gRPC服务
Ambassador Mappings基于URL前缀; 对于gRPC,URL前缀是完整的服务名称,包括包路径(package.service)。这些在.proto定义文件中定义。在示例proto定义文件中,我们看到:
```
package helloworld;
// The greeting service definition.
service Greeter { ... }
```
所以URL prefix是`helloworld.Greeter`,映射将是:
```
---
apiVersion: ambassador/v0
kind: Mapping
name: grpc_py_mapping
grpc: True
prefix: /helloworld.Greeter/
rewrite: /helloworld.Greeter/
service: grpc-example
```
### 部署到Kubernetes
`grpc_example.yaml
`
```
---
apiVersion: v1
kind: Service
metadata:
labels:
service: grpc-example
name: grpc-example
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v0
kind: Mapping
name: grpc_java_mapping
grpc: True
prefix: /Simple/
rewrite: /Simple/
service: grpc-example
spec:
type: ClusterIP
ports:
- name: grpc-greet
port: 80
targetPort: grpc-api
selector:
service: grpc-example
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: grpc-example
spec:
replicas: 1
template:
metadata:
labels:
service: grpc-example
spec:
containers:
- name: grpc-example
image: woms/grpc-server:0.0.1
ports:
- name: grpc-api
containerPort: 9898
restartPolicy: Always
```
将Ambassador映射添加到服务后,Kubernetes部署YAML文件的其余部分非常简单。我们需要识别要使用的容器映像,公开containerPort以侦听Docker容器正在侦听的同一端口,并将服务端口(80)映射到容器端口(9898)。
配置YAML文件后,使用kubectl将其部署到集群。
```
$ kubectl apply -f grpc_example.yaml
```
### 测试部署
确保在进行更高级的更改(例如添加TLS)之前测试您的Kubernetes部署。要使用Ambassador 测试任何服务,我们将需要您可以获得的正在运行的 Ambassador 服务的主机名:
```
$ kubectl get service ambassador -o wide
```
将grpc-client的链接更改为:`$AMBASSADORHOST:$PORT`
## gRPC and TLS
通过 ambassador 通过加密通道连接到gRPC服务需要一些额外的配置。目前,gRPC和 ambassador通信通过明文。
![](https://d33wubrfki0l68.cloudfront.net/1fee79d11765ad8cba0cd6133c4f02f5a9acd3c8/8073b/images/grpc-tls.png)
如果要在gRPC调用中添加TLS加密,首先需要告诉Ambassador添加HTTP / 2执行TLS所需的ALPN协议。接下来,您需要稍微更改客户端代码并告诉它与Ambassador打开一个安全的RPC通道。