Sie sind hier
E-Book

Node.js

Professionell hochperformante Software entwickeln

AutorRalph Winzinger, Robert Prediger
VerlagCarl Hanser Fachbuchverlag
Erscheinungsjahr2015
Seitenanzahl370 Seiten
ISBN9783446437586
FormatePUB/PDF
KopierschutzWasserzeichen/DRM
GerätePC/MAC/eReader/Tablet
Preis27,99 EUR
- What is Node.js and why should I care? Lernen Sie die Charakteristiken und typischen Einsatzgebiete von Node.js kennen.
- Begleiten Sie uns im Umfeld von JavaScript und Node.js durch den kompletten Entwicklungszyklus - Develop, Build, Test, Run.Kaufen Sie hier:

Horizontale Tabs

Leseprobe
1Hello, Node.js

Was ist Node.js eigentlich und wie arbeitet man nun damit? Das ist die zentrale Frage, die im ersten Teil des Buchs beantwortet werden soll. Hier geht es nicht darum, welche Bibliotheken bei der Erstellung großer Softwareprojekte besonders hilfreich sind oder wie man dafür sorgt, dass eine Node.js-Anwendung stabil läuft, auch wenn sie eine Unmenge von Anfragen abarbeiten muss. Nein, dieser Teil des Buchs liegt zeitlich vor den ersten Zeilen Anwendungscode, die hoffentlich bald entstehen.

Am Anfang dürfen natürlich ein paar einführende Worte zu Node.js nicht fehlen. Woher kommt dieses Node eigentlich und was ist daran besonders? Die technischen Tiefen werden erst im letzten Teil des Buchs erreicht, aber eine Idee von der Funktionsweise sollte man trotzdem von Anfang an haben.

Und neben der Idee bedarf es natürlich auch noch des notwendigen Handwerkszeugs. Node.js braucht eine Laufzeitumgebung ? für welche Systeme existiert die und wo kann man sie bekommen? Mit welchen Tools kann Quellcode editiert werden? Wo findet man Bibliotheken und wie kann man diese benutzen? Wenn auch diese Fragen alle geklärt sind, hat man keine Ausreden mehr, sich die Finger am Code schmutzig zu machen. Und auch wenn man kein Enterprise-System realisieren möchte ? Spaß kann man mit Node.js allemal haben. Und das ist schon mal ein ganz wichtiger Punkt!

1.1Einführung in Node.js

Node.js hat ein unglaubliches Wachstum hingelegt. Von der ersten Ankündigung durch Ryan Dahl 20091 bis heute (Ende 2014) sind nur fünf Jahre vergangen. Das Node.js Repository auf GitHub ist aktuell auf Platz zwei der „most starred repositories“2 (und unter den ersten 15 der „most forked repositories“3).

Auf der anderen Seite gibt es auch einen geradezu aggressiven „Backlash“4. Natürlich ist das „trolling“ ? sinnvolle Argumente sind in solchen Fällen nur selten auszumachen. Auch Beiträge wie „Node.JS Is Stupid And If You Use It So Are You“5 fallen ganz klar in diese Kategorie.

Warum ist das so? Node.js ist immer noch vergleichsweise neu, hat sich aber schon an vielen Stellen einen festen Platz in der Anwendungslandschaft ergattert. Nichtsdestotrotz gibt es aber immer noch eine Art missionarischen Effekt. Überzeugte Anwender möchten Node.js weiter aus seiner Nische holen und versuchen, andere von seinen Vorteilen zu überzeugen. Dann gibt es natürlich auch den gegenläufigen Effekt: Jemand probiert etwas aus, von dem er gerade Lobpreisungen über sich hat ergehen lassen. Und dann passt es nicht zu seinem Problem, seinen Erwartungen oder einfach seiner aktuellen Denkweise. Er hat Zeit investiert und ist enttäuscht. Also muss die Technologie nutzlos, unsinnig oder überflüssig sein. Unter Umständen reicht für viele Entwickler alleine schon die Tatsache, dass Node.js auf JavaScript basiert, um es als indiskutabel einzustufen.

