Si vous avez des questions, veuillez ajouter directement QQ : 2292709323, WeChat : yaofengv, contact
Overt.Core.Grpc v1.0.6
Basé sur le pilote Grpc.Core de Google, il convient aux scénarios de service de console et implémente des scénarios de microservices basés sur des connexions longues TCP.
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Intercept 拦截器
|-|-IServerTracer 服务端拦截器接口
|-|-IClientTracer 客户端拦截器接口
|
|-Manager 启动、客户端调用类
|-|-GrpcServiceManager.cs 服务端启动类
|-|-GrpcClientManager.cs 客户端获取Client类
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- Version Nuget : v1.0.6
- Prise en charge du framework : Framewok 4.5 - 4.6 / NetStandard 2.0
- NetStandard 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
- Cadre 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
Priorité : {Centre de configuration tiers} > Variables d'environnement > Configuration interne de l'hôte > Obtenir automatiquement l'intranet IP
- Prend en charge le fichier de configuration par défaut appsettings.json [le nœud Consul n'est pas requis, sinon, ce n'est pas un cluster]
{
"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 >
- Dénomination : dossier [espace de noms].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 >
- Nom : consulsettings.json Ne pas modifier
{
"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 >
- Mode d'injection de dépendance de force
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 ) ;
}
}
}
- Écriture de classe d’implémentation
原因:服务启动的时候是一个单例,那么所有服务之下的全部是单实例,而数据层需要使用多实例
// 只注入 IServiceProvider
IServiceProvider _provider ;
public GrpcExampleServiceImpl ( IServiceProvider provider )
{
_provider = provider ;
}
// 其他利用provider即时获取
using ( var scope = _provider . CreateSocpe ( ) )
{
var _userService = scope . ServiceProvider . GetService < IUserService > ( ) ;
}
- Appelez directement GrpcServiceManager pour démarrer
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 ( ) ;
}
}
}
- Mode d'injection de dépendance de force
- Le fichier de configuration utilise [namespace].dll.json par défaut. Les packages Nuget peuvent être générés via l'outil vs.menu.
- Appelez directement les personnes suivantes pendant l'injection :
// 注入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" } ) ;
- Classe proxy client, compilée en Dll, le code source est le suivant, peut être ignoré
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
}
- Exécuter à l'aide de la classe proxy
// 自定义配置文件 / 默认使用命名空间.dll.json / 在主进程入口进行配置T为服务Client
ClientManger.Configure<T>("dllconfig/abc.config");
ClientManager.Instance.[Method]
// T为服务Client
ClientManager<T>.Instance.[Method]
- le consul prend en charge le jeton
- Mettez à niveau le pilote sous-jacent vers la dernière version
- Grpc => 2.40.0
- Mettez à niveau le pilote sous-jacent vers la dernière version
- Google.Protobuf => 3.17.3
- Refactoriser GrpcClientOptions
- Mettez à niveau le pilote vers la dernière version
- Tracer offre la possibilité de modifier la cible du canal, permettant une sélection personnalisée externe de nœuds ;
- Mettez à niveau le pilote sous-jacent vers la dernière version
- Ajouter une injection d'intercepteur personnalisée
- Ajustez la configuration des paramètres de ServiceStart et utilisez GrpcOptions pour l'entreprendre.
- Augmentez l'acquisition personnalisée d'invocateurs et augmentez l'acquisition de ServiceId
- Prise en charge de la stratégie d'acquisition d'invocateurs personnalisés pour la version du framework
- Ajoutez la prise en charge de la configuration tierce, telle qu'Apollo, qui peut être étendue à l'aide de services.AddGrpcConfig (actuellement, seul dotnetcore est pris en charge)
- Optimiser le support des nouvelles versions de Consul
- Une fois que le centre d'enregistrement a détecté les modifications, il ignore la liste noire et réinitialise toutes les connexions locales.
- Le client utilise le centre d'enregistrement Consul pour prendre en charge la surveillance des modifications de service unique, les nouveaux services d'enregistrement ou les pannes de service, plus en temps réel.
- Prise en charge du mode multiservice
- Modifiez l'espace de noms, mettez à jour le package nuget vers Overt.Core.Grpc et mettez à jour la version par défaut vers 1.0.0
- Lorsque le client ne parvient pas à optimiser le service de connexion, il est mis sur liste noire, ce qui entraîne le problème de l'absence de nœud.
Overt.Core.Grpc.H2 v2.0.1
Utilisé pour la version >= netcoreapp3.0, utilisé pour le protocole http2, s'appuyant sur grpc.net de Microsoft, adapté aux scénarios de service Web, implémentant des scénarios de microservice basés sur http2
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- Version Nuget : V 2.0.1
- Prise en charge du framework : 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
Priorité : {Centre de configuration tiers} > Variables d'environnement > Configuration interne de l'hôte > Obtenir automatiquement l'IP + le port de démarrage Intranet
- Prend en charge le fichier de configuration par défaut appsettings.json [le nœud Consul n'est pas requis, sinon, ce n'est pas un cluster]
{
"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路径
}
}
}
}
- Dénomination : dossier [espace de noms].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 "
}
}
}
}
}
- Nom : consulsettings.json Ne pas modifier
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
- Inscrire Consul
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 ( ) ;
}
- Mode d'injection de dépendance de force
- Le fichier de configuration utilise [namespace].dll.json par défaut. Les packages Nuget peuvent être générés via l'outil vs.menu.
- Appelez directement les personnes suivantes pendant l'injection :
// 注入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 prend en charge le sous-canal, le résolveur et LoadBalancer, ainsi que la personnalisation
- Prise en charge des centres de configuration externes tels qu'Apollo
- Configuration du fichier de changement de code de support
- Ajouter un service hébergé
- La première version s'appuie sur le pilote grpc.net de Microsoft et est adaptée à net5.0