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(); } } }
运行结果如下图所示