Weshalb haben wir nun ein Buch über Node.js geschrieben? Nicht weil wir missionieren möchten und denken, dass Node.js das Beste seit geschnitten Brot ist. Es gibt Situationen, in denen Node.js eine gute Lösung darstellt, aber auch Situationen, in denen man vielleicht zu einer Alternative greifen sollte. In den nächsten Kapiteln versuchen wir nicht nur Vorteile, sondern auch Nachteile zu zeigen ? insbesondere auch im Hinblick auf „professionelle Softwareentwicklung“. JavaScript hat nicht den besten Ruf in unserer Industrie und es wird schnell behauptet, dass es nicht als Basis für unternehmenskritische Anwendungen dienen kann. Es ist natürlich schwierig, hier absolute K.O.-Kriterien für oder gegen eine solche Verwendung zu finden ? Node.js ist sicherlich erwachsen genug, um nicht sofort auszuscheiden. Wir versuchen aber, viele Aspekte zu betrachten, die in den Bereich der professionellen Softwareentwicklung fallen, und beleuchten, wie diese Aspekte in Node.js und JavaScript behandelt werden. Unserer Meinung nach schneiden Node.js und JavaScript hier nicht immer optimal ab. Allerdings hängt es vom konkreten Szenario ab, ob ein ganz bestimmter Aspekt nun benötigt wird oder nicht. Node.js hat es auf jeden Fall verdient, eine Chance zu bekommen. Es kann vielleicht nicht in allen Bereichen mit etablierten Sprachen und Umgebungen wie dem Java-Ökosystem mithalten, aber es gibt durchaus Situationen, in denen Node.js einfach auf der Überholspur vorbeizieht …

Also, was ist der Nutzen von Node.js? Oder besser: Welches Problem löst Node.js besser als andere Technologien?

Eines der wichtigsten Probleme für Internetanwendungen ist Skalierbarkeit. Wenn die Benutzeranzahl steigt, soll der Ressourcenverbrauch nach Möglichkeit linear steigen. Von den relevanten Ressourcen CPU, I/O und RAM soll Node.js vor allem die Skalierbarkeit bei I/O-intensiven Anwendungen verbessern.

Um dies zu erreichen, setzt Node.js vollständig auf asynchrone I/O-Zugriffe. Wann immer Node.js auf eine Datenbank, einen Webservice oder auf das Dateisystem zugreift, erfolgt der Aufruf asynchron. Was macht das für einen Unterschied?

Im synchronen Fall könnte ein Datenbankaufruf folgendermaßen aussehen:

result = database.query("SELECT * FROM user"); result.get…

Der aktuelle Thread wartet auf das Ergebnis und wird „geweckt“, wenn das Ergebnis vorliegt (s. Bild 1.1). Dieses Verfahren funktioniert gut und ist aus konzeptioneller Sicht leicht zu begreifen. Als Entwickler kann man so programmieren, als ob man keine Nebenläufigkeit hätte. Man muss sich (meist) nicht um Synchronisation kümmern. Und das Wichtigste: Die Kosten für das Wechseln von einem Thread zum nächsten sind vernachlässigbar.

Bild 1.1 multi-threaded Server

Doch was tun, wenn die Kosten für den Wechsel nicht mehr vernachlässigbar sind? Wenn auf den „Thread Context Switch“ ein signifikanter Anteil an der Gesamtlaufzeit entfällt?

Hinzu kommt, dass Threads Hauptspeicher verbrauchen. Ein Java-Applikationsserver hat oft 200 bis 300 Threads. Auf einem 64-Bit-Linux-System wird für einen Thread 1 MB für den Stack reserviert. Somit werden ca. 250 MB verbraucht, die nur für die Threads benötigt werden. In vielen Anwendungen spielt das keine Rolle, da für den Heap allein 8 GB veranschlagt werden. Doch wenn die Anwendung

  • sehr viele parallele Zugriffe hat,

  • viel I/O (Datenbank, Dateisystem etc.) benötigt,

wird es eng. Was heißt in diesem Zusammenhang „viel“? 100 Zugriffe pro Minute sind (unserer Meinung nach) noch nicht viel. Spätestens bei 100 parallelen Zugriffen pro Sekunde wird Node.js definitiv interessant.

Keine Threads!

Was macht Node.js anders? Node.js verwendet nur einen Thread. Das ist alles. Nun ja, das ist nun etwas plakativ formuliert und technisch auch nicht ganz korrekt, aber in einer ersten Näherung ist es das, was Node.js anders macht als die meisten gewohnten Umgebungen. Wie handhabt Node.js dann Hunderte von parallelen Zugriffen? Es arbeitet einfach einen Auftrag nach dem anderen ab ? und wann immer dann auf einen langsamen I/O-Zugriff gewartet werden muss, wird der aktuelle Auftrag einfach beendet und ein neuer Auftrag für die Verarbeitung der Antwort erzeugt.

