1、前言 因為工作的關係,最近很少更新surging,因為surging 一直處在不溫不火的狀態,而自己每天利用業餘時間進行完善,每天都是疲憊的狀態,還要應付新手的提問,曾經一度想放棄,但是有些人勸說,surging 已經有一定的忠粉,放棄難免可惜,你可以發展收費版本,這樣你也有動力進行更新,用戶也 ...
1、前言
因為工作的關係,最近很少更新surging,因為surging 一直處在不溫不火的狀態,而自己每天利用業餘時間進行完善,每天都是疲憊的狀態,還要應付新手的提問,曾經一度想放棄,但是有些人勸說,surging 已經有一定的忠粉,放棄難免可惜,你可以發展收費版本,這樣你也有動力進行更新,用戶也有需求,付費也是情理之中,你也能更好的發展下去。就在上個月我剝離了企業版、預定版、社區版。
社區版:閹割版本,不帶配置中心,文檔,服務編排流程引擎,管理中心等功能,而且沒有咨詢服務
預定版:部分企業版本功能,有配置中心,文檔,部分中間件,帶咨詢服務,
企業版:2天一對一培訓課程,咨詢服務,有配置中心,文檔,服務編排流程引擎,管理中心,所有中間件,
社區版地址:https://github.com/dotnetcore/surging
2、什麼是微服務
這幾年微服務這個話題很火,可謂是你方唱罷我登場,什麼框架都要和微服務牽扯點關係,和微服務沒關係就會顯得很low,對於微服務設計,沒有明確的定義,所以市面大多都有自己的理解和定義,而我個人認為大部分開源都是老湯換新藥,都是一個療效,沒有本質的區別,最主要是騙騙領導,對外宣傳公司的技術實力,而對於現實來講,基本上真正的微服務都在一二線互聯網公司,而且你會發現總公司,分公司,附屬公司都要自己開發一套微服務,而這是為什麼呢?因為有弊端,要開發屬於自己的微服務,來滿足業務的需求。那麼我是怎麼理解這個微服務呢?
微服務是針對業務的松耦合,是對於業務的解耦,也是粒度最小的功能業務模塊,對於協議高度集成化,對於本地和遠程調用的抽象化和服務治理保證了可靠性通信,技術人員只關註業務實現和拆分,而無需關註底層的業務實現。
而以上只是談了微服務的思想,那麼對於微服務就需要通過引擎掃描或者引用載入業務服務模塊驅動生成服務提供者,而針對於行業解決方案,我們可以載入需要協議服務主機。那麼我們下麵來談談如何擴展協議服務主機
3、協議主機集成-behavior特性
針對於協議服務主機,我們有必要認識下behaviors,那麼什麼是behaviors呢?
behaviors是協議服務主機引擎特性, 每個擴展的主機都包含一個 behavior, 可以包含屬性、數據、標識和方法,組件引用它時,它的屬性、數據和方法會被合併到組件中,對於各自的behavior會在啟動的時候進行初始化生成ServiceEntries。裡面包含了類型,routepath, behaviors. 以下各個協議服務主機的behavior
BackgroundServiceBehavior:繼承IServiceBehavior, 後臺托管服務,可以構建後臺定時任務
UdpBehavior:繼承IServiceBehavior,可以集成UDP協議
WSBehavior:繼承於IServiceBehavior,可以集成ws協議
GreeterBehavior: 繼承於IServiceBehavior和Protos生成的GreeterBase,可以集成Grpc
MqttBehavior:繼承於ServiceBase,可以集成MQTT協議
DnsBehavior:繼承於IServiceBehavior,可以集成DNS
以上所有的Behavior,IServiceBehavior和ServiceBase都支持rest,rpc可靠性遠程調用。
4、協議主機-Grpc
對於剛剛更新Grpc 服務主機,有些人還不會用,這裡我們談談如何構建Grpc
業務介面
首先建立業務介面,代碼如下
[ServiceBundle("api/{Service}/{Method}")] public interface IGreeterService : IServiceKey { }
proto文件
在創建proto 文件前,需要nuget安裝Google.Protobuf,Grpc.Core,Grpc.Tools。
然後在業務介面模塊創建的Protos/greet.proto
文件內容如下:
syntax = "proto3"; package Greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings. message HelloReply { string message = 1; }
因為是利用Grpc.Tools工具 通過.proto文件生成C#資源文件。所以還需要編輯.csproject文件,需要把以下代碼添加到.csproject文件中。
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup>
Behavior特性
針對於grpc需要再創建Behavior,並且繼承通過Grpc.Tools生成的Greeter.GreeterBase和IServiceBehavior,代碼如下
public partial class GreeterBehavior : Greeter.GreeterBase,IServiceBehavior { }
業務模塊
針對於業務模塊,需要繼承Behavior和業務介面,代碼如下
public class GreeterService: GreeterBehavior, IGreeterService { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }
配置
添加Surging.Core.Grpc引擎組件,配置GrpcPort,啟用GrpcModule,配置surgingSettings.json如下
"Ports": { "HttpPort": "${HttpPort}|280", "WSPort": "${WSPort}|96", "MQTTPort": "${MQTTPort}|97", "GrpcPort": "${GrpcPort}|95" }
"Packages": [ { "TypeName": "EnginePartModule", "Using": "${UseEngineParts}|ServiceProxyModule;DotNettyModule;NLogModule;MessagePackModule;ConsulModule;WSProtocolModule;MqttProtocolModule;EventBusRabbitMQModule;CachingModule;KestrelHttpModule;DnsProtocolModule;SwaggerModule;ApiGeteWayModule;SkywalkingModule;KestrelNLogModule;ServiceHostModule;GrpcModule" } ]
通過以上服務端配置,那麼再通過創建client 進行測試
客戶端
而針對於客戶端,也需要nuget 安裝需要Google.Protobuf,Grpc.Core,Grpc.Tools。同時創建greet.proto
文件,然後我們需要編輯.csproject文件,需要把以下代碼添加到.csproject文件中。
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
然後封裝ServiceClient調用,代碼如下
using Greet; using Grpc.Core; namespace GrpcService1 { public class ServiceClient { private static ChannelBase _channel; private static Greeter.GreeterClient _client; static ServiceClient() { _channel = new Channel("127.0.0.1", 95, ChannelCredentials.Insecure); _client = new Greeter.GreeterClient(_channel); } public static HelloReply SayHello(string name) { return _client.SayHello(new HelloRequest { Name = name }); } } }
再在Main函數中調用封裝好的ServiceClient,代碼如下
using System; namespace GrpcService1 { public class Program { public static void Main(string[] args) { var result = ServiceClient.SayHello("fanly"); Console.WriteLine("grpc Client Call SayHello():" + result); Console.WriteLine("任意鍵退出..."); Console.ReadKey(); } } }
運行結果如下圖所示