Jump to content

Karina Harumi

Administradores
  • Contagem de Conteúdo

    933
  • Ingressou

  • Última visita

  • Dias Ganhos

    185

Tudo que foi postado por Karina Harumi

  1. Tópico originalmente criado por: @lucas.gusmao Olá Desenvolvedor, bom dia! Como vai? Hoje fizemos o lançamento oficial do nosso MVP do PIX e, logo abaixo, vou tirar algumas dúvidas sobre o projeto! Caso ainda fique algum ponto, fique a vontade para comentar neste post, ou então criar um post novo aqui no fórum mesmo. 1. Quais métodos estão disponíveis no MVP? R: Atualmente, você pode fazer o registro do PIX no banco, consultar o status do pagamento do mesmo, fazer a impressão (QRCode dinâmico e estático) e configurar o envio de Webhooks para automatizar o processo de cobrança. Para verificar todos os métodos da nossa API, você pode acessar a nossa documentação completa 103. 2. Quero registrar o meu PIX usando o ambiente do banco, como faço? R: Para registrar o PIX diretamente no banco, é necessário que o correntista entre em contato com o seu gerente de cash management e solicite o acesso à API do PIX junto ao banco. O gerente vai encaminhar as credenciais para consumir a API (geralmente são: client_it, client_secret e api_key) que deverão ser configurados em nossa API. 3. Com quais bancos a API da Tecnospeed está integrado? R: Atualmente a nossa API está integrada com a API do Itaú para fazer o registro dos PIX. Está previsto para a primeira quinzena de Fevereiro a integração com o Banco do Brasil. 4. Quero usar a API da Tecnospeed, mas não tem o banco que eu preciso, o que fazer? R: A integração com o banco necessita de um correntista para poder fazer o consumo das APIs. Caso possua um banco que não está na nossa lista, basta solicitar a liberação junto ao gerente (descrito no passo 2) e nos encaminhar as credenciais. A homologação será feita sem custos. 5. Não tenho conta em nenhum banco, mas quero usar a API da Tecnospeed, como faço? R: Você pode utilizar o nosso ambiente de Sandbox! Esse ambiente é uma cópia do ambiente real, mas que não possui o registro no banco. Com isso, você pode testar todos os métodos e conhecer a integração, deixando o seu cenário preparado. Para utilizar o nosso ambiente de Sandbox, basta fazer o download da nossa collection do postman, clicando aqui 36. 6. Estou com dificuldades em fazer a integração, mas não sei onde pedir suporte, como faço? R: Nesse primeiro momento, em que estamos trabalhando com um MVP, o suporte será feito através da plataforma do HUB. Basta comentar nesse post ou criar um post novo na sessão da Fintech 13, que você será respondido pelos nossos desenvolvedores. 7. Estou interessado na aquisição da API, como funciona o modelo comercial? R: O nosso modelo comercial ainda está em definição, porém, em breve teremos novidades. Por hora, o nosso ambiente do MVP estará aberto (e de forma gratuita) até o dia 05/02.
  2. Tópico originalmente criado por: @Jonathan Santos Umas das operações mais comuns no ambiente de desenvolvimento da TecnoSpeed quando o assunto é o repositório do código fonte, com certeza é a criação de Branchs e Tags . Mas o que são exatamente? Qual a diferença entre essas duas operações? A TecnoSpeed utiliza o controlador de versões Subversion® através da ferramenta open-source TortoiseSVN. Nesse Post será considerado que os conceitos básicos do controle de versão como: Repository, revision, trunk, update, commit, revert, checkout, externals já são conhecidos. Uma das características dos sistemas de controle de versão é a capacidade de isolar alterações em uma linha separada de desenvolvimento. Esta linha é conhecida como uma Branch . Branchs são freqüentemente usadas para implementar novas funcionalidades, sem alterar a linha principal (ou Trunk ) de desenvolvimento com erros de compilador e bugs. Assim que o novo recurso é estável o suficiente, então a Branch de desenvolvimento é integrada de volta para a linha principal Trunk . Outra característica dos sistemas de controle de versão é a capacidade para marcar revisões particulares (por exemplo, a revisão de uma build de um componente cuja release foi liberada), para que seja possível a geração dessa mesma release caso for necessário. Essa revisão “congelada” é conhecida como Tag . Logo de cara podemos dizer que a diferença básica entre uma Branch e uma Tag é que a Branch é utilizada para adicionar correções ou novas funcionalidade sem alterar o Trunk de determinando produto, enquanto a Tag é um estado fixo no qual determinado produto possui um conjunto de funcionalidades que não serão mais alteradas. Em nosso dia a dia no desenvolvimento uma Branch é gerada e builds dos produtos são gerados em cima dessa Branch para testes do setor de qualidade. Caso um problema seja encontrado, a correção é feita primeiramente na Branch para depois ser transferida para o Trunk do produto. Quando determinado build de um produto é aprovado pela equipe da qualidade, é criado uma Tag da branch para “congelar” o ponto onde o produto e suas funcionalidades foi aprovado. Note que uma vantagem desse processo é deixar a equipe de desenvolvimento trabalhando normalmente no Trunk do produto, enquanto testes e correções são feitas pela equipe de qualidade na branch . Outra diferença entre Branch e Tag que encontramos em nosso dia a dia é que na Branch os externals não são “congelados” no momento da criação da branch, isso permite que posteriormente os externals podem ser trocados na branch . Em uma Tag os externals são “congelados”, ou seja, ficam fixos na Tag e não podem ser trocados posteriormente. Untitled (2).png|602px;x385px;991×635 6.71 KB Figura 1. Na Figura 1 temos a linha Azul representando a Trunk do repositório onde a equipe de desenvolvimento trabalha no dia a dia, fazendo novas funcionalidades e correções. As linhas Amarelas representam as Branchs criadas a partir da Trunk , note que alterações e correções podem ser feitas no decorrer do tempo. As setas Vermelhas representam as Tags , veja que elas são estáticas na linha do tempo das Branchs , ou seja, não permitem alterações. Uma Tag também pode ser criada a partir do Trunk caso seja necessário. Agora vamos a exemplos de criação de Branch e Tag . Nesse exemplo será utilizado o repositório do componente NFe. Criação da Branch. Com o botão direito clique na pasta do componente NFe, e no menu que aparece escolha TortoiseSVN->Branch/Tag conforme figura 2. |602px;x787px;676×883 40.3 KB Figura 2 Na tela que aparece a seguir clique no botão a direita conforme figura 3. |602px;x779px;618×799 22 KB Figura 3. Na tela que se abre a Url do repositório estará no Trunk do produto, na estrutura de pastas a esquerda clique na pasta Branches, que é o local onde todas as branches devem ser criadas conforme figura 4. |602px;x248px;1080×446 33.7 KB Figura 4. Após abrir a pasta onde estão as branches escolha a pasta componente/nfe conforme figura 5. |602px;x120px;1114×223 20.4 KB Figura 5. Note que após clicar na pasta do componente NFe, do lado direito é possível ver todas as branches geradas. Clique na pasta que possui a versão mais recente e logo depois no botão OK conforme figura 6. |602px;x440px;958×700 65.8 KB Figura 6. Na tela em seguida altere no campo To Path a versão ou nome da branch conforme as regras definidas no desenvolvimento. Depois preencha o ticket e o comentário referentes a criação da branch. Note que no campo Set Explicit revision for these externals (número 3 da figura 7) todos os check box devem estar desmarcados, isso garante que os externals não serão congelados. Logo após clique no botão OK. |602px;x777px;619×799 23.2 KB Figura 7. Pronto a Branch foi criada! Criação da Tag. A criação de uma Tag segue os mesmos passos da criação da branch, com algumas diferenças, que são elas: No passo 3 escolha a pasta Tags no repositório, conforme figura 8. |602px;x173px;950×273 23.1 KB Figura 8. No passo 4 e 5 escolha igualmente a pasta componente/nfe e selecione a Tag mais recente e clique em OK , conforme figura 9. |602px;x153px;944×240 22.3 KB Figura 9. No passo 6 a única e importante diferença é marcar todos os check box referentes ao externals do componente NFe. Com isso eles serão “congelados” e não poderam ser modificados posteriormente. Conforme figura 10. |602px;x781px;616×799 23 KB Figura 10. Pronto, Tag foi criada com sucesso! Uma observação em relação ao processo de criação da Tag é que ela pode ser criada em cima de uma revisão especifica. Para isso basta escolher a opção “Specific revision in repository” e depois clicar no botão “Show Log” e escolher a revisão conforme figuras 11 e 12. |602px;x783px;611×795 22.8 KB Figura 11. |602px;x383px;1102×701 53.4 KB Figura 12 (Após clique no botão “Show Log”). Após escolher a revisão é só continuar conforme passo 3 e Figura 10.
  3. Tópico originalmente criado por: @Jonathan Santos Crie um novo projeto do tipo " ASP.NET Empty Web Application ". Referencie a NFeX.dll no projeto para que possamos utilizar o método ExportarDanfe. Para isso vá em Project -> Add Reference -> clique em Browse -> procure pela NFeX.dll e clique em Add. Usings necessárias : using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; using System.IO; using System.Net; using System.Text; Instanciando as variáveis utilizadas: Implemente a função LerArquivo onde seu retorno será do tipo String que conterá o conteúdo do XML armazenado em disco. Utilizaremos esse retorno para alimentar o método ExportarDanfe. private string LerArquivo() //Aqui fazemos a captura do conteúdo do xml. { string xml = AppDomain.CurrentDomain.BaseDirectory + @"Impressao\" + txtChave.Text + "-nfe.xml"; //Pasta onde estão os xmls. return xDoc.InnerXml; } Implemente a função ExibirPDF onde seu retorno será do tipo Void, está função será responsável por abrir o arquivo PDF em seu browser do lado Client. private void ExibirPDF() { //Este método faz com que a impressão apareça na tela de quem está exportando. //Caso queira que apareça em outra página, basta usar o código abaixo no load de uma outra página em branco. string pdfPath = Server.MapPath(@"\Impressao\" + txtChave.Text + ".pdf"); WebClient client = new WebClient(); Byte[] buffer = client.DownloadData(pdfPath); Response.ContentType = "application/pdf"; Response.AddHeader("content-length", buffer.Length.ToString()); Response.BinaryWrite(buffer); } Segue o código do TextBox e Button que utilizaremos para testar: <%@ Page Language="C#" AutoEventWireup="true" Async="true" CodeBehind="Exemplo.aspx.cs" Inherits="ExportarNFe.Exemplo" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Teste Tecnospeed</title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="txtChave" runat="server" Width="435px">Chave para exportar.</asp:TextBox> <asp:Button ID="btnExportar" runat="server" Text="Exportar" OnClick="btnExportar_Click" /> </div> </form> </body> </html> No evento OnClick do botão btnExportar implemente o seguinte código: protected async void btnExportar_Click(object sender, EventArgs e) { nfe.ExportarDanfe("00001", LerArquivo(), AppDomain.CurrentDomain.BaseDirectory + @"templates\vm50a\Danfe\retrato.rtm", 1, Server.MapPath(@"\Impressao\" + txtChave.Text + ".pdf")); //Server.MapPath(@"\Impressao\" + txtChave.Text + ".pdf") Pasta do servidor onde vai salvar o xml para depois o cliente visualizar. ExibirPDF(); } Execute o projeto e adicione o número da chave do xml que está na pasta que configuramos dentro da função LerArquivo. Feito isso o PDF é exibido na página atual dessa forma : https://tsdn.tecnospeed.com.br/files/render/a/9f_4g5bCC5s/m/2Aal0HUq8Wc-9TMgc_r7RJn3T2-CMeUP3MswzVDSA9cmhjYDjfOMWmOelm23wjSBUqNVKgKPb30
  4. Tópico originalmente criado por: @Jonathan Santos Bibliotecas utilizadas: from urllib.request import urlopen, base64 import requests Neste exemplo utilizaremos em um dos dados a serem enviados o conteúdo de um arquivo texto armazenado na máquina local, para carregar o arquivo basta utilizar a função open: arquivo = open(“teste.tx2”,“r”) # Carrega arquivo tx2 tx2 = arquivo.read() # Lê oc onteudo do arquivo para a variavel Para facilitar o entendimento vou criar algumas variaveis para armazenar a url para onde será enviada a requisição, assim como os dados utilizados para montar o Basic Auth. Os parametros e valores utilizados em nossa requisição precisam ser estruturados em um array como abaixo: url = ‘http://192.168.2.154:8081/ManagerAPIWeb/nfce/envia’ # IP eDoc + Rota usuario = ‘admin’ # Usuário senha = ‘123mudar’ # Senha payload = {‘grupo’: ‘edoc’, ‘cnpj’: ‘08187168000160’, ‘arquivo’: tx2} # Parametros da API Para enviar a requisição basta chamar o método post da classe request, onde o primeiro parametro será a url de destino, segundo o array com os dados a serem enviados, terceiro onde realizaremos o Basic Auth e logo após imprimimos a resposta. resposta = requests.post(url, params=payload, auth=(usuario, senha)) # Envia a requisição print(resposta.text) # Imprime a resposta da requisição https://tsdn.tecnospeed.com.br/files/render/a/TkOguoNUIeY/m/2Aal0HUq8Wca7DPNr8jvDxniyCPa5KtdXS3aeNjBXFL2OcM3hKGjtxwReMQ4y87p0aY1qCV9NwY
  5. Tópico originalmente criado por: @Jonathan Santos Se você está recebendo uma ou mais mensagens das listadas abaixo é sinal que seu banco de dados possui um registro ou tabela corrompida. ERROR: missing chunk number 0 for toast value 382548694 in pg_toast_847386 pg_dump: SQL command failed pg_dump: Error message from server: ERROR: compressed data is corrupt pg_dump: The command was: COPY public.docs (id, created_at, content, link_id,job, is_job_label, hashtext) TO stdout; Solução 01 Antes de prosseguir, tente realizar um vacuum FULL da tabela em questão, isso fará com que o Postgre tente reescreve a tabela no disco. Se nenhum erro for apresentamento, muito provavelmente seu problema tenha sido solucionado. vacuum FULL FREEZE ANALYZE "TABELA_EDOC" Solução 02 Continuo com o mesmo problema, e agora? Crie uma função chamada " chk " que ficará responsável por retornar os registros corrompidos. create function chk(anyelement) returns bool language plpgsql as $f$ declare t text; begin t := $1; return false; exception when others then return true; end; $f$; Execute um select utilizando a função " chk " para obter o handle dos registros corrompidos. select handle from "TABELA_EDOC" where chk("TABELA_EDOC"); Para facilitar a contagem dos registros você pode utilizar um count . select count(handle) from "TABELA_EDOC" where chk("TABELA_EDOC"); Volte a tela inicial do pgAdmin e localize a tabela com registros corrompidos, selecione e vá em " properties ". Compare o número de Rows estimadas com o número de registros retornados no " select count " que fizemos acima. Se “select count” < Rows Nem tudo está perdido. Vamos executar um delete com os registros retornados pela função chk. delete from "TABELA_EDOC" where handle in (select handle from "TABELA_EDOC" where chk("TABELA_EDOC")) Nesse ponto você já deve ser capaz de realizar operações normalmente com a tabela que possuía registros corrompidos, apenas remova a função chk drop function chk(anyelement); Se “select count” = Rows Uma vez que o número de registros é igual ao número de linhas na tabela apagar os registros corrompidos seria o mesmo que executar um truncate ou drop na tabela. O que pode ser feito nesse caso? Restauração de backup. Criação de um novo banco e importação das notas. Recriar as tabelas corrompidas.
  6. Tópico originalmente criado por: @Jonathan Santos Esse é um método alternativo ao apresentado no post http://ciranda.me/tsdn/blog-da-consultoria-tecnica-tecnospeed/post/getvaluetag-e-getvaluetagfilho-sem-depender-do-componente-tecnospeed 7 Em situações onde precisamos selecionar mais de uma tag com o mesmo nome, trabalhar com propriedades ou namespaces o GetValueTag acaba não suprindo essa necessidade. Para esses casos é necessário que utilizemos xPath , assim podemos navegar em qualquer XML. Esse exemplo mostra como remover o namespace do XML de consulta de uma NF-e(Nota Fiscal Eletrônica) e como localizar uma ou várias tags a partir de sua estrutura dentro do XML. Implemente a função a baixo, essa é responsável por tratar o XML e remover seu namespace . Não se preocupe em compreender seu funcionamento. function TfrmPrincipal.RemoveNameSpaces(XMLString: String): String; const // An XSLT script for removing the namespaces from any document. It will remove the prefix as well. // From http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl cRemoveNSTransform = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' + '<xsl:output method="xml" indent="no"/>' + '<xsl:template match="/|comment()|processing-instruction()">' + ' <xsl:copy>' + ' <xsl:apply-templates/>' + ' </xsl:copy>' + '</xsl:template>' + '<xsl:template match="*">' + ' <xsl:element name="{local-name()}">' + ' <xsl:apply-templates select="@*|node()"/>' + ' </xsl:element>' + '</xsl:template>' + '<xsl:template match="@*">' + ' <xsl:attribute name="{local-name()}">' + ' <xsl:value-of select="."/>' + ' </xsl:attribute>' + '</xsl:template>' + '</xsl:stylesheet>'; var Doc, XSL: IXMLDOMDocument2; Res: string; p: integer; begin Doc := CoDOMDocument60.Create; Doc.ASync := false; XSL := CoDOMDocument60.Create; XSL.ASync := false; try Doc.loadXML(XMLString); XSL.loadXML(cRemoveNSTransform); Res := Doc.TransFormNode(XSL); // This now contains the original text with a <?xml version="1.0" encoding="UTF-16"?> prepended; remove it: p := Pos('?>', Res); result := Copy(Res, p + 2, Length(Res)); except on E: Exception do result := E.Message; end; end; É necessário implementar uma Procedure que chamaremos de ConfiguraObjeto nela iremos criar o CoDomDocument e então carregar o XML que será tratado através do método loadXML . procedure TfrmPrincipal.ConfiguraObjeto(XML: widestring); begin try lXMLDoc := CoDOMDocument60.Create; lXMLDoc.setProperty('SelectionLanguage', 'XPath'); if XML <> '' then lXMLDoc.loadXML(RemoveNameSpaces(XML)) else raise Exception.Create('XML não informado!'); except on E: Exception do Exception.Create(E.Message); end; end; Para realizar a leitura do conteúdo das tags podemos posicionar ou percorrer, utilizando a lista de Nodes . Essa lista será gerada a partir da estrutura do XML ou hierarquia, como preferir. A forma mais fácil de visualizar essa estrutura é indentando o XML, no exemplo anexado utilizei a seguinte estrutura “//nfeRetAutorizacaoResult/retConsReciNFe/protNFe/infProt/xMotivo” , com base no XML abaixo: <nfeRetAutorizacaoResult xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetAutorizacao3"> <retConsReciNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"> <tpAmb>2</tpAmb> <verAplic>PR-v3_2_2</verAplic> <nRec>411110211911421</nRec> <cStat>104</cStat> <xMotivo>Lote processado</xMotivo> <cUF>41</cUF> <dhRecbto>2014-11-04T10:00:28-02:00</dhRecbto> <protNFe versao="3.10"> <infProt> <tpAmb>2</tpAmb> <verAplic>PR-v3_2_2</verAplic> <chNFe>41141108187168000160558112855494631864800349</chNFe> <dhRecbto>2014-11-04T10:00:25-02:00</dhRecbto> <nProt>141140001675586</nProt> <digVal>Fj+0fLuRlampv0t0KeS85qRWUjc=</digVal> <cStat>100</cStat> <xMotivo>Lote processado</xMotivo> <xMotivo>Autorizado o uso da NF-e</xMotivo> </infProt> </protNFe> </retConsReciNFe> </nfeRetAutorizacaoResult> Na implementação é necessário chamar a Procedure ConfiguraObjeto passando o XML que deseja ler, em seguida utilize o método selectNodes para selecionar a tag a partir da estrutura desejada, logo após podemos obter seu conteúdo posicionando ou percorrendo o lNodeList . procedure TfrmPrincipal.btnCapturarClick(Sender: TObject); var i: integer; begin ConfiguraObjeto(mmXML.Text); lNodeList := lXMLDoc.selectNodes(TRIM(edtEstrutura.Text)); if (lNodeList.length > 0 ) then begin //Exemplo de leitura 01 - percorre for i := 0 to lNodeList.length - 1 do begin lNode := lNodeList.item[i]; mmRetorno.Lines.Add(lNode.text); end; //Exemplo de leitura 02 - posiciona lNode := lNodeList.item[0]; edtRetorno.Text := lNode.text; end else raise Exception.Create('Estrutura não encontrada no XML'); end; Exemplo de xPath em Delphi anexado logo abaixo.https://tsdn.tecnospeed.com.br/files/render/a/Tm_SajCIDP4/m/2Aal0HUq8WfTgM9w0oBgnbfLjiGHDqSDEWdrYvM8FZz0W6fPg6Y9Sd4pl53VxQ_St3k6J1xnf4g
  7. Tópico originalmente criado por: @Jonathan Santos Muito tem se falado sobre arquitetura de microserviços ultimamente, principalmente após a publicação de Martin Fowler e James Lewis . Para quem ainda não está familiarizado com o termo, uma arquitetura de microserviços compreende uma maneira específica de se projetar software através de serviços independentes e autônomos no quesito implantação. Apesar de não existir uma definição precisa para este estilo de arquitetura, existem algumas características em comum em relação à organização da lógica de negócio, implantação automatizada, inteligência nas pontas e controle descentralizado de linguagem e informação (Fowler e Lewis, 2014). Conceitos relacionados Muitos autores argumentam que microserviço é apenas um sinônimo para a abordagem já há muito conhecida, mais precisamente conceituada em 1996, como Arquitetura Orientada a Serviços , ou SOA (Service-Oriented Architecture), que se trata de uma abordagem arquitetural corporativa que permite a criação de serviços de negócio interoperáveis que podem facilmente ser reutilizados e compartilhados entre aplicações e empresas (Gartner Group, 1996). Existe ainda um outro conceito conhecido como Filosofia Unix que se trata do conjunto de normas e abordagens utilizadas por Ken Thompson e Dennis Ritchie durante e após o desenvolvimento do sistema operacional Unix e suas ferramentas. A Filosofia Unix se baseia em fazer programas muito específicos e que resolvam um determinado problema da melhor maneira possível , de forma que tais programas possam se comunicar entre si e serem combinados de modo a contemplar tarefas mais complexas. Com tais conceitos definidos, podemos dar sequência ao protótipo funcional que foi desenvolvido para exemplificar uma implementação de arquitetura de microserviços (ou SOA). Protótipo funcional Para fins de demonstração prática e aplicação dos conceitos descritos acima, foi desenvolvido um protótipo que comporta a arquitetura de microserviços e contempla os seguintes artefatos: Duas aplicações funcionais que utilizam os microserviços implementados Blog Fórum API RESTful CloudAMQP 5(serviço cloud gratuito que fornece uma instância de RabbitMQ ) Três microserviços com persistências individuais Accounts (cadastro de contas e controle de autenticação) Posts (cadastro de publicações) Comments (cadastro de comentários) 818×363 35.5 KB Diagrama da arquitetura do protótipo desenvolvido Detalhes da arquitetura Como pode ser observado no diagrama da arquitetura, a comunicação entre os artefatos se dá através de dois protocolos: HTTP (Hypertext Transfer Protocol): Protocolo de transferência de hipertexto. Base da comunicação de dados utilizado na Web; AMQP (Advanced Message Queuing Protocol): Protoco avançado de enfileiramento de mensagens; O protocolo AMQP permite a troca de mensagens assíncronas entre diferentes aplicações e/ou serviços . O software mais popular que implementa um servidor de AMQP é o RabbitMQ. Para o protótipo, foi utilizado um serviço cloud chamado CloudAMQP, que fornece instâncias de RabbitMQ e possui um plano gratuito que permite a troca de até 1 milhão de mensagens mensais. Existem várias formas 3de se beneficiar do protocolo AMQP: Envio simples de mensagem de um serviço A para um serviço B (sem resposta); Enfileiramento de mensagens de um serviço A para um serviço B (sem resposta); Publicação/Inscrição que permite o envio de uma mensagem para vários consumidores; Roteamento; Tópicos (uso avançado de Publicação/Inscrição); RPC (Remote Procedure Call), chamada de procedimento remoto ; Para entender o protótipo basta compreendermos a última forma de uso, RPC. As bibliotecas que encapsulam a chamada de procedimento remoto (RPC), geralmente são projetadas de forma que o uso seja transparente e intuitivo, aparentando ser uma mera chamada de função, quando de fato, está sendo feita a comunicação via AMQP para um serviço remoto e sendo aguardado o recebimento da resposta. Portanto, o uso de RPC ocorre quando um software efetua uma chamada de um serviço para outro software via AMQP e aguarda a resposta . No momento em que este artigo é escrito, o protótipo se encontra desenvolvido inteiramente em JavaScript (Node.js), tanto as aplicações clientes quanto os microserviços. Porém, em um futuro próximo, para tornar o exemplo mais rico, os microserviços serão reescritos em outras linguagens e plataformas como Ruby, Python, PHP e Java. Dessa forma mais bibliotecas de integração com AMQP serão cobertas pelo protótipo. Descrição do protótipo Para executar o protótipo em sua própria máquina siga as instruções contidas no leia-me do repositório (link ao final do artigo), o restante do artigo será focado em explicar o fluxo do protótipo. O cenário esperado para que o protótipo seja utilizado compreende os seguintes requisitos: Ao menos uma instância iniciada de cada microserviço; API RESTful iniciada; Instância de RabbitMQ iniciada (através do serviço CloudAMQP); Aplicações clientes iniciadas (Blog e Fórum); Com o cenário devidamente preparado, as aplicações clientes (Blog e Fórum) podem ser utilizadas normalmente. Para fins de exemplificação, vamos analisar o fluxo de mensagens que ocorre ao visualizar uma publicação na aplicação Blog: A aplicação Blog efetua uma requisição para a API RESTful para obter a publicação; A API efetua uma RPC para o microserviço Posts para obter a publicação; O microserviço Posts busca a publicação em sua persistência e responde a chamada RPC que recebeu; A API recebe a resposta do microserviço Posts e responde a requisição inicial da aplicação Blog; Observando um caso isolado como o fluxo acima, não é muito perceptível o benefício que a arquitetura de microserviços tem a oferecer, pois apenas foram criadas mais camadas entre a requisição HTTP e a persistência. O real benefício neste caso, é que este é apenas um dos fluxos que ocorrem ao se visualizar uma publicação no Blog. Além de se obter a publicação, também são obtidos o perfil do autor da publicação e os perfis dos autores de cada comentário existente na publicação através dos microserviços Accounts e Comments. Ou seja, vários microserviços trocam mensagens entre si quando uma publicação é visualizada no Blog. Em outras palavras, o uso de uma arquitetura de microserviços permite à um sistema robusto uma maior resistência a falhas e um maior potencial de escalabilidade , uma vez que cada microserviço pode ser escalável individualmente conforme a necessidade da aplicação. A resistência a falhas se encontra na capacidade que o sistema possui de continuar funcionando normalmente ainda que um ou mais microserviços se tornem indisponíveis. Alguns podem estar se perguntando qual a real necessidade da API RESTful, visto que as aplicações finais (Blog e Fórum) poderiam se comunicar diretamente com os microserviços através do CloudAMQP. De fato a API RESTful não é necessária, a camada da API foi criada apenas para simplificar a comunicação e expor uma interface HTTP para os microserviços que até então estariam disponíveis somente por AMQP/RPC. Com uma API RESTful expondo os microserviços, as aplicações finais podem utilizar requisições HTTP para consumir os serviços, permitindo dessa forma a criação de aplicações finais que por alguma restrição de tecnologia não sejam capazes de utilizar o protocolo AMQP. Vale lembrar que a RPC através do AMQP utiliza o algoritmo de Round-Robin para efetuar as chamadas das instâncias de dado serviço, isto é, a cada nova chamada, o RabbitMQ envia a mensagem para a próxima instância que encontrar do serviço. Portanto, para escalar um dado serviço, basta levantar novas instâncias que o RabbitMQ já irá lidar com o balancemanto das mensagens. Monitoramento dos microserviços Outro benefício da arquitetura de microserviços utilizando AMQP é a capacidade de monitorar a utilização de cada serviço de forma atômica e em tempo real, o que permite o acesso a mais informações sobre a performance e sobre a necessidade de escalabilidade. Segue um exemplo das filas que foram criadas para as aplicações do protótipo e do monitoramento em tempo real a partir do painel fornecido pelo serviço CloudAMQP. 804×616 56.7 KB Visualização das filas. Painel fornecido pelo CloudAMQP Monitoramento do envio de mensagens entre os microserviços Conclusão Não podemos reduzir toda a problemática de arquitetura de software a uma questão do que é certo e errado ou bom e ruim, pois cada caso possui suas muitas variáveis e circunstâncias que devem ser consideradas e seus muitos cenários e ambientes distintos possíveis em que o software em questão pode atuar. Com esta premissa em mente, vamos analisar quais as vantagens e desvantagens que uma arquitetura de microserviços pode oferecer, levando-se em consideração que não se tratam de verdades absolutas, apenas conclusões teóricas baseada em uma das muitas formas possíveis de se implementar microserviços através de AMQP. Vantagens Escalabilidade a nível atômico cada ação/serviço do software pode ser escalado individualmente, tirando-se portanto um maior proveito da capacidade de hardware existente; Manutenibilidade cada microserviço pode possuir processos organizacionais independentes, desde sua concepção à sua implantação, portanto o esforço dos recursos humanos pode ser melhor aproveitado; Reutilização um mesmo microserviço pode ser consumido por várias aplicações diferentes, diminuindo drasticamente o tempo de desenvolvimento de novas aplicações que possuírem recursos semelhantes; Resistência à falhas caso um microserviço se torne indisponível ou falhe, somente os recursos que dependam diretamente dele serão comprometidos nas aplicações finais; Flexibilidade de tecnologia como o protocolo AMQP se comporta como a lingua franca entre os microserviços, nada impede que cada microserviço seja desenvolvido em uma linguagem ou plataforma diferente, o único requisito é que o microserviço ou aplicação em questão seja capaz de se comunicar com os demais; Desvantagens Perda de performance este é um ponto muito subjetivo, depende muito de como a arquitetura for implementada e utilizada, mas de forma geral, caso a arquitetura seja homogênea no quesito comunicação como o caso do protótipo, as aplicações finais tendem a perder performance devido à adição de novas camadas entre o usuário final e a lógica do negócio; Difícil implantação principalmente no início da implementação de uma arquitetura de microserviços, até que toda a infraestrutura seja preparada e o processo de cada microserviço seja definido e padronizado, a velocidade de implantação de novos recursos e aplicações tende a ser reduzida drasticamente; Links e referências Repositório do protótipo desenvolvido: https://github.com/zonetti/prototipo-microservicos Referências Microservices - Martin Fowler e James Lewis: http://martinfowler.com/articles/microservices.html Guia de recursos sobre Microservices: http://martinfowler.com/microservices/ Tutoriais sobre RabbitMQ: https://www.rabbitmq.com/getstarted.html CloudAMQP: https://www.cloudamqp.com
  8. Tópico originalmente criado por: @Eduardo_Montanhole Olá desenvolvedor(a), Você sabe para que serve o campo sacador/avalista no boleto bancário? Mesmo com vários anos desde a implantação do sistema de cobrança bancária eletrônica como conhecemos hoje, existe muita dúvida a respeito da utilização do campo de SACADOR/AVALISTA e hoje vamos deixar essa opção do boleto eletrônico bem clara de uma vez por todas. Mas antes de tudo vamos relembrar rapidamente o que significam alguns campos relacionados ao sacador/avalista. Sacado: é quem paga o título, pode ser chamado também de pagador. Cedente ou beneficiário: é quem receberá o valor pago pelo boleto, ou seja, o emissor do título de cobrança. Em casos em que a empresa utiliza uma instituição bancária ou intermediadora de pagamentos, o campo de CEDENTE pode ser preenchido com o nome do intermediador de pagamento, quando isto ocorre, o nome da empresa que vendeu o produto ou serviço constará no campo de SACADOR/AVALISTA. Assim sendo, quando existir o processo de terceirização da emissão do boleto de cobrança quem de fato irá receber o valor pago pelo Sacado será o SACADOR/AVALISTA e não o CEDENTE como ocorre nos casos convencionais de emissão de boleto. Vamos utilizar um exemplo para ser mais claro: A empresa Softwares ABC é uma software house e utiliza a TECNOSPEED como sua intermediadora de pagamentos. A empresa Transportes e Cia é uma cliente da Softwares ABC. Ao emitir o boleto para que a Transportes e Cia. pague a mensalidade de sua solução o boleto vai com as seguintes informações. Nesse caso que utilizamos como exemplo podemos verificar que a TECNOSPEED se tornou a BENEFICIÁRIA do título, a SOFTWARE ABC foi preenchida como AVALISTA e a TRANSPORTES E CIA continuou como pagador, este é um exemplo prático de utilização do campo SACADOR/AVALISTA. Como utilizar o sacador/avalista no PlugBoleto: Em nossa ferramenta possuímos a funcionalidade de sacador disponível e de utilização muito simplificada sendo necessário apenas o preenchimento dos campos com os dados do SACADOR/AVALISTA necessários no JSON de envio do boleto conforme exemplo de preenchimento abaixo:
  9. Tópico originalmente criado por: @renan Teremos que indicar os dados do responsável técnico pela emissão da nota, esse dados podem ser da empresa que está emitindo a nota? Fiquei preocupado pois sou pessoa física e desenvolvo para as empresas e vi os campos abaixo, como devo proceder nesse caso? Identificador do CSRT utilizado para montar o hash do CSRT O hashCSRT é o resultado da função hash (SHA-1 – Base64) do CSRT fornecido pelo fisco mais a Chave de Acesso da NFe.
  10. Comentário originalmente feito por: @Rodrigo Palhano Recentemente fizemos um Webinar para os representantes do WiFire sobre LGPD com o Rodrigo Ramalho. Link disponível aqui: https://drive.google.com/file/d/1c-w30wCNTajW7bP1MrwZmDQV9DYfdNWG/view
  11. Comentário originalmente feito por: "Pressutti" Recomendo falar com o @Rodrigo Palhano Fui na palestra do cara no Ticnova2019. O cara sabe tanto que colocaram o nome LGPD por causa dele (Leis Geral o Palhano Destrói), esse bilhete é verdade.
  12. Comentário originalmente feito por: @guilherme.ganassin Aqui na empresa estamos com algumas ações muito interessantes sendo feitas visando a adequação para a nova lei. Neste primeiro momento, montamos grupos para estudar as mudanças, e cada equipe fez o levantamento dos possíveis impactos, para planejarmos as ações. Isto dará muito embasamento e segurança para quando formos implementar as mudanças.
  13. Tópico originalmente criado por: @Gabriel Serra Boa tarde, pessoal Tem muita gente falando sobre a tal da LGPD, tipo uma GDPR brasileira O pessoal aqui da empresa fez um resumão no nosso Blog, dá pra ter uma boa ideia do assunto Pra quem interessar: https://blog.tecnospeed.com.br/lgpd/
  14. Olá @Ana Sawiski Sim, o curso não está voltado para linguagem de programação, e sim para regra de negócios, mas você precisa entender o fundamento básico de relacionamento do banco de dados ok? O curso está integralmente aqui no fórum. Os módulos estão postados aqui: https://hub.casadodesenvolvedor.com.br/forum/85-erp-para-programadores/
  15. Aconteceu no dia 22/04/2021 às 14:30 a live sobre Customer Success Confira abaixo na íntegra! Materiais Extras: Slides utilizados: Customer_Success_-_TecnoSpeed.pdf Glossário de CS: Opinia_-_Glossario_de_Customer_Success.pdf O que você achou? Tem alguma dúvida? Comente aqui e vamos continuar conversando!
  16. Nesta edição do Café com o Contador em 2021, Augusto dos Santos nos trás as principais novidades dos documentos fiscais eletrônicos e obrigações acessórias em todo o Brasil.
  17. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  18. No primeiro episódio do Café com o Contador em 2021, Augusto dos Santos nos trás as principais novidades dos documentos fiscais eletrônicos no mundo - literalmente, no MUNDO. Confira as oportunidades dos projetos internacionais da NF-e e muito mais!
  19. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  20. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  21. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  22. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo dos documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  23. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  24. Seja bem vindo(a) ao Café com o Contador! Neste programa, trazemos aos desenvolvedores, gestores e empresários de software, o que há de mais novo e mais importante no universo SPED: documentos fiscais eletrônicos, obrigações acessórias e muito mais!
  25. O que significa ser proativo? Confira o significado, a importância e as principais características da proatividade, e 10 dicas para ajudá-lo a ser proativo. Já não é novidade que ser proativo é um requisito fundamental para quem quer ser notado, admirado e conseguir uma carreira de sucesso dentro de uma empresa. A proatividade tem sido cada vez mais requisitada entre os recrutadores e gestores. Mas, afinal, o que é ser proativo? Segundo o dicionário, proativo é um adjetivo atribuído a quem “pensa e age antecipadamente; que, por antecipação, adota medidas para evitar ou resolver problemas futuros”. Neste artigo, você aprenderá descobrirá o significado e a importância da proatividade. Além disso, apresentaremos 10 dicas para ajudá-lo a ser proativo. Para continuar lendo, clique aqui.
×
×
  • Create New...