إذا كان لديك أي أسئلة، يرجى إضافة QQ مباشرة: 2292709323، WeChat: yaofengv، اتصل
Overt.Core.Grpc v1.0.6
استنادًا إلى برنامج تشغيل Grpc.Core من Google، فهو مناسب لسيناريوهات خدمة وحدة التحكم وينفذ سيناريوهات الخدمة الصغيرة بناءً على اتصالات TCP الطويلة.
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Intercept 拦截器
|-|-IServerTracer 服务端拦截器接口
|-|-IClientTracer 客户端拦截器接口
|
|-Manager 启动、客户端调用类
|-|-GrpcServiceManager.cs 服务端启动类
|-|-GrpcClientManager.cs 客户端获取Client类
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- نسخة نوجيت: v1.0.6
- دعم الإطار: Framewok 4.5 - 4.6 / NetStandard 2.0
- نت ستاندارد 2.0
Consul 0.7 .2 .6
Google . Protobuf 3.8 .0
Grpc 1.21 .0
Microsoft . Extensions . Configuration . Json 2.0 .0
Microsoft . Extensions . Options . ConfigurationExtensions 2.0 .0
- الإطار 4.5-4.7
Consul 0.7 .2 .6
Google . Protobuf 3.8 .0
Grpc 1.21 .0
Install - Package Overt . Core . Grpc - Version 1.0 .6
الأولوية: {Third Party Configuration Center} > متغيرات البيئة > التكوين الداخلي للمضيف > الحصول على إنترانت IP تلقائيًا
- دعم ملف التكوين الافتراضي appsettings.json [عقدة القنصل غير مطلوبة، إذا لم تكن كذلك، فهي ليست مجموعة]
{
"GrpcServer" : {
"Service" : {
"Name" : " OvertGrpcServiceApp " , // 服务名称使用服务名称去除点:OvertGrpcServiceApp
"Host" : " service.g.lan " , // 专用注册的域名 (可选)格式:ip[:port=default]
"HostEnv" : " serviceaddress " , // 获取注册地址的环境变量名字(可选,优先)环境变量值格式:ip[:port=default]
"Port" : 10001 , // 端口自定义
"Consul" : {
"Path" : " dllconfigs/consulsettings.json " // Consul路径
}
}
}
}
// 添加section
< configSections >
< section name = " grpcServer " type = " Overt.Core.Grpc.GrpcServerSection, Overt.Core.Grpc " />
</ configSections >
// 添加节点
< grpcServer >
< service name = " OvertGrpcServiceApp " port = " 10005 " host = "专用注册的域名(可选)格式:ip[:port=default] " hostEnv = "获取注册地址的环境变量名字(可选)环境变量值格式:ip[:port=default] " >
< registry >
< consul path = " dllconfigs/Consul.config " />
</ registry >
</ service >
</ grpcServer >
- التسمية: [مساحة الاسم]. مجلد dll.json (dllconfigs)
{
"GrpcClient" : {
"Service" : {
"Name" : " grpcservice " , // 服务名称与服务端保持一致
"MaxRetry" : 0 , // 最大可重试次数,默认不重试
"Discovery" : {
"EndPoints" : [ // 单点模式
{
"Host" : " 127.0.0.1 " ,
"Port" : 10001
}
],
"Consul" : { // Consul集群,集群优先原则
"Path" : " dllconfigs/consulsettings.json "
}
}
}
}
}
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< configSections >
< section name = " grpcClient " type = " Overt.Core.Grpc.GrpcClientSection, Overt.Core.Grpc " />
</ configSections >
< grpcClient >
< service name = " " maxRetry = " 0 " >
< discovery >
< server >
< endpoint host = " " port = " " ></ endpoint >
< endpoint host = " " port = " " ></ endpoint >
</ server >
< consul path = " dllconfigs/Consul.config " ></ consul >
</ discovery >
</ service >
</ grpcClient >
</ configuration >
- الاسم: consulsettings.json لا يتغير
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< configSections >
< section name = " consulServer " type = " Overt.Core.Grpc.ConsulServerSection, Overt.Core.Grpc " />
</ configSections >
< consulServer >
< service address = " http://consul.g.lan " ></ service >
</ consulServer >
</ configuration >
- فرض وضع حقن التبعية
services . AddSingleton < GrpcExampleService . GrpcExampleServiceBase , GrpcExampleServiceImpl > ( ) ; // Grpc服务的实现
services . AddSingleton < IHostedService , GrpcExampleHostedService > ( ) ; // Grpc服务启动服务类:如下
services . AddGrpcTracer < ConsoleTracer > ( ) ; // Grpc注入拦截器,继承IServerTracer(可选)
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
using Microsoft . Extensions . Hosting ;
using Overt . Core . Grpc ;
using Overt . GrpcExample . Service . Grpc ;
using System . Threading ;
using System . Threading . Tasks ;
namespace Overt . GrpcService . App
{
public class GrpcService : IHostedService
{
GrpcExampleService . GrpcExampleServiceBase _grpcServiceBase ;
IServerTracer _tracer ;
public GrpcService ( GrpcExampleService . GrpcExampleServiceBase serviceBase , IServerTracer tracer ) // 依赖注入Grpc服务基础类
{
_serviceBase = serviceBase ;
_tracer = tracer ;
}
public Task StartAsync ( CancellationToken cancellationToken )
{
return Task . Factory . StartNew ( ( ) =>
{
GrpcServiceManager . Start ( GrpcExampleService . BindService ( _serviceBase ) , _tracer ) ;
} , cancellationToken ) ;
}
public Task StopAsync ( CancellationToken cancellationToken )
{
return Task . Factory . StartNew ( ( ) =>
{
GrpcServiceManager . Stop ( ) ;
} , cancellationToken ) ;
}
}
}
- تنفيذ فئة الكتابة
原因:服务启动的时候是一个单例,那么所有服务之下的全部是单实例,而数据层需要使用多实例
// 只注入 IServiceProvider
IServiceProvider _provider ;
public GrpcExampleServiceImpl ( IServiceProvider provider )
{
_provider = provider ;
}
// 其他利用provider即时获取
using ( var scope = _provider . CreateSocpe ( ) )
{
var _userService = scope . ServiceProvider . GetService < IUserService > ( ) ;
}
- اتصل مباشرة بـ GrpcServiceManager للبدء
using Grpc . Core ;
using Overt . Core . Grpc ;
using Overt . Log ;
using System ;
namespace Overt . GrpcService
{
public class MainService
{
public MainService ( )
{
}
public void Start ( string serviceName ) // 启动服务
{
GrpcServiceManager . Start ( Library . GrpcService . BindService ( new GrpcServiceImpl ( ) ) , tracer : new ConsoleTracer ( ) , whenException : ( ex ) =>
{
LogHelper . Info ( "" , ex ) ;
} ) ;
}
public void Stop ( string serviceName ) // 停止服务
{
GrpcServiceManager . Stop ( ) ;
}
public void ShutDown ( string serviceName )
{
GrpcServiceManager . Stop ( ) ;
}
}
}
- فرض وضع حقن التبعية
- يستخدم ملف التكوين [namespace].dll.json بشكل افتراضي، ويمكن إنشاء حزم Nuget من خلال أداة vs.menu.
- اتصل مباشرة بما يلي أثناء الحقن:
// 注入Grpc客户端
services . AddGrpcClient ( ) ;
// 自定义配置文件 / 默认使用命名空间.dll.json
services . Configure < GrpcClientOptions < GrpcExampleServiceClient > > ( ( cfg ) =>
{
cfg . ConfigPath = "dllconfig/Overt.GrpcExample.Service.Grpc.dll.json" ; // 可不传递
} ) ;
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
// 获取注入的对象
IGrpcClient < GrpcExampleServiceClient > _grpcClient ;
public IndexModel ( IGrpcClient < GrpcExampleServiceClient > grpcClient )
{
_grpcClient = grpcClient ;
}
var res = _grpcClient . Client . Ask ( new Service . Grpc . AskRequest ( ) { Key = "abc" } ) ;
- فئة وكيل العميل، التي تم تجميعها في Dll، كود المصدر كما يلي، يمكن تجاهلها
using Grpc . Core ;
using Overt . Core . Grpc ;
using Overt . Core . Grpc . Intercept ;
using System ;
using System . Collections . Concurrent ;
using System . IO ;
using __GrpcService = Overt . GrpcExample . Service . Grpc . GrpcExampleService ;
namespace Overt . GrpcExample . Service . Grpc
{
#if NET45 || NET46 || NET47
public class ClientManager
{
public static IClientTracer Tracer { get ; set ; } = default ( IClientTracer ) ;
private static string DefaultConfigPath { get ; set ; } = "dllconfigs/Overt.GrpcExample.Service.Grpc.dll.config" ;
public static __GrpcService . GrpcExampleServiceClient Instance
{
get
{
return ClientManager < __GrpcService . GrpcExampleServiceClient > . Instance ;
}
}
private static readonly ConcurrentDictionary < Type , string > configMap = new ConcurrentDictionary < Type , string > ( ) ;
public static void Configure < T > ( string configPath ) { configMap . AddOrUpdate ( typeof ( T ) , configPath , ( t , s ) => configPath ) ; }
public static string GetConfigure < T > ( ) { if ( configMap . TryGetValue ( typeof ( T ) , out string configPath ) ) return configPath ; return DefaultConfigPath ; }
}
public class ClientManager < T > : ClientManager where T : ClientBase
{
public static new T Instance
{
get
{
var configPath = GetConfigure < T > ( ) ;
var abConfigPath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , configPath ) ;
return GrpcClientManager < T > . Get ( abConfigPath , Tracer ) ;
}
}
}
#endif
}
- تنفيذ باستخدام فئة الوكيل
// 自定义配置文件 / 默认使用命名空间.dll.json / 在主进程入口进行配置T为服务Client
ClientManger.Configure<T>("dllconfig/abc.config");
ClientManager.Instance.[Method]
// T为服务Client
ClientManager<T>.Instance.[Method]
- القنصل يدعم الرمز المميز
- قم بترقية برنامج التشغيل الأساسي إلى الإصدار الأحدث
- جي آر بي سي => 2.40.0
- قم بترقية برنامج التشغيل الأساسي إلى الإصدار الأحدث
- جوجل.بروتوبوف => 3.17.3
- إعادة بناء GrpcClientOptions
- ترقية برنامج التشغيل إلى الإصدار الأحدث
- يوفر Tracer القدرة على تعديل هدف القناة، مما يسمح بتحديد مخصص خارجي للعقد؛
- قم بترقية برنامج التشغيل الأساسي إلى الإصدار الأحدث
- إضافة حقنة اعتراضية مخصصة
- اضبط تكوين معلمة ServiceStart واستخدم GrpcOptions للقيام بذلك.
- زيادة الاستحواذ المخصص للمستدعيين وزيادة الحصول على ServiceId
- دعم استراتيجية اكتساب المستدعي المخصص لإصدار الإطار
- إضافة دعم لتكوين الطرف الثالث، مثل apollo، والذي يمكن توسيعه باستخدام Services.AddGrpcConfig (حاليًا يتم دعم dotnetcore فقط)
- تحسين الدعم للإصدارات الجديدة من Consul
- بعد أن يكتشف مركز التسجيل التغييرات، فإنه يتجاهل القائمة السوداء ويعيد تعيين كافة الاتصالات المحلية.
- يستخدم العميل مركز التسجيل القنصلي لدعم مراقبة تغيير الخدمة الفردية، أو خدمات التسجيل الجديدة أو فشل الخدمة، في الوقت الفعلي
- دعم وضع الخدمات المتعددة
- قم بتعديل مساحة الاسم، وتحديث حزمة nuget إلى Overt.Core.Grpc، وتحديث الإصدار الافتراضي إلى 1.0.0
- عندما يفشل العميل في تحسين خدمة الاتصال، يتم إدراجه في القائمة السوداء، مما يؤدي إلى مشكلة عدم وجود العقدة.
Overt.Core.Grpc.H2 v2.0.1
يستخدم لإصدار >= netcoreapp3.0، ويستخدم لبروتوكول http2، ويعتمد على grpc.net من Microsoft، ومناسب لسيناريوهات خدمة الويب، وتنفيذ سيناريوهات الخدمات الصغيرة استنادًا إلى http2
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- نسخة نوجيت: V 2.0.1
- دعم الإطار: netstandard2.1/netcoreapp3.0/net5.0/net6.0
Consul 1.6 .10 .7
Google . Protobuf 3.21 .5
Grpc . Net . Client 2.47 .0
Microsoft . Extensions . Configuration . Json 5.0 .0
Microsoft . Extensions . Options . ConfigurationExtensions 5.0 .0
Install - Package Overt . Core . Grpc . H2 - Version 2.1 .0
الأولوية: {Third Party Configuration Center} > متغيرات البيئة > التكوين الداخلي للمضيف > الحصول تلقائيًا على IP + بدء تشغيل الشبكة الداخلية للمنفذ
- دعم ملف التكوين الافتراضي appsettings.json [عقدة القنصل غير مطلوبة، إذا لم تكن كذلك، فهي ليست مجموعة]
{
"GrpcServer" : {
"Service" : {
"Name" : " OvertGrpcServiceApp " , // 服务名称使用服务名称去除点:OvertGrpcServiceApp
"Host" : " service.g.lan " , // 专用注册的域名 (可选)格式:ip[:port=default]
"HostEnv" : " serviceaddress " , // 获取注册地址的环境变量名字(可选,优先)环境变量值格式:ip[:port=default]
"Port" : 10001 , // 端口自定义
"Consul" : {
"Path" : " dllconfigs/consulsettings.json " // Consul路径
}
}
}
}
- التسمية: [مساحة الاسم]. مجلد dll.json (dllconfigs)
{
"GrpcClient" : {
"Service" : {
"Name" : " grpcservice " , // 服务名称与服务端保持一致
"Scheme" : " http " , // foraddress 协议 http/https
"Discovery" : {
"EndPoints" : [ // 单点模式
{
"Host" : " 127.0.0.1 " ,
"Port" : 10001
}
],
"Consul" : { // Consul集群,集群优先原则
"Path" : " dllconfigs/consulsettings.json "
}
}
}
}
}
- الاسم: consulsettings.json لا يتغير
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
- سجل القنصل
public void ConfigureServices ( IServiceCollection services )
{
.. .
// 其他
.. .
services . AddGrpcService ( ) ; // 应用关闭时,节点可自动移除
// 按需使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
}
public void Configure ( IApplicationBuilder app , IWebHostEnvironment env )
{
.. .
// 其他
.. .
app . UseGrpcRegister ( ) ;
}
- فرض وضع حقن التبعية
- يستخدم ملف التكوين [namespace].dll.json بشكل افتراضي، ويمكن إنشاء حزم Nuget من خلال أداة vs.menu.
- اتصل مباشرة بما يلي أثناء الحقن:
// 注入Grpc客户端
services . AddGrpcClient ( ) ;
// 自定义配置文件 / 默认使用命名空间.dll.json
services . Configure < GrpcClientOptions < GrpcExampleServiceClient > > ( ( cfg ) =>
{
cfg . ConfigPath = "dllconfig/Overt.GrpcExample.Service.Grpc.dll.json" ; // 可不传递
} ) ;
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
// 获取注入的对象
IGrpcClient < GrpcExampleServiceClient > _grpcClient ;
public IndexModel ( IGrpcClient < GrpcExampleServiceClient > grpcClient )
{
_grpcClient = grpcClient ;
}
var res = _grpcClient . Client . Ask ( new Service . Grpc . AskRequest ( ) { Key = "abc" } ) ;
1.NET5_0_OR_GREATER يدعم القناة الفرعية والمحلل وLoadBalancer والتخصيص
- دعم مراكز التكوين الخارجية مثل أبولو
- تكوين ملف تغيير رمز الدعم
- AddHostedService
- يعتمد الإصدار الأول على برنامج تشغيل Microsoft grpc.net وهو متوافق مع net5.0