Bild 1.2 Node.js Event-Loop

In der Abbildung „Node.js Event-Loop“ ist der Ablauf ? stark vereinfacht ? skizziert. Es gibt eine Warteschlange mit Aufträgen, die bereit zur Verarbeitung sind („ready to execute“). Sobald der Verarbeitungs-Thread frei ist, beginnt er mit der Abarbeitung des Auftrags „a“. Wenn dann jedoch ein I/O-Zugriff erfolgt, wird die Abarbeitung des Auftrags beendet und ein Folgeauftrag „a1“ erzeugt. Dieser Auftrag wird jedoch erst dann in die „ready-to-execute“-Queue eingestellt, wenn der I/O-Zugriff abgeschlossen ist.

Bei Node.js muss der Entwickler jeden Folgeauftrag als „Callback-Funktion“ selbst definieren ? ein Vorgehen, das jedem JavaScript-Entwickler sehr vertraut sein dürfte und zu Code wie dem folgenden führt:

database.query( "SELECT * FROM user", function(result) { result… } );

Wirklich schwer zu lesen wird es, wenn bei der Verarbeitung der Antwort wiederum ein I/O-Zugriff mit der nächsten Callback-Funktion zu schreiben ist. Statt der geschachtelten anonymen Funktionen kann man natürlich auch mit explizit benannten Funktionen arbeiten:

function schritt1(result) { ... database.query("...", schritt2); } function schritt2(result) { ... } database.query("...", schritt1);

Damit wird es jedoch schwerer, den tatsächlichen Ablauf in den Codestrukturen nachzuvollziehen.

Da es vielen Programmierern so geht, gibt es eine große Menge an Node.js-Bibliotheken, die einen besser lesbaren Code ermöglichen. Zwei solche Bibliotheken werden im zweiten Teil im Abschnitt 2.8 gezeigt.

Wenn es keine Threads gibt, stellt sich die Frage: Wie nutzt man Multi-Prozessor und Multi-Core-Maschinen sinnvoll aus? Wenn man Node.js auf einer solchen Maschine laufen lässt, wäre gerade mal ein Core ausgelastet. Deshalb sollte man pro Core eine Node.js-Instanz laufen lassen und noch einen Core für andere Aufgaben freihalten. Das bedeutet aber auch, dass man sich um das Thema Session State kümmern muss.

Kriterien für den Einsatz von Node.js

Durch die Vermeidung von Threads benötigt Node.js tendenziell weniger Hauptspeicher und durch den Wegfall des Thread-Context-Wechsels auch weniger CPU-Zyklen; was aber ? wie gesagt ? erst bei einer hohen Anzahl konkurrierender Zugriffe relevant wird.

Machen aber die Kosten für die Server einen relevanten Anteil am Budget...

