sample-bpe-microprofile/README.md

313 lines
8.2 KiB
Markdown
Executable File

# sample-bpe-microprofile
A sample of the BPe responsible for generating the key and the URL of the QRCode
## General
Generating the executable jar file
`mvn clean package`
Running integration tests
`mvn clean verify`
Generating the image
`mvn clean package docker:build`
Remove the image
`mvn docker:remove`
## Running the sample
**bpe-api**
`mvn thorntail:run -Dthorntail.jvmArguments=-Dbpechave.api.url=http://localhost:8280,-Dbpeqrcode.api.url=http://localhost:8180`
Debugging
`mvn thorntail:run -Dthorntail.debug.port=5006 -Dthorntail.jvmArguments=-Dbpechave.api.url=http://localhost:8280,-Dbpeqrcode.api.url=http://localhost:8180`
**bpe-qrcode**
`mvn thorntail:run -Dthorntail.jvmArguments=-Dbpechave.api.url=http://localhost:8280 -Dswarm.port.offset=100`
**bpe-chave**
`mvn thorntail:run -Dswarm.port.offset=200`
or
```
mvn clean package -f bpe-api/pom.xml docker:build
mvn clean package -f bpe-qrcode/pom.xml docker:build
mvn clean package -f bpe-chave/pom.xml docker:build
```
Inside the extra/test
```
docker-compose up --build
```
**Jaeger Traicing**
[http://localhost:16686/](http://localhost:16686/)
**Kibana**
[http://localhost:5601/](http://localhost:5601/)
**Testing the API**
QRCode
```
curl -H "Content-Type: application/json" -X POST -d '{"ambiente": "2", "uf": "23", "emissao": "20190621","documento": "68830611000","modelo": "63","serie": "001","tipoEmissao": "1","numeroDocumentoFiscal": "13"}' http://localhost:8080/api/qrcode
```
Chave
```
curl -H "Content-Type: application/json" -X POST -d '{"uf": "23", "emissao": "20190621","documento": "68830611000","modelo": "63","serie": "001","tipoEmissao": "1","numeroDocumentoFiscal": "13"}' http://localhost:8080/api/chave
```
## Kubernates
**Docker Registry**
`mkdir -p /opt/docker/auth`
`docker run --rm --entrypoint htpasswd registry:2 -Bbn admin admin > /opt/docker/auth/htpasswd`
`docker run -d -p 5000:5000 --restart=always --name registry -e REGISTRY_STORAGE_DELETE_ENABLED=true -v /opt/docker/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 registry:2`
**Images**
Generating the image and push them
```
mvn -Ddocker.registry=localhost:5000 -Ddocker.username=admin -Ddocker.password=admin clean package -f bpe-api/pom.xml docker:build docker:push -Pistio
mvn -Ddocker.registry=localhost:5000 -Ddocker.username=admin -Ddocker.password=admin clean package -f bpe-qrcode/pom.xml docker:build docker:push -Pistio
mvn -Ddocker.registry=localhost:5000 -Ddocker.username=admin -Ddocker.password=admin clean package -f bpe-chave/pom.xml docker:build docker:push -Pistio
```
**Registry UI**
Viewer for the images present in the Registry
[https://github.com/jc21/docker-registry-ui](https://github.com/jc21/docker-registry-ui)
```
docker run --rm -it -p 5001:80 --name registry-ui -e REGISTRY_HOST=$(ipconfig getifaddr en0):5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true -e REGISTRY_SSL=false -e REGISTRY_USER=admin -e REGISTRY_PASS=admin jc21/registry-ui
```
**Minikube/Istio**
Starting the Minikube
```
minikube start --memory=8192 --cpus=4 --vm-driver=hyperkit --kubernetes-version=v1.14.0 --disk-size=30GB --insecure-registry='0.0.0.0/0'
minikube addons list
minikube addons enable heapster
minikube addons enable metrics-server
minikube addons enable ingress
```
Installing the Istio
```
# Istio 1.2.25
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.25 sh -
cd istio-1.2.25
export PATH=$PWD/bin:$PATH
# install
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
kubectl apply -f install/kubernetes/istio-demo.yaml
# uninstall
kubectl delete -f install/kubernetes/istio-demo.yaml
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl delete -f $i; done
```
Showing the pods
```
kubectl get pod -n istio-system
kubectl get svc -n istio-system
kubectl --namespace istio-system top pods --containers
istioctl proxy-status
```
Showing the Istio Address
```
echo "Istio Services: $(minikube ip):$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')"
```
Showing the IP on MAC OS
`echo "Local IP: $(ipconfig getifaddr en0)"`
**Deploying the Sample**
Creating a namespace and defining the automatic inject for the Istio
```
kubectl create -f extra/kubernates/plataform/namespace-bpe.json
kubectl label namespace bpe istio-injection=enabled --overwrite
```
Creating an environment variable for dynamic action inside the sample
```
kubectl create configmap bpe-config --from-literal='ambiente=2' -n bpe
kubectl edit configmap bpe-config -n bpe
kubectl patch deployment bpe-api-1.0.8 -p {\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}" -n bpe
```
Defining the user and password to interact with the Registry
```
kubectl create secret docker-registry service-registry --namespace=bpe --docker-server=$(ipconfig getifaddr en0):5000 --docker-username=admin --docker-password=admin
```
Creating the Service, Deployment and Gateway
```
kubectl create -f extra/kubernates/plataform/bpeapi-service.yml
kubectl create -f extra/kubernates/plataform/bpeapi-deployment.yml
kubectl create -f extra/kubernates/plataform/bpeqrcode-service.yml
kubectl create -f extra/kubernates/plataform/bpeqrcode-deployment.yml
kubectl create -f extra/kubernates/plataform/bpechave-service.yml
kubectl create -f extra/kubernates/plataform/bpechave-deployment.yml
kubectl create -f extra/kubernates/networking/bpeapi-gateway.yml
```
Testing the Gateway
```
curl $(minikube ip):$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')/api/versao
```
Showing the pods
`kubectl get pods --namespace=bpe`
Showing the details
`kubectl describe pod bpe-api-<version> --namespace=bpe`
Testing the pod
```
kubectl exec -it $(kubectl get pod -l app=bpe-api -n bpe -o jsonpath='{.items[0].metadata.name}') -n bpe -c bpe-api -- curl bpe-api:8080/health
```
**Istio Tools**
Jaeger
```kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 15032:16686```
[http://localhost:15032](http://localhost:15032)
Kiali
```kubectl port-forward $(kubectl get pod -n istio-system -l app=kiali -o jsonpath='{.items[0].metadata.name}') -n istio-system 20001```
[http://localhost:20001/](http://localhost:20001/)
admin:admin
Grafana
```kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000```
[http://localhost:3000/dashboard/db/istio-mesh-dashboard](http://localhost:3000/dashboard/db/istio-mesh-dashboard)
Remove port forward
```killall kubectl```
**EFK (Monitoring)**
Deploying the components
```
kubectl create namespace logging
kubectl create -f extra/kubernetes/telemetry/elastic.yaml -n logging
kubectl create -f extra/kubernetes/telemetry/kibana.yaml -n logging
kubectl create -f extra/kubernetes/telemetry/fluentd-rbac.yaml
kubectl create -f extra/kubernetes/telemetry/fluentd-daemonset.yaml
```
Showing the pods
```
kubectl get pods,service -n logging
kubectl get pods -n kube-system
```
Viewing the log of the fluentd
```
kubectl logs $(kubectl get pods --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' -n kube-system | grep fluentd) -n kube-system
```
Showing the Minikube IP
`echo "Minikube IP: $(minikube ip)"`
Showing the Kibana Port
`kubectl describe svc kibana -n logging | grep NodePort`
## Interacting with the API
Showing the URL
```
echo "URL: $(minikube ip):$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')"
```
Retrieving a static URL
```
curl \
-H "Content-Type: application/json" \
-X POST \
-d '{"ambiente": "2", "uf": "23", "emissao": "20190621","documento": "68830611000","modelo": "63","serie": "001","tipoEmissao": "1","numeroDocumentoFiscal": "13","cbp": "12345678"}' \
http://<url>/api/qrcode
```
Retrieving a dynamic URL
```
curl \
-H "Content-Type: application/json" \
-X POST \
-d '{"ambiente": "2", "uf": "23", "emissao": "20190621","documento": "68830611000","modelo": "63","serie": "001","tipoEmissao": "1","numeroDocumentoFiscal": "13"}' \
http://<url>/api/qrcode
```