[C ++ Advanced Tutorial] Développer un framework serveur à partir de zéro (Sylar)
Prend en charge le style de rédaction de journaux et le style de journal du journal, prend en charge la personnalisation du format de journal, le niveau de journal, la séparation multi-log et d'autres fonctions, l'utilisation du journal de streaming: Sylar_Log_info (g_logger) << "Ceci est un journal"; Niveau de journal, nom de journal, nom de fichier, numéro de ligne, etc.
Adoptez l'idée de convention due à la configuration. La définition est disponible. Pas besoin d'analyser séparément. Prend en charge la fonction de notification de changement. Utilisez des fichiers YAML comme contenu de configuration. Prend en charge les types de données dans les formats de niveau, prend en charge les conteneurs STL (vecteur, liste, set, map, etc.), prend en charge les types personnalisés (nécessite des méthodes de sérialisation et de désérialisation) comme suit:
static sylar::ConfigVar< int >::ptr g_tcp_connect_timeout =
sylar::Config::Lookup ( " tcp.connect.timeout " , 5000 , " tcp connect timeout " );Un paramètre de délai de connexion TCP est défini.
tcp:
connect:
timeout: 10000Le module de thread résume certaines fonctions couramment utilisées dans Pthread, telles que le thread, le sémaphore, le mutex, le rwmutex, le spinlock, etc., qui peuvent faciliter le développement de threads pour une utilisation quotidienne. De plus, C ++ 11 ne fournit pas de lecture et d'écriture Mutex, Rwmutex, Spinlock, etc., et dans des scénarios de concurrence élevés, ces objets sont souvent utilisés. Alors j'ai choisi de encapsuler Pthread par moi-même
Coroutine: le thread en mode utilisateur, équivalent aux threads dans les threads, est plus léger. Le crochet de socket est configuré dans la configuration suivante, qui peut encapsuler des appels asynchrones complexes dans des opérations synchrones. Réduire la complexité de la rédaction de la logique commerciale. Actuellement, la coroutine est implémentée sur la base d'UContext_t et sera implémentée de manière suivante en utilisant fcontext_t dans boost.context.
Le planificateur Coroutine gère la planification des coroutines et est implémenté en interne en tant que pool de threads, qui prend en charge les coroutines pour basculer entre plusieurs threads, et peut également spécifier que les coroutines sont exécutées dans des threads fixes. Il s'agit d'un modèle de planification Coroutine NM, avec des threads n et des coroutines. Réutilisez chaque fil.
Hériter et Coroutine Scheduler, encapsule Epoll (Linux) et prend en charge la fonction de minuterie (en utilisant Epoll pour implémenter la minuterie, le niveau de millisecondes), et prend en charge l'ajout, la suppression et l'annulation de la lecture et du temps d'écriture du socket. Prend en charge la minuterie unique, la minuterie de cycle, la minuterie de condition et d'autres fonctions
Le système de crochet sous-jacent et les API liés à la prise, les API liées à la prise IO et les API de la série Sleep. Le contrôle d'activation du crochet est granulaire. Libre choix. À travers le module Hook, certaines API sans fonctions asynchrones peuvent être utilisées pour montrer des performances asynchrones. Par exemple (MySQL)
Impapsule la classe de socket, fournit toutes les fonctions de l'API de socket, unifier la classe d'adresses et unifier les adresses IPv4, IPv6 et UNIX. Il fournit également le nom de domaine et les fonctions de résolution IP.
Le module de sérialisation binaire bytearray fournit des opérations communes sur les données binaires. Lire et écrire des types de base int8_t, int16_t, int32_t, int64_t, etc., prennent en charge Varint, std :: string à lire et écrire la prise en charge, prendre en charge la conversion des octets, prendre en charge la sérialisation en fichiers et la désérialisation à partir de fichiers.
Sur la base de la classe de socket, il résume une classe générale de serveur TCPSserver, fournit une API simple, est facile à utiliser et peut rapidement lier une ou plusieurs adresses, démarrer des services, écouter les ports, accepter les connexions, gérer les connexions de socket et autres fonctions. L'implémentation du serveur de fonctions commerciales spécifiques peut être implémentée rapidement en héritant de cette classe.
Interface unifiée en streaming encapsulée. Encapsuler des fichiers et des sockets en interfaces unifiées. Lorsque vous l'utilisez, utilisez un style unifié. Sur la base d'un style unifié, il peut fournir une expansion plus flexible. SocketsStream est actuellement implémenté
RATEL (Machine d'état finie, performances comparables à l'assemblage), met en œuvre une implémentation de protocole simple de HTTP / 1.1 et l'analyse de l'URI. Sur la base de SockeTStream, HTTPConnection (client HTTP) et HTTPSession (lien HTTP Server) sont implémentés. HTTPSServer est implémenté en fonction de TCPServer. Fournit la fonction complète de la demande API du client HTTP et la fonction de serveur API de base HTTP
Après le servlet de Java, un ensemble d'interfaces de servlet est implémentée, servletdispatch et fonctionservlet. NotfoundServlet. Prend en charge la correspondance précise d'Uri, la correspondance floue et d'autres fonctions. Avec le module HTTP, fournissez des fonctions de serveur HTTP
Coordonnées: QQ: 564628276 Courriel: [email protected] WECHAT: Sylar-Yin QQ Group: 8151915 (Sylar Technology Group) Homepage personnel: www.sylar.top github: https://github.com/sylar-yin/sylar