Blick ins Buch
Inhaltsverzeichnis
Vorwort12
.?.?. und ihre Motivation14
Das Zielpublikum14
Das Buch15
Die Welt von JavaScript16
1?Hello, Node.js18
1.2?Installation25
1.2.1?Windows25
1.2.2?Mac OS X25
1.2.3?Debian26
1.2.4?Ubuntu26
1.2.5?openSUSE und SLE27
1.2.6?Fedora28
1.2.7?RHEL und CentOS28
1.3?IDEs28
1.3.1?cloud929
1.3.2?WebStorm31
1.3.3?Nodeclipse32
1.3.4?WebMatrix/VisualStudio33
1.3.5?Atom33
1.4?nvm & nodist – mit Node-Versionen jonglieren34
1.4.1?*ix-Systeme35
1.4.2?Windows36
1.5?npm – Node Packaged Modules38
1.5.1?npm install – ein Modul laden39
1.5.2?Global? Lokal?40
1.5.3?package.json41
1.5.4?Module patchen41
1.5.5?Browserify45
1.6?Kein Code?47
2?You build it .?.?.52
2.1?File I/O53
2.1.1?Dateifunktionen in Node.js53
2.1.2?Permissions56
2.1.3?„watch“ – Änderungen im Auge behalten57
2.1.4?Erweiterungen58
2.1.4.1?Modul „fs-extra“59
2.1.4.2?Modul „file“60
2.1.4.3?Modul „find“60
2.1.4.4?Modul „properties“61
2.1.4.5?Modul „token-filter“62
2.2?Streams63
2.2.1?Aus Streams lesen .?.?.64
2.2.1.1?Objekte und Strings65
2.2.2?.?.?. und in Streams schreiben66
2.2.2.1?Streams verknüpfen66
2.2.3?Eigene Streams implementieren67
2.2.3.1?Ein Random-Number-Generator68
2.2.3.2?Ein Daten-Lösch-Stream70
2.2.3.3?Ein Verschlüsselungsserver für geheime Botschaften71
2.2.4?Buffers and Strings73
2.3?Daten für immer74
2.3.1?Neo4j74
2.3.1.1?Asynchron?77
2.3.1.2?Querying Neo4j78
2.3.1.3?Cypher für Abfragen79
2.3.1.4?Indizes81
2.3.1.5?Cypher für Batches82
2.3.2?MongoDB83
2.3.2.1?Wann sind Daten geschrieben?84
2.3.2.2?_id85
2.3.2.3?Die Mongo-API85
2.4?Sichtbarkeit erzeugen – im Web90
2.4.1?Middleware Framework Connect90
2.4.1.1?Installation und einführendes Beispiel91
2.4.1.2?Ausprägungen von Connect-Middleware-Typen92
2.4.1.3?Integrierte Middleware-Komponenten94
2.4.1.4?Middleware-Strukturen102
2.4.2?Webentwicklung mit Express107
2.4.2.1?Ready for take off: Installation und Einführungsbeispiel108
2.4.2.2?Routing von HTTP-Anfragen111
2.4.2.3?Views und Web-Templating115
2.4.3?Express 4116
2.4.4?Jade118
2.4.4.1?Einbindung in Express120
2.4.4.2?Sprachelemente von Jade120
2.4.5?swig133
2.4.5.1?Grundeinstellungen133
2.4.5.2?Einbindung in Express134
2.4.5.3?Sprachelemente von swig135
2.4.5.4?Filterliste138
2.4.5.5?Verketten von Filtern141
2.4.5.6?Die swig-API141
2.4.5.7?Eigene Funktionalitäten hinzufügen143
2.4.6?Sessions & Authentifizierung144
2.4.6.1?Ich will Kekse und biete dafür eine Session145
2.4.6.2?Authentifizierung (Authentication)147
2.4.6.3?Facebook150
2.4.6.4?Twitter151
2.4.6.5?Google152
2.5?socket.io153
2.5.1?Verbindung herstellen154
2.5.2?Kommunikation155
2.5.3?Broadcast156
2.5.4?Private Daten156
2.5.5?Rückantwort und Bestätigung156
2.5.6?Namespaces157
2.5.7?Räume158
2.5.8?Autorisierung160
2.5.8.1?Globale Autorisierung160
2.5.8.2?Autorierung mit Namespaceses161
2.5.8.3?Benutzerdefinierte Variablen und Autorisierung162
2.5.9?Sessions mit „socket.io-session“162
2.5.9.1?socket.io-bundle162
2.5.9.2?socket.io-passport163
2.5.10?Version 1.0164
2.6?Node.js und Webservices168
2.6.1?SOAP-Services168
2.6.1.1?Von und nach SOAP170
2.6.2?REST-Services180
2.6.2.1?Von Nomen, Verben und Routen181
2.6.2.2?Ansichtssache? Verhandlungssache185
2.6.2.3?Fehlermeldungen187
2.6.2.4?Plug-ins188
2.6.2.5?Sicherheit und Authentifizierung193
2.6.3?XML-Verarbeitung200
2.6.3.1?XML-Parsing200
2.6.3.2?XML-Erzeugung und -Veränderung206
2.6.3.3?Exkurs: Ein (selbst unterschriebenes) Zertifikat erstellen208
2.7?Clustering210
2.7.1?Methoden und Eigenschaften von cluster214
2.7.1.1?isMaster/isWorker214
2.7.1.2?fork/online – Event214
2.7.1.3?exit – Event215
2.7.1.4?workers215
2.7.2?Der Master215
2.7.2.1?setupMaster()216
2.7.2.2?fork()217
2.7.2.3?disconnect()217
2.7.3?Der Worker218
2.7.3.1?Die Attribute „id“ und „process“218
2.7.3.2?Das suicide-Attribut218
2.7.3.3?kill() & disconnect()218
2.8?Der Callback-Hölle entfliehen219
2.8.1?async220
2.8.1.1?Kontrollfluss222
2.8.2?Q229
2.8.2.1?then231
2.8.2.2?fail232
2.8.2.3?progress232
2.9?Auf Herz und Nieren – Node.js-Anwendungen testen233
2.9.1?Mocha234
2.9.1.1?Asynchrone Aufrufe und Timeouts237
2.9.1.2?Set-Up & Tear-Down239
2.9.1.3?Only & Skip240
2.9.1.4?Mocha im Browser240
2.9.2?Assert & Chai242
2.9.2.1?Assert242
2.9.2.2?Chai244
2.9.3?Sinon249
2.9.3.1?Spies251
2.9.3.2?Stubs252
2.9.3.3?Mocks253
2.9.3.4?Faked Timers254
2.9.4?Jasmine255
2.9.5?Continuous Test256
2.9.5.1?Mocha & Jasmine im Überwachungsmodus256
2.9.5.2?Travis-CI257
3?.?.?. you run it!262
3.1.1?Patterns & Style263
3.1.1.1?package.json264
3.1.1.2?Import & Export265
3.1.1.3?Tests266
3.1.1.4?Dokumentation267
3.1.2?Ausführbare Module269
3.1.3?Module mit nativen Abhängigkeiten271
3.1.3.1?OS Libraries272
3.1.3.2?Sourcecode Dependencies273
3.1.3.3?Hands-On mit Add-On274
3.1.4?It works on my machine – Dependency Hell283
3.1.5?Veröffentlichung von Modulen286
3.1.5.1?Einen Benutzer erzeugen .?.?.286
3.1.5.2?.?.?. und das Modul publizieren286
3.2?Private Repositories für npm287
3.2.1?reggie288
3.2.1.1?Inbetriebnahme288
3.2.1.2?reggie publish289
3.2.1.3?Laden von Modulen289
3.2.1.4?HTTP-Abfragen291
3.2.1.5?npm-Client291
3.2.2?sinopia292
3.3?Deployment294
3.3.1?Ein eigener Server295
3.3.1.1?Docker295
3.3.1.2?Modul „forever“297
3.3.1.3?pm2301
3.3.1.4?git-deploy307
3.3.2?Cloud308
3.3.2.1?PaaS-Provider308
3.3.2.2?Server-Systeme312
3.4?Was Node.js antreibt .?.?. V8 Engine313
3.4.1?Architektur314
3.4.2?Die Performance-Tricks316
3.4.2.1?„Fast Property Access“317
3.4.2.2?Arrays318
3.4.2.3?Kein Interpretationsspielraum319
3.4.2.4?Garbage Collection319
3.4.2.5?Caching Modules320
3.5?Logging321
3.5.1?debug321
3.5.2?winston324
3.5.2.1?Transportmechanismen324
3.5.2.2?Logger-Instanz325
3.5.2.3?Logging Levels326
3.5.2.4?Strukturierte Daten loggen326
3.5.2.5?Profiling327
3.5.3?Bunyan328
3.5.3.1?Konfiguration329
3.5.3.2?Child Logger330
3.5.3.3?Die „src“-Option331
3.5.3.4?Streams331
3.6?Debugging332
3.6.1?Der Node-Debugger332
3.6.2?Node-Inspector335
3.7?Monitoring338
3.7.1?Kommerzielle Monitoring-Services340
3.7.1.1?New Relic340
3.7.1.2?Nodetime342
3.7.1.3?StrongOps346
3.8?Alternativen zu Node.js351
3.8.1?Vert.x – die polyglotte JVM-Alternative352
3.8.1.1?Architektur352
3.8.1.2?Hands-On359
3.8.1.3?Node.js oder Vert.x?364
Index366

