Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in mehrere Service-Frameworks unter .NET

Einführung in mehrere Service-Frameworks unter .NET

黄舟
黄舟Original
2017-02-06 14:22:521941Durchsuche

Einführung


Nachdem das Unternehmen über mehr Dienste verfügt, werden im Allgemeinen einige Service-Frameworks verwendet, um das Anrufen zu erleichtern und um zukünftige Dienste zu verwalten. Hier sind die wichtigsten Einführungen Ich kenne mehrere Service-Frameworks. Lassen Sie mich kurz die Grundkonzepte dieser Service-Frameworks analysieren.


Kann in die Produktionsumgebung gebracht werden


Ich habe Unternehmen gesehen, die in die folgenden zwei Service-Frameworks investiert haben. Es ist ein Produktionsumgebung, sodass Sie sich keine allzu großen Sorgen um die Stabilität machen müssen.

ServiceStack https://github.com/ServiceStack/ServiceStack


ServiceStack wurde möglicherweise nicht verwendet, aber seine anderen beiden Eine Komponente, die jeder hätte verwenden sollen, ServiceStack.Redis (Redis-Zugriffstool), ServiceStack.Text (Json-Serialisierungstool), ServiceStack ist ein Service-Framework, Sie können es problemlos zum Erstellen von Diensten verwenden, der Dienst basiert auf http, In Darüber hinaus werden Client-Aufrufe bereitgestellt, darunter Json, XML, Binary und Protobuf, und die erstellten Dienste verfügen über bestimmte Beschreibungen.


1 Bei der HTTP-Anfrage gibt es zwei wichtige Dinge: den Anforderungspfad und die Parameter. Für ServiceStack sind die Parameter Objekte, dh die Parameter, die übergeben werden sollen, sind gekapselt in eine Klasse Fügen Sie der Klasse im Inneren eine Beschriftung hinzu, und der Inhalt der Beschriftung ist der Anforderungspfad, sodass er beim Aufruf des Clients den Anforderungspfad und die Parameter widerspiegelt und dann den Aufruf initiiert.


Da ServiceStack selbst eine Demo bereitgestellt hat, werde ich die Demo hier nicht schreiben. Sie können daraus lernen.

Hessian https://sourceforge.net/projects/hessiancsharp/


Hessian ist ein Serialisierungstool und ein Service-Framework Bietet Implementierung in mehreren Sprachen, einschließlich .net. Diese Komponente scheint im .Net-Bereich nicht sehr bekannt zu sein und wurde möglicherweise schon lange nicht mehr aktualisiert.

Bei Verwendung von Hessian müssen Sie zunächst Schnittstellen definieren und diese dann duplizieren. Der Client referenziert diese Schnittstellen, und dann verwendet der Client die RealProxxy-Klasse als Proxy Wird schließlich in der Invoke-Methode in der Proxy-Klasse aufgerufen, werden der Name der aufzurufenden Methode, Parameter und andere Inhalte in der Invoke-Methode abgerufen und an eine einheitliche URL auf dem Server gesendet. Diese URL endet mit hessisch, also muss es in web.config sein. Konfigurieren Sie ein Handle zum Abfangen der Anforderung. Deserialisieren Sie nach dem Abfangen der Anforderung die Parameter und initiieren Sie dann den Aufruf durch Reflektion.


Sie können auf diesen Blog verweisen, um hier anzurufen: http://www.cnblogs.com/lxsfg/archive/2008/08/27/1277777.html

Es gibt viele andere Service-Frameworks wie Thrift und JSON-RPC, aber da ich sie noch nie verwendet habe, werde ich hier keinen Kommentar abgeben.


Einige Service-Frameworks im Blogpark

Die folgenden drei Frameworks wurden beim Durchsuchen des Blogparks entdeckt und sind alle Open Source For Learning Das Service-Framework ist ein gutes Projekt. Außerdem gehe ich nicht oft in den Blog-Park. Es sollte auch andere hervorragende Service-Frameworks im Blog-Park geben Wenn Sie sie finden, können Sie sie auch in den Kommentarbereich schreiben und alle gemeinsam lernen lassen.

Rabbit.Rpc http://www.cnblogs.com/ants/p/5605754.html

Ähnlich wie bei Hessin wird auch zuerst die Serviceschnittstelle definiert Anschließend implementiert der Server durch Erben der Schnittstelle eine bestimmte Logik, extrahiert alle Methoden in der Schnittstelle sowie Methodenparameter und Rückgabewertinformationen und generiert dann dynamisch Code, um eine Proxy-Klasse zu generieren dynamisch kompiliert und in den Container gestellt. In Bezug auf die generierte Proxy-Klasse verfügen alle Methoden über eine einheitliche Implementierung. Das heißt, sie rufen eine Invoke-Methode auf, um die Methoden und Parameter an die unterste Ebene zu senden, und die Assembly der unteren Ebene wird an den Server gesendet. Die Art und Weise, wie hier Code generiert wird, macht mehr Spaß, Sie können es lernen.


