Εδώ στο Tyk, η διαχείριση API είναι η επιχείρησή μας και η επιχείρησή μας είναι απλή. προσφέρουν στον καταναλωτή το πιο σημαντικό ποσό αξίας APIM με τη μικρότερη πολυπλοκότητα. Αυτό περιλαμβάνει την παροχή στους πελάτες με τα εργαλεία που απαιτούνται για τη διαχείριση του 99 τοις εκατό των περιπτώσεων χρήσης σας και την παροχή ενός επεκτάσιμου πλαισίου για εκείνες που μπορεί να είναι μοναδικές για την επιχειρηματική σας λογική.
Οι μετασχηματισμοί περιλαμβάνονται στο Tyk
Πάρτε, για παράδειγμα, μεταμορφώσεις. Είτε χρησιμοποιείτε το Tyk Open Source είτε το Tyk Pro, σας παρέχονται οι εκτενείς προσθήκες μας (συμπεριλαμβανομένων των μετασχηματισμών). Συμπεριλαμβάνονται μπαταρίες – χωρίς επιπλέον κόστος. Οι μετασχηματισμοί του Tyk τροφοδοτούνται από τα πρότυπα Go και το κλαδιού βιβλιοθήκη, το οποίο προσφέρει ισχυρές λειτουργίες προτύπου. Πράγματα όπως οι επαναλήψεις, οι προϋποθέσεις και οι χειρισμοί δεδομένων υποστηρίζονται εγγενώς.
Γιατί λοιπόν θα θέλατε να ανακαλύψετε ξανά τον τροχό με μετασχηματισμούς μέσω πρόσθετων; Μπορεί να έχετε βασική επιχειρηματική λογική σε μετασχηματισμούς που υλοποιούνται σε διάφορες γλώσσες προγραμματισμού.
Ίσως οι μετασχηματισμοί σας πρέπει να αξιοποιήσουν βιβλιοθήκες μηχανικής εκμάθησης όπως το NumPy ή το Tensorflow. Ανεξάρτητα από το σκεπτικό, είμαστε εδώ για να επιτρέψουμε την επιτυχία σας. Το Tyk μπορεί να λειτουργήσει ως διέλευση gRPC ή πελάτης gRPC και να πραγματοποιεί εξερχόμενες κλήσεις προς τις υπηρεσίες gRPC που διαθέτετε.
Αυτός ο οδηγός θα σας οδηγήσει στη διαμόρφωση ενός διακομιστή gRPC τον οποίο μπορείτε να αξιοποιήσετε για να προσθέσετε επιπλέον λογική στα αιτήματά σας API. Οποιαδήποτε γλώσσα που υποστηρίζεται από gRPC θα λειτουργεί όπως παρέχουμε τους ορισμούς του Protobuf. Ωστόσο, το επίκεντρο αυτού του οδηγού θα είναι μια εφαρμογή Python ενός διακομιστή gRPC.
Για παράδειγμα, όπως απεικονίζεται στο Φιγούρα 1, ένας καταναλωτής API μπορεί να υποβάλει αίτημα API σε μια Microservice (ή υπηρεσία) που διαχειρίζεται η Tyk. Μια προσθήκη gRPC καθορίζεται στον ορισμό του API στο Tyk-Gateway (πελάτης), το οποίο έρχεται σε επαφή με τον διακομιστή gRPC που εκτελείται στο κεντρικό σύστημα.Υπάρχουν πολλά στάδια στο αίτημα αλυσίδας ενδιάμεσου λογισμικού. εσείς μπορεί να προσθέσει προσαρμοσμένη λογική μέσω προσθηκών. για παράδειγμα, Φιγούρα 1 απεικονίζει τη λογική που εκτελείται στο στάδιο «απόκρισης». Εάν επισυνάψετε ένα πρόγραμμα εντοπισμού σφαλμάτων στον διακομιστή gRPC, μπορείτε να υποκλέψετε το αίτημα και να εντοπίσετε σφάλματα και να αναπτύξετε την προσθήκη σας.
Έχουμε δύο δυνατότητες για εγκατάσταση Tyk. αυτός ο οδηγός θα καλύπτει οδηγίες τόσο για εγκαταστάσεις ανοιχτού κώδικα όσο και για εγκαταστάσεις με άδεια χρήσης.
ΣΗΜΕΙΩΣΗ: Αυτός ο οδηγός έχει δοκιμαστεί μόνο σε OSX (INTEL CPU).
1. Οδηγίες ανοιχτού κώδικα Tyk:
1.1) Βεβαιωθείτε ότι έχετε τις ακόλουθες εξαρτήσεις στο σύστημά σας:
Αυτός ο οδηγός προϋποθέτει ότι έχετε εγκαταστήσει το Docker, το Docker-Compose και το Python 3 στο κεντρικό σύστημα. Σε συστήματα OSX, χρειάζεστε Docker Desktop. Θα χρειαστεί επιπλέον να εγκαταστήσετε τα ακόλουθα πακέτα Python:
pip3 install grpcio pip3 install grpcio-tools brew install protobuf
1.2) Κλωνοποίηση και ανάπτυξη Tyk-Gateway ανοιχτού κώδικα
Σε αυτό το παράδειγμα, θα κλωνοποιήσουμε μια προσαρτημένη έκδοση του ανοιχτού κώδικα Tyk-Gateway:
git clone https://github.com/TykTechnologies/tyk-gateway-docker
Πλοηγηθείτε στον κατάλογο cd tyk-gateway-docker
Βεβαιωθείτε ότι έχετε ενημερώσει το αρχείο ρυθμίσεων tyk.standalone.conf με τις αξίες που περιγράφονται σε αυτό σύνδεσμος τεκμηρίωσης. Συνοπτικά, οι δύο πιο σημαντικές διαμορφώσεις είναι το enable_coprocess και το coprocess_grpc_server. Δεδομένου ότι η πύλη μας θα εκτελείται εντός του Docker και του διακομιστή μας gRPC στον κεντρικό υπολογιστή, δίνουμε οδηγίες στην πύλη να απευθυνθεί στον διακομιστή gRPC στον κεντρικό υπολογιστή μέσω του host.docker.internal..
"coprocess_options": { "enable_coprocess": true, "coprocess_grpc_server": "tcp://host.docker.internal:5555" },
Αναφορά 1: Δείγμα επιλογών διαμόρφωσης για coprocess_options.
Τώρα με τις επιλογές που έχουν διαμορφωθεί, η πύλη μπορεί να ξεκινήσει με ένα απλό:
«docker-compose up». Μπορείτε να επιβεβαιώσετε ότι η πύλη έχει αναπτυχθεί με επιτυχία με μια εντολή curl:
curl http://localhost:8080/hello
Η έξοδος σας θα πρέπει να μοιάζει με αυτό:
{"status":"pass","version":"4.1.0","description":"Tyk GW","details":{"redis":{"status":"pass","componentType":"datastore","time":"2022-10-05T19:10:52Z"}}}
1.3) Κλωνοποίηση αποθετηρίου Tyk, Δημιουργία ορισμών Protobuf και ανάπτυξη διακομιστή gRPC
Τώρα που έχουμε ένα ανοιχτού κώδικα Tyk-Gateway που εκτελείται, π.χήρθε η ώρα να ανοίξετε έναν διακομιστή gRPC. Παρέχουμε μερικούς διακομιστές gRPC στο Αποθετήριο Tyk Github.
git clone https://github.com/TykTechnologies/tyk.git
Μεταβείτε στο «tyk/coprocess/proto» και εκτελέστε το «./update_bindings.sh»
Αυτό θα δημιουργήσει τις δεσμεύσεις protobuf. Αυτοί οι ορισμοί επιτρέπουν στο Tyk-Gateway (πελάτη) να ανταλλάσσει δεδομένα με τον διακομιστή gRPC χωρίς προβλήματα. Τώρα το αρχείο διακομιστή πρέπει να ενημερωθεί με τη σωστή δήλωση εισαγωγής και μπορεί να εκκινηθεί σωστά.
Επεξεργαστείτε το ακόλουθο «tyk/coprocess/bindings/python/sample_server.py» και αντικαταστήστε το με το δείγμα κώδικα διακομιστή εδώ.
sample_server.py
import coprocess_object_pb2, coprocess_object_pb2_grpc from coprocess_session_state_pb2 import SessionState import grpc, time, json, gzip _ONE_DAY_IN_SECONDS = 60 * 60 * 24 from concurrent import futures def MyPreMiddleware(coprocess_object): coprocess_object.request.set_headers["MyPreMiddleware"] = "MyPreMiddleware" return coprocess_object def MyPostMiddleware(coprocess_object): body = coprocess_object.response.body json_body = json.loads(body) json_body['Transform'] = 'Custom Field' coprocess_object.response.body = json.dumps(json_body) coprocess_object.response.raw_body=json.dumps(json_body).encode('utf-8') coprocess_object.response.headers['Content-Length'] = str(len(coprocess_object.response.raw_body)) return coprocess_object def MyResponseMiddleware(coprocess_object): # Unzip Response gzip_decoded_body = gzip.decompress(coprocess_object.response.raw_body) json_body = json.loads(str(gzip_decoded_body, 'utf-8')) ids = list() # Extract IDs for item in json_body: ids.append(item['id']) # Format Response coprocess_object.response.body = json.dumps(ids) coprocess_object.response.raw_body = json.dumps(ids).encode('utf-8') coprocess_object.response.headers['Content-Length'] = str(len(coprocess_object.response.raw_body)) coprocess_object.response.headers['Content-Encoding'] = '' return coprocess_object def MyAuthCheck(coprocess_object): valid_token = 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d' request_token = coprocess_object.request.headers["Authorization"] if request_token == valid_token: new_session = SessionState() new_session.rate = 1000.0 new_session.per = 1.0 coprocess_object.metadata["token"] = "mytoken" coprocess_object.session.CopyFrom(new_session) else: coprocess_object.request.return_overrides.response_code = 401 coprocess_object.request.return_overrides.response_error="Not authorized (Python middleware)" return coprocess_object class MyDispatcher(coprocess_object_pb2_grpc.DispatcherServicer): def Dispatch(self, coprocess_object, context): if coprocess_object.hook_name == "MyPreMiddleware": coprocess_object = MyPreMiddleware(coprocess_object) if coprocess_object.hook_name == "MyPostMiddleware": coprocess_object = MyPostMiddleware(coprocess_object) if coprocess_object.hook_name == "MyAuthCheck": coprocess_object = MyAuthCheck(coprocess_object) if coprocess_object.hook_name == "MyResponseMiddleware": coprocess_object = MyResponseMiddleware(coprocess_object) return coprocess_object def DispatchEvent(self, event_wrapper, context): event = json.loads(event_wrapper.payload) return coprocess_object_pb2_grpc.EventReply() def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) coprocess_object_pb2_grpc.add_DispatcherServicer_to_server( MyDispatcher(), server) server.add_insecure_port('[::]:5555') server.start() try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve()
Αυτός ο διακομιστής δείγματος περιλαμβάνει μια επιπλέον συνάρτηση που ονομάζεται MyResponseMiddleware, η οποία εκτελεί μετασχηματισμό σώματος στο upstream JsonPlaceholder για εξαγωγή όλων των αναγνωριστικών από ένα ωφέλιμο φορτίο json.
Τώρα που έχει εισαχθεί, μπορούμε να εκκινήσουμε τον διακομιστή python3.
cd ./tyk/coprocess/bindings/python
python3 sample_server.py]```
1.4) Δημιουργήστε ένα API με ενεργοποιημένη μια προσθήκη gRPC
Κάντε ένα αίτημα POST στο τελικό σημείο /tyk/apis της πύλης για να δημιουργήσετε ένα API με ενεργοποιημένο το gRPC. Βλέπω Αναφορά 2 για ένα πλήρες παράδειγμα. Το παράδειγμα αναφοράς δημιουργεί έναν νέο ορισμό API που αντιστρέφει τους διακομιστή μεσολάβησης στο jsonplaceholder.typicode.com και έχει μια αναφορά σε μια προσθήκη gRPC. Η διαδρομή ακρόασης αυτού του ορισμού API είναι /extract-json-values-grpc-server/.
RESP=`curl https://gist.githubusercontent.com/JRWu/bbabf7bbf65bef868b277a24dd5bcb64/raw/5020ee151bbedc754c256219f279ddbef240ca1d/tyk_apidef_bodytransform_grpc.json` curl -X POST -H "Content-Type: application/json" -H "X-Tyk-Authorization: foo" -d $RESP http://localhost:8080/tyk/apis curl -X GET -H "X-Tyk-Authorization: foo" http://localhost:8080/tyk/reload
Αναφορά 2: Υποβολή αιτήματος ανάρτησης στο /tyk/apis τελικό σημείο για να δημιουργήσετε έναν ορισμό API σχετικά με μια προσθήκη gRPC.
1.5) Δοκιμάστε το τελικό σημείο
Σε Αναφορά 4, μπορείτε τώρα να υποβάλετε ένα αίτημα GET για το νέο σας API και αφού αντιστρέφει τους διακομιστή μεσολάβησης στο jsonplaceholder.typicode.com, το τελικό σημείο /users θα επιστρέψει το αναγνωριστικό του αιτήματός σας. Παρακαλώ δες Αναφορά 3 για την αρχική μη μετασχηματισμένη απόκριση. Ο διακομιστής μας gRPC εισάγει προσαρμοσμένη λογική στο στάδιο „απόκρισης“ στο Αίτημα Middleware Chain. Αυτή η προσαρμοσμένη λογική μάς επιτρέπει να υποκλέψουμε την απόκριση από το upstream μας και να χειριστούμε τα δεδομένα, όπως εξαγωγή όλων των αναγνωριστικών χρηστών σε έναν πίνακα για μια απόκριση. Προαιρετικά, ακολουθήστε Βήμα 1.6 για να επισυνάψετε ένα πρόγραμμα εντοπισμού σφαλμάτων στον διακομιστή gRPC και να υποκλέψετε τα αιτήματα API για ζωντανή αποσφαλμάτωση.
1.6) Προσάρτηση προγράμματος εντοπισμού σφαλμάτων στον διακομιστή gRPC
Θα παρατηρήσετε ότι η διαδικασία για τον διακομιστή gRPC εισέρχεται Βήμα 1.3 εκτελεί απλώς μια παρουσία του sample_server.py από τη γραμμή εντολών. Καθώς αυτή η διαδικασία εκτελείται στον κεντρικό υπολογιστή σας, είναι δυνατό να επισυνάψετε ένα πρόγραμμα εντοπισμού σφαλμάτων. Οποιοδήποτε IDE με πρόγραμμα εντοπισμού σφαλμάτων Python είναι αρκετό. Ωστόσο, στο παράδειγμά μου, θα χρησιμοποιήσω το Pycharm της Jetbrains.
Σχήμα 2 απεικονίζει τη διαμόρφωση μιας διαμόρφωσης Run/Debug μέσα στο IDE μου και όταν επιλέγω το „Εντοπισμός σφαλμάτων της επιλεγμένης διαμόρφωσης” επιλογή που απεικονίζεται από το κόκκινο πλαίσιο μέσα Σχήμα 2το sample_server.py θα ξεκινήσει με συνημμένο πρόγραμμα εντοπισμού σφαλμάτων.
Δημιουργία σημείου διακοπής στον κώδικα διακομιστή gRPC, όπως φαίνεται στο Εικόνα 3και απλώς η υποβολή ενός αιτήματος σε ένα τελικό σημείο API με ενεργοποιημένη την προσθήκη gRPC θα ενεργοποιήσει το IDE να καταγράψει το αίτημα. Όπως τονίζεται στο Εικόνα 3το πλήρες coprocess_object είναι διαθέσιμο για επιθεώρηση.
Εικόνα 2: Διαμόρφωση μιας ρύθμισης παραμέτρων Run/Debug στο PyCharm για την παρεμπόδιση αιτημάτων API που αποστέλλονται στον διακομιστή gRPC.
Εικόνα 3: Ορισμός σημείου διακοπής στη μέθοδο MyResponseMiddleware και παρεμπόδιση αιτήματος API.
Ένα δείγμα αιτήματος GET στο jsonplaceholder
curl https://jsonplaceholder.typicode.com/users # Reponse [ > { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "[email protected]", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, { "id": 2, "name": "Ervin Howell", "username": "Antonette", "email": "[email protected]", "address": { "street": "Victor Plains", "suite": "Suite 879", "city": "Wisokyburgh", "zipcode": "90566-7771", "geo": { "lat": "-43.9509", "lng": "-34.4618" } }, "phone": "010-692-6593 x09125", "website": "anastasia.net", "company": { "name": "Deckow-Crist", "catchPhrase": "Proactive didactic contingency", "bs": "synergize scalable supply-chains" } }, … ]
Αναφορά 3: Αναπτύξτε το ακορντεόν παραπάνω για να δείτε α δείγμα αιτήματος GET στο jsonplaceholder ανάντη στο τελικό σημείο /users. Αυτή η απάντηση επιστρέφει έναν πίνακα αντικειμένων json, το καθένα με ένα πεδίο id.
curl localhost:8080/extract-json-values-grpc-server/users # Response [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Αναφορά 4: Ένα δείγμα αιτήματος GET στο τελικό σημείο που διαχειρίζεται το Tyk και μια μετασχηματισμένη απόκριση που περιέχει μόνο τα αναγνωριστικά των χρηστών.
2. Οδηγίες Tyk Pro
2.1 Εγκατάσταση εξαρτήσεων
Οι εξαρτήσεις για το Tyk Pro είναι ίδιες με το Tyk Open Source. Ακολουθήστε τα βήματα που περιγράφονται στο 1.1).
2.2 Εγκαταστήστε το Tyk Pro
Εδώ θα χρησιμοποιήσουμε μια έκδοση του Dockered Tyk-Pro.
git clone https://github.com/TykTechnologies/tyk-pro-docker-demo.git
Πλοηγηθείτε στον κατάλογο
cd tyk-pro-docker-demo
Βεβαιωθείτε ότι λαμβάνετε ένα κλειδί άδειας χρήσης για τον πίνακα ελέγχου Tyk από τον ιστότοπό μας και ακολουθήστε τις οδηγίες του αποθετηρίου σχετικά με τον τρόπο φόρτωσης του κλειδιού άδειας χρήσης μέσω μεταβλητών περιβάλλοντος.
Αυτό το αποθετήριο αξιοποιεί μεταβλητές περιβάλλοντος αντί για αρχεία διαμόρφωσης, επομένως πρέπει να ενημερώσετε τις δύο μεταβλητές περιβάλλοντος στο αρχείο cons/tyk_analytics.env στις ακόλουθες τιμές που απεικονίζονται στο Αναφορά 4. Δεδομένου ότι η πύλη μας θα εκτελείται εντός του Docker και του διακομιστή gRPC στον κεντρικό υπολογιστή, δίνουμε οδηγίες στην πύλη να απευθυνθεί στον διακομιστή gRPC στον κεντρικό υπολογιστή μέσω του host.docker.internal.
TYK_GW_COPROCESSOPTIONS_ENABLECOPROCESS=true TYK_GW_COPROCESSOPTIONS_COPROCESSGRPCSERVER=tcp://host.docker.internal:5555
Αναφορά 5: Οι δύο μεταβλητές περιβάλλοντος πρέπει να οριστούν για να δίνουν εντολή στην πύλη να χρησιμοποιεί τη συνεπεξεργασία και όπου εκτελείται ο διακομιστής gRPC.
Τώρα με τις επιλογές που έχουν διαμορφωθεί, η πύλη μπορεί να ξεκινήσει με ένα απλό «docker-compose up». Μπορείτε να επιβεβαιώσετε ότι η πύλη έχει αναπτυχθεί με επιτυχία με μια εντολή curl:
curl http://localhost:8080/hello
Πλοηγηθείτε στον Πίνακα ελέγχου στο localhost:3000 και συμπληρώστε τις τιμές για να εκκινήσετε την εγκατάσταση Tyk.
2.3 Κλωνοποίηση αποθετηρίου Tyk, δημιουργία ορισμών protobuf και ανάπτυξη διακομιστή gRPC
Όπως και το βήμα 1.3, ακολουθήστε τα βήματα που περιγράφονται στο 1.3.
2.4 Δημιουργήστε ένα API με ενεργοποιημένη μια προσθήκη gRPC
Η δημιουργία ενός API μέσω των API του πίνακα εργαλείων Tyk ή η αξιοποίηση του GUI είναι δυνατή. Σε αυτό το παράδειγμα, θα πλοηγηθούμε στην καρτέλα APIs στην αριστερή πλευρά και θα επιλέξουμε Εισαγωγή API. Μπορείτε να επικολλήσετε τον ορισμό του API που βρέθηκε εδώ για τη δημιουργία ενός API που αντιστρέφει τους διακομιστή μεσολάβησης στο httpbin.org και παραπέμπει σε μια προσθήκη gRPC που βρίσκεται μέσα σε αυτό.
Ορισμός API
{ "api_id": "22c41d3bd44f4764543a704c8934ad0c", "jwt_issued_at_validation_skew": 0, "upstream_certificates": {}, "use_keyless": true, "enable_coprocess_auth": false, "base_identity_provided_by": "", "custom_middleware": { "pre": [], "post": [], "post_key_auth": [], "auth_check": { "name": "", "path": "", "require_session": false, "raw_body_only": false }, "response": [ { "name": "MyResponseMiddleware", "path": "", "require_session": false, "raw_body_only": false } ], "driver": "grpc", "id_extractor": { "extract_from": "", "extract_with": "", "extractor_config": {} } }, "disable_quota": false, "custom_middleware_bundle": "", "cache_options": { "cache_timeout": 60, "enable_cache": true, "cache_all_safe_requests": false, "cache_response_codes": [], "enable_upstream_cache_control": false, "cache_control_ttl_header": "", "cache_by_headers": [] }, "enable_ip_blacklisting": false, "tag_headers": [], "jwt_scope_to_policy_mapping": {}, "tags_disabled": false, "pinned_public_keys": {}, "expire_analytics_after": 0, "domain": "", "openid_options": { "providers": [], "segregate_by_client": false }, "jwt_policy_field_name": "", "enable_proxy_protocol": false, "jwt_default_policies": [], "active": true, "jwt_expires_at_validation_skew": 0, "config_data": {}, "notifications": { "shared_secret": "", "oauth_on_keychange_url": "" }, "jwt_client_base_field": "", "auth": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "check_host_against_uptime_tests": false, "auth_provider": { "name": "", "storage_engine": "", "meta": {} }, "blacklisted_ips": [], "graphql": { "schema": "", "enabled": false, "engine": { "field_configs": [], "data_sources": [] }, "type_field_configurations": [], "execution_mode": "proxyOnly", "proxy": { "auth_headers": {} }, "subgraph": { "sdl": "" }, "supergraph": { "subgraphs": [], "merged_sdl": "", "global_headers": {}, "disable_query_batching": false }, "version": "2", "playground": { "enabled": false, "path": "" } }, "hmac_allowed_clock_skew": -1, "dont_set_quota_on_create": false, "uptime_tests": { "check_list": [], "config": { "expire_utime_after": 0, "service_discovery": { "use_discovery_service": false, "query_endpoint": "", "use_nested_query": false, "parent_data_path": "", "data_path": "", "cache_timeout": 60 }, "recheck_wait": 0 } }, "enable_jwt": false, "do_not_track": false, "name": "ExtractJsonValuesgRPCServer", "slug": "extract-json-values-grpc-server", "is_oas": false, "analytics_plugin": { "enable": false, "plugin_path": "", "func_name": "" }, "oauth_meta": { "allowed_access_types": [], "allowed_authorize_types": [], "auth_login_redirect": "" }, "CORS": { "enable": true, "max_age": 24, "allow_credentials": false, "exposed_headers": [], "allowed_headers": [ "Origin", "Accept", "Content-Type", "X-Requested-With", "Authorization" ], "options_passthrough": false, "debug": false, "allowed_origins": [ "*" ], "allowed_methods": [ "GET", "POST", "HEAD" ] }, "event_handlers": { "events": {} }, "proxy": { "target_url": "https://jsonplaceholder.typicode.com", "service_discovery": { "endpoint_returns_list": false, "cache_timeout": 0, "parent_data_path": "", "query_endpoint": "", "use_discovery_service": false, "_sd_show_port_path": false, "target_path": "", "use_target_list": false, "use_nested_query": false, "data_path": "", "port_data_path": "" }, "check_host_against_uptime_tests": false, "transport": { "ssl_insecure_skip_verify": false, "ssl_min_version": 0, "proxy_url": "", "ssl_ciphers": [] }, "target_list": [], "preserve_host_header": false, "strip_listen_path": true, "enable_load_balancing": false, "listen_path": "/extract-json-values-grpc-server/", "disable_strip_slash": true }, "expiration": "", "client_certificates": [], "use_basic_auth": false, "version_data": { "not_versioned": true, "default_version": "", "versions": { "Default": { "name": "Default", "expires": "", "paths": { "ignored": [], "white_list": [], "black_list": [] }, "use_extended_paths": true, "extended_paths": { "ignored": [], "white_list": [], "black_list": [], "transform": [], "transform_response": [], "transform_jq": [], "transform_jq_response": [], "transform_headers": [], "transform_response_headers": [], "hard_timeouts": [], "circuit_breakers": [], "url_rewrites": [], "virtual": [], "size_limits": [], "method_transforms": [], "track_endpoints": [], "do_not_track_endpoints": [], "validate_json": [], "internal": [] }, "global_headers": { "accept-encoding": "gzip" }, "global_headers_remove": [ "accept-encoding" ], "global_response_headers": {}, "global_response_headers_remove": [], "ignore_endpoint_case": false, "global_size_limit": 0, "override_target": "" } } }, "jwt_scope_claim_name": "", "use_standard_auth": false, "session_lifetime": 0, "hmac_allowed_algorithms": [], "disable_rate_limit": false, "definition": { "enabled": false, "name": "", "default": "", "location": "header", "key": "x-api-version", "strip_path": false, "strip_versioning_data": false, "versions": {} }, "use_oauth2": false, "jwt_source": "", "jwt_signing_method": "", "session_lifetime_respects_key_expiration": false, "jwt_not_before_validation_skew": 0, "use_go_plugin_auth": false, "jwt_identity_base_field": "", "allowed_ips": [], "request_signing": { "is_enabled": false, "secret": "", "key_id": "", "algorithm": "", "header_list": [], "certificate_id": "", "signature_header": "" }, "org_id": "5e9d9544a1dcd60001d0ed20", "domain_disabled": false, "enable_ip_whitelisting": false, "global_rate_limit": { "rate": 0, "per": 0 }, "protocol": "", "enable_context_vars": false, "tags": [], "basic_auth": { "disable_caching": false, "cache_ttl": 0, "extract_from_body": false, "body_user_regexp": "", "body_password_regexp": "" }, "listen_port": 0, "session_provider": { "name": "", "storage_engine": "", "meta": {} }, "auth_configs": { "authToken": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "basic": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "coprocess": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "hmac": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "jwt": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "oauth": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false }, "oidc": { "disable_header": false, "auth_header_name": "Authorization", "cookie_name": "", "name": "", "validate_signature": false, "use_param": false, "signature": { "algorithm": "", "header": "", "use_param": false, "param_name": "", "secret": "", "allowed_clock_skew": 0, "error_code": 0, "error_message": "" }, "use_cookie": false, "param_name": "", "use_certificate": false } }, "strip_auth_data": false, "certificate_pinning_disabled": false, "id": "630f58f02b7536000141565e", "upstream_certificates_disabled": false, "certificates": [], "enable_signature_checking": false, "use_openid": false, "internal": false, "jwt_skip_kid": false, "enable_batch_request_support": false, "enable_detailed_recording": false, "scopes": { "jwt": { "scope_claim_name": "", "scope_to_policy": {} }, "oidc": { "scope_claim_name": "", "scope_to_policy": {} } }, "response_processors": [], "use_mutual_tls_auth": false }
Εικόνα 4: Εισαγωγή του ορισμού API που έχει οριστεί εδώ μέσω του πίνακα εργαλείων Tyk. Ή επεκτείνετε το ακορντεόν παρακάτω για να αποκτήσετε πρόσβαση στον κωδικό.
2.5) Δοκιμάστε το τελικό σημείο
Όπως και στην ενότητα 1.5) δείτε την ενότητα 1.5).
2.6) Προσάρτηση προγράμματος εντοπισμού σφαλμάτων στον διακομιστή gRPC
Όπως και στην ενότητα 1.6) δείτε την ενότητα 1.6).
Ο μετασχηματισμός Tyk και gRPC, ολοκληρώθηκε!
Συγχαρητήρια! Διαμορφώσατε με επιτυχία έναν διακομιστή gRPC τον οποίο μπορείτε να αξιοποιήσετε για να προσθέσετε επιπλέον λογική στα αιτήματά σας API – τόσο για εγκαταστάσεις ανοιχτού κώδικα όσο και για εγκαταστάσεις με άδεια χρήσης.
Όπως απεικονίζεται στο Αναφορά 4, τώρα λάβατε μια απάντηση από το upstream σας και τη μετατρέψατε στον διακομιστή gRPC. Όχι μόνο έχουμε επιδείξει τη δύναμη των πρόσθετων gRPC, αλλά έχουμε επίσης εξερευνήσει μόνο ένα κλάσμα της επεκτασιμότητας του Tyk.
Όπως και τα πρόσθετα Golang, τα πρόσθετα gRPC παρέχουν αγκίστρια σε όλα τα στάδια του ενδιάμεσου λογισμικού αιτήματος. Παρακαλούμε επισκεφθείτε μας
τεκμηρίωση που συνδέεται εδώ για περισσότερες λεπτομέρειες.
Για περαιτέρω υποστήριξη και οδηγίες σχετικά με προσαρμοσμένες προσθήκες και το οικοσύστημα Tyk, ανατρέξτε στο δικό μας κοινοτικά φόρουμ, όπου τα αφοσιωμένα μέλη της ομάδας μας θα σας βοηθήσουν να σας καθοδηγήσουν σε οτιδήποτε Tyk. Καθώς βασιζόμαστε σε αρχές ανοιχτού κώδικα, ενθαρρύνουμε ενεργά τη συνεισφορά και τη συνεργασία μέσω μας Github! Μη διστάσετε να θέσετε ένα πρόβλημα ή να ζητήσετε αίτημα και η ομάδα προϊόντων μας θα χαρεί να ρίξει μια ματιά!