Weitere E-Books zum Thema: Internet - Intranet - Webdesign - Security

Internet für Psychologen

E-Book Internet für Psychologen
Format: PDF

Das Internet kurz zu erklären und gleichzeitig einen aktuellen Überblick über psychologische Themen und Forschungsschwerpunkte zu geben, ist wohl ein hoffnungsloses Unterfangen. Zu…

Internet für Psychologen

E-Book Internet für Psychologen
Format: PDF

Das Internet kurz zu erklären und gleichzeitig einen aktuellen Überblick über psychologische Themen und Forschungsschwerpunkte zu geben, ist wohl ein hoffnungsloses Unterfangen. Zu…

Internet für Psychologen

E-Book Internet für Psychologen
Format: PDF

Das Internet kurz zu erklären und gleichzeitig einen aktuellen Überblick über psychologische Themen und Forschungsschwerpunkte zu geben, ist wohl ein hoffnungsloses Unterfangen. Zu…

Internet für Psychologen

E-Book Internet für Psychologen
Format: PDF

Das Internet kurz zu erklären und gleichzeitig einen aktuellen Überblick über psychologische Themen und Forschungsschwerpunkte zu geben, ist wohl ein hoffnungsloses Unterfangen. Zu…

Texten für das Web

E-Book Texten für das Web
Erfolgreich werben, erfolgreich verkaufen Format: PDF

