在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:core-grpc开源软件地址:https://gitee.com/overt/core-grpc开源软件介绍:如有疑问可直接加QQ:2292709323,微信:yaofengv,联系 Overt.Core.Grpc项目层次说明
1. 项目目录|-Config 配置模型||-Client 客户端功能实现,服务发现||-dllconfigs 配置文件保存||-Intercept 拦截器|-|-IServerTracer 服务端拦截器接口|-|-IClientTracer 客户端拦截器接口| |-Manager 启动、客户端调用类|-|-GrpcServiceManager.cs 服务端启动类|-|-GrpcClientManager.cs 客户端获取Client类||-Service 服务端||-GrpcServiceCollectionExtensions.cs netcore注入 2. 版本及支持
3. 项目依赖
Consul 0.7.2.6 Google.Protobuf 3.8.0Grpc 1.21.0Microsoft.Extensions.Configuration.Json 2.0.0Microsoft.Extensions.Options.ConfigurationExtensions 2.0.0
Consul 0.7.2.6 Google.Protobuf 3.8.0Grpc 1.21.0 使用1. Nuget包引用Install-Package Overt.Core.Grpc -Version 1.0.6 2. 配置信息优先级:{第三方配置中心} > 环境变量 > Host内部配置 > 自动取IP内网 (1)服务端配置信息
{ "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> (2)客户端配置信息
{ "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> (3)Consul配置文件
{ "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> 3. 服务端的使用(1)NetCore
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); } }}
原因:服务启动的时候是一个单例,那么所有服务之下的全部是单实例,而数据层需要使用多实例// 只注入 IServiceProviderIServiceProvider _provider;public GrpcExampleServiceImpl(IServiceProvider provider){ _provider = provider;}// 其他利用provider即时获取using(var scope = _provider.CreateSocpe()){ var _userService = scope.ServiceProvider.GetService<IUserService>();} (2)Framework 4.6
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(); } }} 4. 客户端使用(1)NetCore
// 注入Grpc客户端services.AddGrpcClient();// 自定义配置文件 / 默认使用命名空间.dll.jsonservices.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" }); (2)Framework
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为服务ClientClientManger.Configure<T>("dllconfig/abc.config");ClientManager.Instance.[Method]// T为服务ClientClientManager<T>.Instance.[Method] 5. 更新说明
Overt.Core.Grpc.H2项目层次说明
1. 项目目录|-Config 配置模型||-Client 客户端功能实现,服务发现||-dllconfigs 配置文件保存||-Service 服务端||-GrpcServiceCollectionExtensions.cs netcore注入 2. 版本及支持
3. 项目依赖Consul 1.6.1.1Google.Protobuf 3.15.6Grpc.Net.Client 2.36.4Microsoft.Extensions.Configuration.Json 2.0.0Microsoft.Extensions.Options.ConfigurationExtensions 2.0.0 使用1. Nuget包引用Install-Package Overt.Core.Grpc.H2 -Version 1.0.4 2. 配置信息优先级:{第三方配置中心} > 环境变量 > Host内部配置 > 自动取IP+启动端口内网 (1)服务端配置信息
{ "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路径 } } }} (2)客户端配置信息
{ "GrpcClient": { "Service": { "Name": "grpcservice", // 服务名称与服务端保持一致 "Scheme": "http", // foraddress 协议 http/https "Discovery": { "EndPoints": [ // 单点模式 { "Host": "127.0.0.1", "Port": 10001 } ], "Consul": { // Consul集群,集群优先原则 "Path": "dllconfigs/consulsettings.json" } } } }} (3)Consul配置文件
{ "ConsulServer": { "Service": { "Address": "http://consul.g.lan" // 默认8500端口 } }} 3. 服务端的使用
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();} 4. 客户端使用
全部评论
专题导读
上一篇:nutch-ajax: 基于Apache Nutch和Solr以及Htmlunit, Selenium WebDriver等组件扩展,实 ...发布时间:2022-03-23下一篇:Vue-admin: 使用spring boot、mybatis-plus搭建的vue项目之前台发布时间:2022-03-23热门推荐
热门话题
阅读排行榜
|
请发表评论