{"id":1440,"date":"2022-03-29T11:41:30","date_gmt":"2022-03-29T09:41:30","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1440"},"modified":"2022-03-29T11:51:56","modified_gmt":"2022-03-29T09:51:56","slug":"google-cloud-functions-2nd-gen","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/google-cloud-functions-2nd-gen\/","title":{"rendered":"Google Cloud Functions 2nd gen"},"content":{"rendered":"<p>Google vient de sortir en beta la seconde g\u00e9n\u00e9ration des Google Cloud Functions. Pour ceux qui ne connaissent pas encore les Google Cloud Functions vous pouvez lire mes articles <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/j-ai-teste-java-google-cloud-functions-aplha\/\">J\u2019ai test\u00e9 Java Google Cloud Functions<\/a> et <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/quarkus-et-les-google-cloud-functions\/\">Quarkus et les Google Cloud Functions<\/a>.<\/p>\n<p>Cette seconde g\u00e9n\u00e9ration apporte :<\/p>\n<ul><li>Un temps de traitement maximal plus important : 60mn au lieu de 10mn.<\/li>\n\n<li>Des instances jusqu&rsquo;\u00e0 16Go\/4vCPU au lieu de 8Go\/4vCPU.<\/li>\n\n<li>La possibilit\u00e9 d&rsquo;avoir des instances toujours disponibles.<\/li>\n\n<li>Une meilleure gestion de la concurrence : jusqu&rsquo;\u00e0 1000 appels concurrents par instance.<\/li>\n\n<li>Le support des CloudEvents via EventArc : plus de 90 \u00e9v\u00e9nements disponibles.<\/li>\n<\/ul>\n<p>Toutes les nouveaut\u00e9s des Cloud Functions gen2 sont disponibles <a href=\"https:\/\/cloud.google.com\/functions\/docs\/2nd-gen\/overview\" rel=\"noopener\" target=\"_blank\">ici<\/a>.<\/p>\n<p>Cerise sur le g\u00e2teau, Quarkus est d\u00e9j\u00e0 pr\u00eat ! Ayant eu acc\u00e8s \u00e0 la version alpha priv\u00e9e, j&rsquo;ai d\u00e9j\u00e0 rendu l&rsquo;extension Quarkus compatible ;).<\/p>\n<p>Dans cet article, je vais revenir sur les deux points qui me semblent les plus int\u00e9ressants : la concurrence et le support des CloudEvents.<\/p>\n<h2>D\u00e9ploiement et premier appel<\/h2>\n<p>Pour commencer, d\u00e9ployons la m\u00eame fonction dans le runtime 1st gen et 2nd gen. Je vais utiliser la fonction HTTP du test d&rsquo;int\u00e9gration de l&rsquo;extension Quarkus pour Google Cloud Functions trouvable <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/tree\/main\/integration-tests\/google-cloud-functions\" title=\"Quarkus Google Cloud Functions integration test\" rel=\"noopener\" target=\"_blank\">ici<\/a>.<\/p>\n<p>Premi\u00e8re chose \u00e0 faire, packager la fonction via <code>mvn clean package<\/code>. Quarkus va g\u00e9n\u00e9rer un uber jar dans le r\u00e9pertoire <code>target\/deployment<\/code> que nous allons ensuite utiliser pour d\u00e9ployer notre fonction.<\/p>\n<p>Pour d\u00e9ployer la fonction dans le runtime 1st gen :<\/p>\n<pre>\ngcloud functions deploy quarkus-example-http-v1 \\\n    --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \\\n    --runtime=java11 --trigger-http --source=target\/deployment\n<\/pre>\n<p>Le build est effectu\u00e9 via Cloud Build et prend environ 22s. Apr\u00e8s d\u00e9ploiement, j&rsquo;effectue un premier appel de la fonction via curl puis j&rsquo;acc\u00e8de \u00e0 ses logs pour voir le temps de lancement de la fonction, et le temps du premier appel.<\/p>\n<pre>\nD      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.446  Function execution took 277 ms, finished with status code: 200\nD      quarkus-example-http-v1  47b2zh3ew2od  2022-03-22 17:35:03.169  Function execution started\n       quarkus-example-http-v1                2022-03-22 17:31:38.441  2022-03-22 17:31:38.441:INFO:oejs.Server:main: Started @1476ms\n[...]\nI      quarkus-example-http-v1                2022-03-22 17:31:38.339  Installed features: [cdi, google-cloud-functions]\nI      quarkus-example-http-v1                2022-03-22 17:31:38.339  Profile prod activated.\nI      quarkus-example-http-v1                2022-03-22 17:31:38.338  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 0.690s.\nI      quarkus-example-http-v1                2022-03-22 17:31:38.266  JBoss Threads version 3.4.2.Final\n       quarkus-example-http-v1                2022-03-22 17:31:37.431  2022-03-22 17:31:37.430:INFO::main: Logging initialized @457ms to org.eclipse.jetty.util.log.StdErrLog\n       quarkus-example-http-v1                2022-03-22 17:31:36.969  Picked up JAVA_TOOL_OPTIONS: -XX:MaxRAM=256m -XX:MaxRAMPercentage=70\n<\/pre>\n<p>On constate que la fonction a d\u00e9marr\u00e9 en 1,5s dont 0,7s pour le d\u00e9marrage de Quarkus. Le premier appel a pris 277ms.<\/p>\n<p>Faisons de m\u00eame pour le runtime 2nd gen dont nous pouvons d\u00e9ployer la m\u00eame fonction avec :<\/p>\n<pre>\ngcloud beta functions deploy quarkus-example-http-v2  \\\n    --entry-point=io.quarkus.gcp.functions.QuarkusHttpFunction \\\n    --runtime=java11 --trigger-http --source=target\/deployment --gen2\n<\/pre>\n<p>Le build est effectu\u00e9 via Cloud Build et prend en viron 25s. Apr\u00e8s d\u00e9ploiement, j&rsquo;effectue un premier appel de la fonction via curl, et l\u00e0 je constate tout de suite que l&rsquo;appel est tr\u00e8s tr\u00e8s long! J&rsquo;acc\u00e8de \u00e0 ses logs pour voir le temps de lancement de la fonction et le temps du premier appel.<\/p>\n<pre>\nI      quarkus-example-http-v2  2022-03-22 17:38:44.464\n       quarkus-example-http-v2  2022-03-22 17:38:43.041  2022-03-22 17:38:43.041:INFO:oejs.Server:main: Started @14069ms\n[...]\nI      quarkus-example-http-v2  2022-03-22 17:38:41.943  Installed features: [cdi, google-cloud-functions]\nI      quarkus-example-http-v2  2022-03-22 17:38:41.943  Profile prod activated.\nI      quarkus-example-http-v2  2022-03-22 17:38:41.942  quarkus-integration-test-google-cloud-functions 999-SNAPSHOT on JVM (powered by Quarkus 999-SNAPSHOT) started in 7.283s.\nI      quarkus-example-http-v2  2022-03-22 17:38:41.343  JBoss Threads version 3.4.2.Final\n----&gt; OTHER STARTING LOGS <\/pre>\n<p>Plusieurs constatations : le temps de d\u00e9marrage est beaucoup plus long, environ 14s dont 7s pour Quarkus, on retrouve le m\u00eame rapport d\u00e9marrage runtime vs Quarkus mais en fois 10! De plus, l&rsquo;appel curl effectu\u00e9 juste le d\u00e9ploiement d\u00e9clenche le d\u00e9marrage d&rsquo;une autre fonction. Les appels successifs seront beaucoup plus rapides.<\/p>\n<p>Il y a ici un comportement tr\u00e8s diff\u00e9rents entre les g\u00e9n\u00e9ration 1 et 2, je vais contacter les \u00e9quipes de Google sur le sujet pour investigation.<\/p>\n<h2>Une meilleure concurrence<\/h2>\n<p>Pour comparer la gestion de la concurrence, je vais simuler une charge importante avec l&rsquo;outil <a href=\"https:\/\/github.com\/wg\/wrk\" rel=\"noopener\" target=\"_blank\">wrk<\/a> sur les deux runtimes.<\/p>\n<p>Sur chaque runtime, je r\u00e9alise deux tests successifs, un sur 1mn avec 10 threads pour 100 connexions, et un autre sur 5mn avec 20 threads pour 200 connexions :<\/p>\n<pre>\nwrk -c 100 -t 10 -d 60 --latency https:\/\/my-function-host\/quarkus-example-http-v1\nwrk -c 200 -t 20 -d 300 --latency https:\/\/my-function-host\/quarkus-example-http-v1\n<\/pre>\n<p>Voici les r\u00e9sultats pour le runtime 1st gen :<\/p>\n<pre>\n  10 threads and 100 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   144.47ms  111.63ms   2.00s    97.54%\n    Req\/Sec    69.62     17.30   101.00     64.76%\n  Latency Distribution\n     50%  123.09ms\n     75%  129.64ms\n     90%  174.37ms\n     99%  601.22ms\n  40755 requests in 1.00m, 16.36MB read\n  Socket errors: connect 0, read 0, write 0, timeout 175\nRequests\/sec:    678.27\nTransfer\/sec:    278.89KB\n\n  20 threads and 200 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   126.24ms   31.54ms   1.92s    93.47%\n    Req\/Sec    79.79     13.07   101.00     76.19%\n  Latency Distribution\n     50%  118.99ms\n     75%  122.78ms\n     90%  138.27ms\n     99%  224.09ms\n  477829 requests in 5.00m, 191.86MB read\n  Socket errors: connect 0, read 0, write 0, timeout 30\n  Non-2xx or 3xx responses: 20\nRequests\/sec:   1592.29\nTransfer\/sec:    654.69KB\n<\/pre>\n<p>Et voici les r\u00e9sultats pour le runtime 2nd gen :<\/p>\n<pre>\n  10 threads and 100 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   138.16ms   63.56ms   1.95s    95.26%\n    Req\/Sec    65.04     23.10   101.00     63.66%\n  Latency Distribution\n     50%  119.94ms\n     75%  140.14ms\n     90%  190.22ms\n     99%  230.52ms\n  27713 requests in 1.00m, 8.72MB read\n  Socket errors: connect 0, read 0, write 0, timeout 169\n  Non-2xx or 3xx responses: 64\nRequests\/sec:    461.20\nTransfer\/sec:    148.58KB\n\n  20 threads and 200 connections\n  Thread Stats   Avg      Stdev     Max   +\/- Stdev\n    Latency   125.02ms   30.51ms   1.98s    92.59%\n    Req\/Sec    79.25     14.82   101.00     71.28%\n  Latency Distribution\n     50%  117.89ms\n     75%  120.57ms\n     90%  136.77ms\n     99%  210.77ms\n  474727 requests in 5.00m, 148.95MB read\n  Socket errors: connect 0, read 0, write 0, timeout 79\n  Non-2xx or 3xx responses: 38\nRequests\/sec:   1581.91\nTransfer\/sec:    508.26KB\n<\/pre>\n<p>Les performances moyennes entre les deux sont similaires, avec un temps moyen l\u00e9g\u00e8rement inf\u00e9rieur pour la 2nd gen. Quand on regarde en d\u00e9tail la latence \u00e0 99% (tail latency), on remarque une diff\u00e9rence plus marqu\u00e9e pour la 2nd gen qui a une latence bien plus faible, surtout lors du premier test de charge (230ms versus 601ms). On voit bien l\u2019int\u00e9r\u00eat d&rsquo;une concurrence accrue pour les fonctions en 2nd gen : plus de requ\u00eate trait\u00e9e par instance, \u00e9gal moins de d\u00e9marrage de fonction, et donc moins de cold starts.<\/p>\n<p>On peut valider \u00e7a en regardant via la console Google Cloud le nombre d&rsquo;instances d\u00e9marr\u00e9es, et on constate qu&rsquo;il y a environ deux fois moins d&rsquo;instances d\u00e9marr\u00e9es en 2nd gen qu&rsquo;en 1st gen (65 \u00e0 70 instances versus 140 \u00e0 200 instances).<\/p>\n<p><figure id=\"attachment_1445\" aria-describedby=\"caption-attachment-1445\" style=\"width: 618px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=618%2C343&#038;ssl=1\" alt=\"\" width=\"618\" height=\"343\" class=\"size-full wp-image-1445\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?w=618&amp;ssl=1 618w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=300%2C167&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen1-instance.png?resize=486%2C270&amp;ssl=1 486w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><figcaption id=\"caption-attachment-1445\" class=\"wp-caption-text\">1st gen &#8211; Nb instances<\/figcaption><\/figure> <figure id=\"attachment_1446\" aria-describedby=\"caption-attachment-1446\" style=\"width: 601px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=601%2C338&#038;ssl=1\" alt=\"\" width=\"601\" height=\"338\" class=\"size-full wp-image-1446\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?w=601&amp;ssl=1 601w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/cloud-function-gen2-instances.png?resize=480%2C270&amp;ssl=1 480w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption id=\"caption-attachment-1446\" class=\"wp-caption-text\">2nd gen &#8211; Nb instances<\/figcaption><\/figure><\/p>\n<h2>CloudEvents<\/h2>\n<p>Une des fonctionnalit\u00e9s les plus excitantes de la 2nd gen est la possibilit\u00e9 de cr\u00e9er des fonctions de type Cloud Events. Ce sont des fonctions \u00e9v\u00e9nementielles qui, au lieu de recevoir un \u00e9v\u00e9nement dans un format propri\u00e9taire au cloud Google, vont recevoir un \u00e9v\u00e9nement au format standard tel que d\u00e9crit dans la <a href=\"https:\/\/github.com\/cloudevents\/spec\">sp\u00e9cification Cloud Events<\/a>.<\/p>\n<p>Voici un exemple de cloud function recevant un \u00e9v\u00e9nement de type Storage et utilisant l\u2019\u00e9v\u00e9nement propri\u00e9taire Google Cloud; c&rsquo;est une fonction de type background qui utilise un objet d&rsquo;\u00e9v\u00e8nement propri\u00e9taire <code>StorageEvent<\/code> :<\/p>\n<pre>\npublic class BackgroundFunctionStorageTest implements BackgroundFunction {\n\n    @Override\n    public void accept(StorageEvent event, Context context) throws Exception {\n        System.out.println(\"Receive event on file: \" + event.name);\n    }\n\n    public static class StorageEvent {\n        public String name;\n    }\n}\n<\/pre>\n<p>Pour d\u00e9ployer cette fonction et la faire \u00e9couter sur un \u00e9v\u00e9nement sur le bucket <strong>quarkus-hello<\/strong> nous pouvons utiliser la commande suivante.<\/p>\n<pre>\ngcloud functions deploy quarkus-example-storage \\\n    --entry-point=com.example.BackgroundFunctionStorageTest \\\n    --trigger-resource quarkus-hello --trigger-event google.storage.object.finalize \\\n    --runtime=java11 --source=target\/deployment\n<\/pre>\n<p>Voici un exemple de cloud function recevant un \u00e9v\u00e9nement standard de type CloudEvents; elle utilise la librairie Java CloudEvents qui fournit l&rsquo;objet <code>CloudEvent<\/code> :<\/p>\n<pre>\npublic class CloudEventStorageTest implements CloudEventsFunction {\n\n    @Override\n    public void accept(CloudEvent cloudEvent) throws Exception {\n        System.out.println(\"Receive event Id: \" + cloudEvent.getId());\n        System.out.println(\"Receive event Subject: \" + cloudEvent.getSubject());\n        System.out.println(\"Receive event Type: \" + cloudEvent.getType());\n        System.out.println(\"Receive event Data: \" + new String(cloudEvent.getData().toBytes()));\n    }\n}\n<\/pre>\n<p>C&rsquo;est au d\u00e9ploiement de cette fonction que nous allons pr\u00e9ciser que le d\u00e9clenchement se fera sur un \u00e9v\u00e9nement de type Storage en pr\u00e9cisant le bucket.<\/p>\n<pre>\ngcloud beta functions deploy quarkus-example-cloud-event --gen2 \\\n  --entry-point=com.example.CloudEventsFunctionStoragetTest \\\n  --runtime=java11 --trigger-bucket=example-cloud-event --source=target\/deployment\n<\/pre>\n<p>Le contenu de l&rsquo;\u00e9v\u00e9nement Storage sera dans l&rsquo;attribut <code>data<\/code> de l&rsquo;objet CloudEvent.<\/p>\n<h2>Conclusion<\/h2>\n<p>M\u00eame si la 2nd gen est encore en preview, l&rsquo;avantage offert en termes de performance et de cold start vaut \u00e0 lui seul le coup de commencer \u00e0 l&rsquo;utiliser (m\u00eame s&rsquo;il reste \u00e0 r\u00e9gler le probl\u00e8me du premier d\u00e9marrage de fonction qui prend beaucoup de temps).<\/p>\n<p>De plus, le support du standard CloudEvents permet d&rsquo;\u00e9crire des fonctions moins d\u00e9pendantes de Google Cloud, et surtout d&rsquo;utiliser un format qui est support\u00e9 sur d&rsquo;autres clouds et dans d&rsquo;autres technologies (broker Kafka, client HTTP, &#8230;).\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Google vient de sortir en beta la seconde g\u00e9n\u00e9ration des Google Cloud Functions. Pour ceux qui ne connaissent pas encore les Google Cloud Functions vous pouvez lire mes articles J\u2019ai test\u00e9 Java Google Cloud Functions et Quarkus et les Google Cloud Functions. Cette seconde g\u00e9n\u00e9ration apporte : Un temps de traitement maximal plus important : 60mn au lieu de 10mn. Des instances jusqu&rsquo;\u00e0 16Go\/4vCPU au lieu de 8Go\/4vCPU. La possibilit\u00e9 d&rsquo;avoir des instances toujours disponibles. Une meilleure gestion de la&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/google-cloud-functions-2nd-gen\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[206,179,205,11,167],"class_list":["post-1440","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-gcf","tag-gcp","tag-google-cloud-functions","tag-java","tag-quarkus"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1560,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-tip-tester-une-fonction-google-cloud\/","url_meta":{"origin":1440,"position":0},"title":"Quarkus Tip : Tester une fonction Google Cloud","author":"admin","date":"jeudi 29 d\u00e9cembre 2022","format":false,"excerpt":"J'ai r\u00e9cemment contribu\u00e9 une PR \u00e0 Quarkus qui contient un framework de test pour les fonctions Google Cloud. Quarkus supporte la cr\u00e9ation de fonction Google Cloud de trois mani\u00e8res diff\u00e9rentes : En utilisant l'API de Google Cloud. En utilisant une extension HTTP de Quarkus : RESTEasy, Reactive routes, Servlet, Spring\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1345,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/quarkus-et-les-google-cloud-functions\/","url_meta":{"origin":1440,"position":1},"title":"Quarkus et les  Google Cloud Functions","author":"admin","date":"mardi  2 novembre 2021","format":false,"excerpt":"Quarkus est un framework de d\u00e9veloppement de microservice pens\u00e9 pour le cloud et les conteneurs. Il est pens\u00e9 pour avoir une utilisation m\u00e9moire r\u00e9duite et un temps de d\u00e9marrage le plus court possible. Il se base principalement sur des standards (Jakarta EE, Eclipse MicroProfile, \u2026) et permet l'utilisation de librairies\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1068,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/j-ai-teste-java-google-cloud-functions-aplha\/","url_meta":{"origin":1440,"position":2},"title":"J&rsquo;ai test\u00e9 Java Google Cloud Functions Alpha","author":"admin","date":"mercredi  6 mai 2020","format":false,"excerpt":"J'ai test\u00e9 les Java Google Cloud Functions en Alpha. Jusqu'ici, les Cloud Functions de Google n'\u00e9taient impl\u00e9mentables qu'en NodeJs, Go ou Python. Mais Google est en train de pr\u00e9parer l'ouverture d'un runtime Java (8 et 11), que j'ai pu tester en alpha release priv\u00e9e (pour s'inscrire, c'est ici). Apr\u00e8s inscription\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1960,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/creer-un-chatbot-avec-google-gemini-vertex-ai-et-quarkus\/","url_meta":{"origin":1440,"position":3},"title":"Cr\u00e9er un chatbot avec Google Gemini Vertex AI et Quarkus","author":"admin","date":"vendredi 27 juin 2025","format":false,"excerpt":"J'ai r\u00e9cemment cr\u00e9\u00e9 une extension Quarkus qui permet d'acc\u00e9der \u00e0 Google Vertex AI. Dans cet article, je vais utiliser cette extension pour cr\u00e9er un chatbot. La premi\u00e8re \u00e9tape consiste \u00e0 cr\u00e9er un projet Quarkus contenant les extensions REST et Google Cloud Vertex AI. Voici les extensions \u00e0 ajouter \u00e0 votre\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2025-06-27-14-22-26-1024x376.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2089,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/deployer-une-application-quarkus-dans-cloud-run\/","url_meta":{"origin":1440,"position":4},"title":"D\u00e9ployer une application Quarkus dans Cloud Run","author":"admin","date":"mardi 30 d\u00e9cembre 2025","format":false,"excerpt":"Quarkus est un framework de d\u00e9veloppement de microservice pens\u00e9 pour le cloud et les conteneurs. Il est pens\u00e9 pour avoir une utilisation m\u00e9moire r\u00e9duite et un temps de d\u00e9marrage le plus court possible. Il se base principalement sur des standards (Jakarta EE, Eclipse MicroProfile, \u2026) et permet l\u2019utilisation de librairies\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1532,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/tester-une-java-google-cloud-function\/","url_meta":{"origin":1440,"position":5},"title":"Tester une Java Google Cloud Function","author":"admin","date":"mardi  4 octobre 2022","format":false,"excerpt":"Jusqu'il y a peu de temps, tester une Google Cloud Function \u00e9crite en Java pouvait se faire via l'invoker fournit par le SDK des Google Cloud Functions mais pas via un test unitaire. Mais cela \u00e0 chang\u00e9 r\u00e9cemment ! Prenons comme exemple la fonction HTTP suivante : public class HelloHttpFunction\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1440"}],"version-history":[{"count":12,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1440\/revisions"}],"predecessor-version":[{"id":1456,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1440\/revisions\/1456"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}