Darüber hinaus integriert dieses Framework auch die Dienstverwaltung. Dienste werden bei Zookeeper registriert, und der Kunde erhält die spezifische Dienstadresse zum Aufrufen. Tatsächlich handelt es sich zu diesem Zeitpunkt nicht nur um ein Service-Framework, sondern umfasst auch Service-Governance-Funktionen.


Ich habe den Code nur kurz gelesen und die Details noch nicht vollständig verstanden. Wenn Sie mehr darüber erfahren möchten, können Sie den Quellcode lesen.

Dyd.BaseService.ServiceCenter http://git.oschina.net/chejiangyi/Dyd.BaseService.ServiceCenter

Sehen Sie sich das Grundlegende an Einführung Alle Funktionen sind verfügbar, aber laut der Einführung des Autors zu diesem Projekt wird gesagt, dass dieses Projekt forschungsbasiert ist. Der Client, der den Dienst aufruft, wird ebenfalls durch Code generiert.

Darüber hinaus möchte ich diesen Blogger etwas näher vorstellen. Er hat auch einen Blog

im Bloggarten http://www.cnblogs.com/chejiangyi/ und hat mehrere eröffnet Open-Source-Projekte darunter http://www.cnblogs.com/chejiangyi/ ://git.oschina.net/chejiangyi Dies sind einige sehr gute Projekte, wie z. B. Planungsdienste, Konfigurationsdienste und Überwachungsdienste In einem bestimmten Umfang sind diese Dienste erforderlich. Was noch wertvoller ist, ist, dass diese Dienste auf .Net basieren und daher für einige Internetunternehmen, die die .Net-Entwicklung verwenden, eine gute Referenzbedeutung haben.

Redola.Rpc http://www.cnblogs.com/gaochundong/p/redola_yet_another_csharp_rpc_framework.html

Das habe ich kürzlich entdeckt. Das Framework verwendet das Actor-Modell und die Serialisierung verwendet Protobuf. net, die Übertragungsmethode basiert auf TCP und das TCP-Framework verwendet eigene Cowboy.WebSockets. Laut Einleitung ist auch das Service Center implementiert, aber da ich das Actor-Modell nicht verstehe, werde ich nichts hinzufügen Interessierte Studierende können den Blog des Autors lesen.


Ein Service-Framework, das ich selbst geschrieben habe

Nachdem ich so viele Service-Frameworks gelesen habe, habe ich auch selbst eines geschrieben. Es ist nur ein Service-Aufruf und es ist experimentell in der Natur und kann als Referenz verwendet werden.

Das Prinzip des Frameworks ähnelt dem von Hession. Sie müssen zuerst die Schnittstelle definieren und dann die Schnittstelle auf der Serverseite implementieren. Hier habe ich den Controller direkt in die Web-API integriert Die Schnittstelle wird geerbt, sodass keine spezifische Definition erforderlich ist. Das Handle wird zum Abfangen von Anforderungen verwendet, ohne den Web-API-Zugriff zu beeinträchtigen. Selbst wenn Sie dieses Framework verwenden, wird es Sie also nicht daran hindern, direkt über http zuzugreifen. Die Aufrufmethode des Clients ähnelt der von Hession. Außerdem muss ein Proxy definiert und dann Parameter erfasst werden.

Zuerst die Schnittstelle definieren

Einführung in mehrere Service-Frameworks unter .NET

Mit Der nächste Schritt besteht darin, die Web-API zu implementieren. Zusätzlich zum Erben von APIController erbt dieser Controller auch die spezifische Logik der Schnittstelle.

Einführung in mehrere Service-Frameworks unter .NET

