Este tutorial mostra como criar um serviço de publicação do Knative personalizado que transforma um parâmetro de entrada de descrição de um gráfico num diagrama no PNGformato de imagem. Usa o Graphviz que está instalado como um pacote do sistema no ambiente do contentor do serviço.
O Graphviz é usado através de utilitários de linha de comandos para processar pedidos.
Obter o exemplo de código
Para obter o exemplo de código para utilização:
- Clone o repositório da app de exemplo para a sua máquina local: - Node.js- git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git - Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo. - Python- git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git - Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo. - Ir- git clone https://github.com/GoogleCloudPlatform/golang-samples.git - Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo. - Java- git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git - Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo. 
- Altere para o diretório que contém o código de exemplo do Knative Serving: - Node.js- cd nodejs-docs-samples/run/system-package/ - Python- cd python-docs-samples/run/system-package/ - Ir- cd golang-samples/run/system_package/ - Java- cd java-docs-samples/run/system-package/ 
Visualizar a arquitetura
A arquitetura básica tem o seguinte aspeto:
 
  O utilizador faz um pedido HTTP ao serviço Knative serving que executa um utilitário Graphviz para transformar o pedido numa imagem. Essa imagem é enviada ao utilizador como resposta HTTP.
Compreender o código
Definir a configuração do ambiente com o Dockerfile
O seu Dockerfile é específico do idioma e do ambiente de funcionamento base, como o Ubuntu, que o seu serviço vai usar.
Este serviço requer um ou mais pacotes de sistema adicionais que não estão disponíveis por predefinição.
- Abra o - Dockerfilenum editor.
- Procure um extrato da - Dockerfile- RUNEsta declaração permite a execução de comandos de shell arbitrários para modificar o ambiente. Se o- Dockerfiletiver várias fases, identificadas pela localização de várias declarações- FROM, é encontrado na última fase.- Os pacotes específicos necessários e o mecanismo para os instalar variam consoante o sistema operativo declarado no contentor. - Para receber instruções para o seu sistema operativo ou imagem base, clique no separador adequado. - Debian/Ubuntu - Alpine O Alpine requer um segundo pacote para suporte de fontes.- Para determinar o sistema operativo da sua imagem de contentor, verifique o nome na declaração - FROMou num ficheiro README associado à sua imagem base. Por exemplo, se estender a partir de- node, pode encontrar documentação e o elemento principal- Dockerfileno Docker Hub.
- Teste a personalização compilando a imagem - docker buildlocalmente ou com o Cloud Build.
Processar pedidos recebidos
O serviço de exemplo usa parâmetros do pedido HTTP recebido para invocar uma chamada de sistema que executa o comando de utilidade dot adequado.
No controlador HTTP abaixo, um parâmetro de entrada de descrição do gráfico é extraído da variável de cadeia de consulta dot.
As descrições dos gráficos podem incluir carateres que têm de ser codificados em URL para utilização numa string de consulta.
Node.js
Python
Ir
Java
Tem de distinguir entre erros internos do servidor e entradas do utilizador inválidas. Este serviço de exemplo devolve um erro interno do servidor para todos os erros de linha de comandos, a menos que a mensagem de erro contenha a string syntax, que indica um problema de entrada do utilizador.
A gerar um diagrama
A lógica principal da geração de diagramas usa a ferramenta de linha de comando dot para processar o parâmetro de entrada de descrição do gráfico num diagrama no formato de imagem PNG.
Node.js
Python
Ir
Java
Conceber um serviço seguro
Quaisquer vulnerabilidades na ferramenta dot são potenciais vulnerabilidades do serviço Web. Pode mitigar esta situação usando versões atualizadas do pacote graphviz através da recompilação da imagem do contentor de forma regular.
Se estender o exemplo atual para aceitar a entrada do utilizador como parâmetros da linha de comandos, deve proteger-se contra ataques de injeção de comandos. Algumas das formas de evitar ataques de injeção incluem:
- Mapeamento de entradas para um dicionário de parâmetros suportados
- Validar se as entradas correspondem a um intervalo de valores conhecidos e seguros, talvez usando expressões regulares
- Escape às entradas para garantir que a sintaxe da shell não é avaliada
Envio do código
Para enviar o seu código, compile-o com o Cloud Build, carregue-o para o Container Registry e implemente-o no Knative Serving:
- Execute o seguinte comando para criar o contentor e publicar no Container Registry. - Node.js- gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz - Onde PROJECT_ID é o ID do projeto Google Cloud e - graphvizé o nome que quer dar ao seu serviço.- Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser. - Python- gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz - Onde PROJECT_ID é o ID do projeto Google Cloud e - graphvizé o nome que quer dar ao seu serviço.- Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser. - Ir- gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz - Onde PROJECT_ID é o ID do projeto Google Cloud e - graphvizé o nome que quer dar ao seu serviço.- Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Container Registry e pode ser reutilizada, se quiser. - JavaEste exemplo usa o Jib para criar imagens do Docker com ferramentas Java comuns. O Jib otimiza as compilações de contentores sem necessidade de um Dockerfile ou de ter o Docker instalado. Saiba mais sobre como criar contentores Java com o Jib.- Usando o Dockerfile, configure e crie uma imagem de base com os pacotes do sistema instalados para substituir a imagem de base predefinida do Jib: - gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base - Onde PROJECT_ID é o ID do seu Google Cloud projeto. 
- Crie o contentor final com o Jib e publique-o no Container Registry: - mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base - Onde PROJECT_ID é o ID do seu Google Cloud projeto. 
 
- Implemente com o seguinte comando: - gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz - Onde PROJECT_ID é o ID do seu projeto, Google Cloud é o nome do contentor acima e - graphviz-webé o nome do serviço.- graphviz- Aguarde até que a implementação esteja concluída. Este processo pode demorar cerca de meio minuto. 
- Se quiser implementar uma atualização de código no serviço, repita os passos anteriores. Cada implementação num serviço cria uma nova revisão e começa automaticamente a publicar tráfego quando estiver pronta. 
Experimentar
Experimente o seu serviço enviando pedidos HTTP POSTcom descrições de sintaxe DOT
no payload do pedido.
- Envie um pedido HTTP para o seu serviço. - Pode incorporar o diagrama numa página Web: - 
Para obter o IP externo do balanceador de carga, execute o seguinte comando: kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE Substitua ASM-INGRESS-NAMESPACE pelo espaço de nomes onde se encontra a entrada do Cloud Service Mesh. Especifique istio-systemse tiver instalado o Cloud Service Mesh com a respetiva configuração predefinida.O resultado tem um aspeto semelhante ao seguinte: NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP em que o valor EXTERNAL-IP é o seu endereço IP externo do LoadBalancer. 
- Execute um comando curl com este endereço - EXTERNAL-IPno URL. Não inclua o protocolo (por exemplo:- http://) em- SERVICE_DOMAIN.- curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png 
 
- 
- Abra o ficheiro - diagram.pngresultante em qualquer aplicação que suporte ficheiros- PNG, como o Chrome.- Deve ter esta forma:   - Fonte: Descrição do DOT 
Pode explorar uma pequena coleção de descrições de diagramas prontas.
- Copie o conteúdo do ficheiro .dotselecionado
- Cole-o num comando - curl:- curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png