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通信通過明文。

如果要在gRPC調用中添加TLS加密,首先需要告訴Ambassador添加HTTP / 2執行TLS所需的ALPN協議。接下來,您需要稍微更改客戶端代碼并告訴它與Ambassador打開一個安全的RPC通道。