Kopieren Sie gleichzeitig die DLL, in der sich diese Schnittstelle befindet, auf den Client. Hier stellen wir eine Funktion vor, nämlich RealProxy. Dies ist die kommende Proxy-Klasse mit .Net und wird auch vom Hession-Mechanismus verwendet.

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using Newtonsoft.Json;
using RestSharp;
namespace SimleRPC
{
    public class SimpleProxy : RealProxy
    {
        private readonly Uri _uri;
        public SimpleProxy(Type type, Uri uri) : base(type)
        {
            this._uri = uri;
        }
        public override IMessage Invoke(IMessage msg)
        {
            //msg参数包含调用方法的信息,这里通过封装,使信息更丰富一些
            IMethodCallMessage methodMessage = new MethodCallMessageWrapper((IMethodCallMessage)msg);
            MethodInfo methodInfo = (MethodInfo)methodMessage.MethodBase;
            ParameterInfo[] paramsInfo = methodInfo.GetParameters();  //获取方法调用参数
            //拼装path  类名即controller名, 方法名即action名  这样就表示出具体的url
            string path = "/api/" + methodInfo.DeclaringType.Name + "/" + methodInfo.Name;
            //请求类型,post or get
            bool isHttpGet = methodInfo.CustomAttributes.Any(customAttributeData => customAttributeData.AttributeType.Name == "HttpGetAttribute");
            var client = new RestClient(_uri);
            var request = new RestRequest(path, isHttpGet ? Method.GET : Method.POST);
            //构建参数
            //web api对于传参的一切规则  参考 http://www.cnblogs.com/babycool/p/3922738.html    http://www.cnblogs.com/landeanfen/p/5337072.html 两篇博客
            if (isHttpGet)
            {
                //这里默认get请求的参数都是基本类型
                for (int i = 0; i < paramsInfo.Length; i++)
                {
                    request.AddParameter(paramsInfo[i].Name, methodMessage.Args[i]);
                }
            }
            else
            {
                //对于post请求,要么没有参数(当然基本没有这种情况),要么只有一个参数(这些是受web api的限制)
                if (paramsInfo.Length > 0)
                {
                    request.AddJsonBody(methodMessage.Args[0]);
                }
            }
            // 发送请求 拿到结果
            IRestResponse response = client.Execute(request);
            var content = response.Content;
            Type returnType = methodInfo.ReturnType;     //获取调用方法返回类型,根据类型反序列化结果
            object returnValue;
            if (IsBaseType(returnType))
            {
                returnValue = Convert.ChangeType(content, returnType);
            }
            else
            {
                returnValue = JsonConvert.DeserializeObject(content, returnType); //如果是一个对象,则用json进行反序列化
            }
            return new ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
        }
        /// <summary>
        /// 判断是否是基础类型(int long  double), string 是引用类型,但是也归到基础类型里面
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private static bool IsBaseType(Type type)
        {
            if (type == typeof(string) || type.IsPrimitive)
                return true;
            return false;
        }
    }
}

Alle Methodenaufrufe rufen die Invoke-Methode auf. In der Invoke-Methode können Sie die spezifischen Informationen der aufrufenden Methode abrufen, z. B. Parameter, Rückgabewerttyp usw. Dann wird durch Reflektion und Assemblierung eine HTTP-Anfrage erstellt. Hier ist mein Standardname der Schnittstellenklasse der Name des Controllers und der Name der Schnittstellenmethode der Name der Aktion.

Abschließend senden Sie die Anfrage über RestSharp. Abschließend wird das HTTP-Ergebnis in den für den Methodenrückgabewert erforderlichen Wert deserialisiert.

Einführung in mehrere Service-Frameworks unter .NET

Tatsächlich spielt es für den Server keine Rolle, ob die Web-API die Schnittstelle erbt. Wenn dies nicht der Fall ist, muss die Signatur der Schnittstelle mit der übereinstimmen Signatur der Methode in der Web-API.

Die Methode kann durch die Demo, die ich geschrieben habe, angepasst werden. Wenn jemand daran interessiert ist, können Sie einige weitere Situationen testen.


Endlich


Viele Internetunternehmen verfügen mittlerweile über eigene RPC-Frameworks, von denen einige Open Source sind und einige aufgrund historischer Probleme selbst geschrieben wurden. Bei den Kommunikationsmethoden basieren einige auf HTTP, andere auf TCP. und beide Protokolle kompatibel. Es gibt auch viele Serialisierungsmethoden. Ich habe oben nur 5 aufgelistet. Tatsächlich gibt es bei der Suche auf Github viele hervorragende RPCs.


RPC ist nur eine Phase im Projektentwicklungsprozess. Mit RPC können Sie auf dieser Basis viele Dinge tun, wie zum Beispiel:


Alle Dienste werden beim Start im Servicecenter registriert und die Der Client wird gestartet. Wenn Sie die echte Adresse vom Registrierungscenter erhalten, rufen Sie ihn direkt auf, ohne einen Proxy wie Nginx zu verwenden. Hier können Sie einige Berechtigungseinschränkungen für den Erhalt der echten Adresse festlegen, z. B. welche Clients verwendet werden können und welche nicht verwendet wird und wie viele verwendet werden können, können Sie hier nachlesen.


HTTP-Anfragepfad Microservices sind mittlerweile sehr beliebt. Eine Front-End-Anfrage kann mehrere Back-End-Dienste durchlaufen. Sie können RequestId und RequestIndex zum HTTP-Header hinzufügen Diese Dienste werden aneinandergereiht, zum Beispiel A->B->C. Wenn Dienst A Dienst B aufruft und festgestellt wird, dass im HTTP-Kopf keine RequestId vorhanden ist, kann eine über GuId und den RequestIndex generiert werden wird um 1 erhöht. Wenn Dienst B Server C aufruft, wird die RequestId direkt übergeben, der RequestIndex wird um 1 erhöht und die Informationen werden im Protokoll aufgezeichnet. Durch Analyse wird der gesamte Anruf aneinandergereiht , und das Anrufverbindungsdiagramm des gesamten Dienstes kann durch die vollständigen Daten gezeichnet werden.


Da wir jeden Serviceanruf abfangen können, können wir zusätzlich zum Linkdiagramm die Serviceanrufzeit sowie das Linkdiagramm für den gesamten Service aufzeichnen. Die Informationen werden angezeigt vollständiger.

Das Obige ist die Einführung mehrerer Service-Frameworks unter .NET. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn