2 votes

Comment transférer une partie des requêtes vers un autre serveur en Clojure ?

Résumé

Je suis en train de développer un serveur pour être une sorte de proxy en Clojure, avec pedestal service + lein comme base :

  • Recevoir des demandes
  • Transférer les demandes vers des serveurs externes
  • Faire plusieurs requêtes de serveur à serveur pour alimenter un json plus important et le renvoyer en une seule requête au client.

Il est facile à coder et il existe de nombreuses ressources sur la manière de desservir un itinéraire,
mais je n'ai pas trouvé de solution simple, comment faire reposer un piédestal Clojure
ainsi que les itinéraires de transfert

Exemple

  • Le client appelle [GET] /billing => proxy-clojure-server
  • proxy-clojure-server authentifier la demande avec les informations d'identification du client => serveur d'authentification
  • proxy-clojure-server remplit le fichier json avec les données de facturation => serveur de facturation
  • proxy-clojure-server remplit le fichier json avec les données du client => serveur-client
  • proxy-clojure-server renvoie 200 avec le JSON complet résolu

Mise en place

  • J'ai un projet avec une structure similaire : lein new pedestal-service my-app

Ce que j'ai essayé

Exemple :

(ns your-ns
  (:require [tailrecursion.ring-proxy :refer [wrap-proxy]]))

(def app
  (-> routes
      (wrap-proxy "/remote" "http://some.remote.server/remote")))

Je n'arrive pas à combiner le système de routage de la console avec cette solution de proxy, les routes sont différentes, il semble que je doive adopter une approche différente.

Clause de non-responsabilité

  1. Je sais que le forwarding de base peut être fait par nginx, varnish, ou tout autre load balancer. Mais mon idée ici est de remplir les données de différents serveurs, ce qui simplifie la tâche du client.
  2. Je suis un débutant en Clojure comme vous l'avez peut-être remarqué. Et je n'ai plus d'options, parce que Google est aussi compliqué, parfois inutile.

1voto

Alan Thompson Points 325

Vous créez un serveur qui reçoit des requêtes. Au sein de votre serveur, vous pouvez agir en tant que client en adressant une requête à un autre serveur. Vous pouvez ensuite modifier ou agréger la réponse que vous recevez dans la réponse que vous envoyez au client d'origine.

Voir la bibliothèque clj-http pour formuler des demandes. La boîte à outils Clojure propose de nombreuses autres options.

Vous pouvez également être intéressé par cette liste de ressources documentaires .

1voto

jarmond Points 636

Jetez un coup d'œil à ring-request-proxy en ici . D'après la documentation :

(ns myapp.core
  (:require [ring-request-proxy.core :as proxy])

; Middleware format: Delegates request to handler when request can't be forwarded
(def app (-> not-found-handler
             (proxy/proxy-request {:identifier-fn :server-name
                                   :host-fn {"my-server" "http://my-internal-server"}})))

Vous devriez l'utiliser comme intermédiaire pour tous les itinéraires que vous souhaitez utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X