Dieses Buch bietet das nötige Handwerkszeug, um die Qualität der eigenen Web-Texte zu verbessern bzw. eingekaufte Texte sicherer beurteilen zu können. Es liefert klare Kriterien für die Textanalyse,…

Texten für das Web

E-Book Texten für das Web
Erfolgreich werben, erfolgreich verkaufen Format: PDF

Dieses Buch bietet das nötige Handwerkszeug, um die Qualität der eigenen Web-Texte zu verbessern bzw. eingekaufte Texte sicherer beurteilen zu können. Es liefert klare Kriterien für die Textanalyse,…

Texten für das Web

E-Book Texten für das Web
Erfolgreich werben, erfolgreich verkaufen Format: PDF

Dieses Buch bietet das nötige Handwerkszeug, um die Qualität der eigenen Web-Texte zu verbessern bzw. eingekaufte Texte sicherer beurteilen zu können. Es liefert klare Kriterien für die Textanalyse,…

TCP/IP-Praxis

E-Book TCP/IP-Praxis
Dienste, Sicherheit, Troubleshooting Format: PDF

Netzwerke modernen Standards verlangen weniger nach Rezepten für Neu - Design als vielmehr nach Wegen, Maßnahmen zur Integration in eine bestehende Infrastruktur aufzuzeigen. Diesem Aspekt trägt TCP/…

E-Learning

E-Book E-Learning
Einsatzkonzepte und Geschäftsmodelle Format: PDF

Der vorliegende Band ist dem Lernen und Lehren auf der Basis moderner Informations- und Kommunikationstechnologien gewidmet. Das Buch fasst die wichtigsten Ansätze zur Einführung, Umsetzung und…

E-Learning

E-Book E-Learning
Einsatzkonzepte und Geschäftsmodelle Format: PDF

Der vorliegende Band ist dem Lernen und Lehren auf der Basis moderner Informations- und Kommunikationstechnologien gewidmet. Das Buch fasst die wichtigsten Ansätze zur Einführung, Umsetzung und…

Weitere Zeitschriften

Berufsstart Bewerbung

Berufsstart Bewerbung

»Berufsstart Bewerbung« erscheint jährlich zum Wintersemester im November mit einer Auflage von 50.000 Exemplaren und ermöglicht Unternehmen sich bei Studenten und Absolventen mit einer ...

Correo

Correo

 La Revista de Bayer CropScience para la Agricultura ModernaPflanzenschutzmagazin für den Landwirt, landwirtschaftlichen Berater, Händler und am Thema Interessierten mit umfassender ...

Demeter-Gartenrundbrief

Demeter-Gartenrundbrief

Einzige Gartenzeitung mit Anleitungen und Erfahrungsberichten zum biologisch-dynamischen Anbau im Hausgarten (Demeter-Anbau). Mit regelmäßigem Arbeitskalender, Aussaat-/Pflanzzeiten, Neuigkeiten ...

dental:spiegel

dental:spiegel

dental:spiegel - Das Magazin für das erfolgreiche Praxisteam. Der dental:spiegel gehört zu den Top 5 der reichweitenstärksten Fachzeitschriften für Zahnärzte in Deutschland (laut LA-DENT 2011 ...

Der Steuerzahler

Der Steuerzahler

Der Steuerzahler ist das monatliche Wirtschafts- und Mitgliedermagazin des Bundes der Steuerzahler und erreicht mit fast 230.000 Abonnenten einen weitesten Leserkreis von 1 ...