netcore 使用surging框架发布到docker
这篇文章主要介绍了netcore 使用surging框架发布到docker,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
demo运行在windows的docker中,系统是win10,所以需要先下载Docker for Windows,安装完毕后系统会重启,然后桌面上可以找到Docker for Windows的快捷图标,右下角有个鲸鱼小图标
单击右键,选择菜单中的Kitematic
会提示你下载Kitematic,自行下载后解压即可,将Kitematic快捷到桌面;
打开Kitematic,在搜索栏中下载好RabbitMQ、redis、consul相关镜像,因为这些是surging运行的先决条件。
接着去GitHub上下载surging网关项目,修改其中的gatewaySettings.json中Register下的Address地址,对应的事consul docker镜像的ip
具体如何查看其ip,看如下操作:
打开Kitematic,点击左下角,如图:
进入到命令窗口,输入docker container ls或者 docker ps -a 查看docker,
可以看到现在运行的docker的相关信息,
如图:
然后查看consul的相关配置,输入docker inspect 镜像的 containerID,如consul的id是b0e98b94638c,输入命令如下:docker inspect b0e98b94638c,
显示这个docker的配置,内容会很多,不过ip的信息在最后,如图
找到其中的ip是多少,然后修改surging网关中的consul地址为:"Address": "172.17.0.4:8500",其他配置根据上面的操作进行修改,如redis 镜像地址的查找和修改等;
修改好surging的网关配置后在Surging.ApiGateway项目上单击右键,由于我项目中已经添加过,所以该处为灰色,如图:
新建docker-Compose后修改其中docker-compose.yml的配置如下:
在后面添加docker的外部端口和内部端口的映射和网络模式,这里我们都使用桥接模式,包括之前的consul、RabbitMQ、redis都是同一模式,这样他们会在同一VLAN下,
然后运行网关,如下:
接下来新建一个解决方案,方案名随意,喜欢就好,由于时间比较短,这里我简单的处理,不清楚的可以留言
新建Service.A,然后在其下新建控制台应用Service.A、Service.B、Service.C,新建类库Service.A.Service、Service.B.Service、Service.C.Service;
编辑Service.A.csporj、Service.B.csporj、Service.C.csporj,如下
将其中的引用包都复制过去,分别修改一下对应的Service,即其中的<ProjectReference Include="..\Service.A.Service\Service.A.Service.csproj" />,Service.A引用Service.A.Service,Service.B引用Service.B.Service
Service.C引用Service.C.Service;
类库Service.A.Service、Service.B.Service、Service.C.Service中都引用
<PackageReference Include="surging" Version="0.5.4" />
如图:
由于代码很多地方相识,以下我只说Service.A,和Service.A.Service;
Service.A 中新增Configs文件夹,下面添加log4net.config,log4net.config代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | < log4net > < root > < level value = "Error" /> <!-- <appender-ref ref="RollingLogFileAppender" /> --> < appender-ref ref = "ErrorRollingLogFileAppender" /> </ root > < appender name = "ErrorRollingLogFileAppender" type = "log4net.Appender.RollingFileAppender,log4net" LEVEL = "ERROR" > < lockingModel type = "log4net.Appender.FileAppender+MinimalLock" /> < param name = "File" value = "c:\surging\Error\" /> < param name = "AppendToFile" value = "true" /> < param name = "RollingStyle" value = "Composite" /> < param name = "DatePattern" value = "_yyyyMMddHH.TXT" /> < param name = "StaticLogFileName" value = "false" /> < param name = "MaxSizeRollBackups" value = "-1" /> < param name = "MaximumFileSize" value = "5MB" /> < layout type = "log4net.Layout.PatternLayout,log4net" > < param name = "ConversionPattern" value = "%date [%thread] %-5level %logger [%ndc] - %message%newline" /> </ layout > < filter type = "log4net.Filter.LevelRangeFilter" > < param name = "LevelMin" value = "ERROR" /> < param name = "LevelMax" value = "FATAL" /> </ filter > </ appender > </ log4net > |
然后新增cacheSettings.json其中Map:Properties下的value的值是redis地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | { "CachingSettings" : [ { "Id" : "ddlCache" , "Class" : "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching" , "Properties" : [ { "Name" : "appRuleFile" , "Ref" : "rule" }, { "Name" : "dataContextPool" , "Ref" : "ddls_sample" , "Maps" : [ { "Name" : "Redis" , "Properties" : [ { "value" : "172.17.0.2:6379::1" } ] }, { "Name" : "MemoryCache" } ] }, { "Name" : "defaultExpireTime" , "value" : "120" }, { "Name" : "connectTimeout" , "Value" : "120" }, { "Name" : "minSize" , "Value" : "1" }, { "Name" : "maxSize" , "Value" : "10" } ] } ] } |
新增eventBusSettings.json,其中的EventBusConnection对应的是RabbitMQ docker的地址
1 2 3 4 5 | { "EventBusConnection" : "172.17.0.3" , "EventBusUserName" : "guest" , "EventBusPassword" : "guest" } |
Program.cs的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | using Autofac; using Surging.Core.Codec.MessagePack; using Surging.Core.Consul; using Surging.Core.Consul.Configurations; using Surging.Core.CPlatform; using Surging.Core.CPlatform.Utilities; using Surging.Core.DotNetty; using Surging.Core.EventBusRabbitMQ; using Surging.Core.Log4net; using Surging.Core.ProxyGenerator; using Surging.Core.ServiceHosting; using Surging.Core.ServiceHosting.Internal.Implementation; using System; using System.Text; namespace Service.A { class Program { static void Main( string [] args) { NewMethod(); } private static void NewMethod() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var host = new ServiceHostBuilder() .RegisterServices(builder => { builder.AddMicroService(option => { option.AddServiceRuntime(); option.AddRelateService(); //option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181")); option.UseConsulManager( new ConfigInfo( "172.17.0.4:8500" )); option.UseDotNettyTransport(); option.UseRabbitMQTransport(); option.AddRabbitMQAdapt(); //option.UseProtoBufferCodec(); option.UseMessagePackCodec(); builder.Register(p => new CPlatformContainer(ServiceLocator.Current)); }); }) .SubscribeAt() .UseLog4net( "Configs/log4net.config" ) //.UseServer("127.0.0.1", 98) //.UseServer("127.0.0.1", 98,“true”) //自动生成Token //.UseServer("127.0.0.1", 98,“123456789”) //固定密码Token .UseServer(options => { options.Ip = "172.17.0.6" ; options.Port = 9990; options.Token = "True" ; options.ExecutionTimeoutInMilliseconds = 30000; options.MaxConcurrentRequests = 200; options.NotRelatedAssemblyFiles = "Centa.Agency.Application.DTO\\w*|StackExchange.Redis\\w*" ; }) .UseProxy() .UseStartup<Startup>() .Build(); using (host.Run()) { Console.WriteLine($ "服务端启动成功,{DateTime.Now}。" ); } } } } |
新增Startup.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | using Autofac; using Autofac.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Surging.Core.Caching.Configurations; using Surging.Core.CPlatform.Utilities; using Surging.Core.EventBusRabbitMQ.Configurations; using System; namespace Service.A { public class Startup { public Startup() { var config = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory); ConfigureEventBus(config); //ConfigureCache(config); } public IContainer ConfigureServices(ContainerBuilder builder) { var services = new ServiceCollection(); ConfigureLogging(services); builder.Populate(services); ServiceLocator.Current = builder.Build(); return ServiceLocator.Current; } public void Configure(IContainer app) { app.Resolve<ILoggerFactory>() .AddConsole((c, l) => ( int )l >= 3); } #region 私有方法 /// <summary> /// 配置日志服务 /// </summary> /// <param name="services"></param> private void ConfigureLogging(IServiceCollection services) { services.AddLogging(); } private static void ConfigureEventBus(IConfigurationBuilder build) { build .AddEventBusFile( "eventBusSettings.json" , optional: false ); } /// <summary> /// 配置缓存服务 /// </summary> private void ConfigureCache(IConfigurationBuilder build) { build .AddCacheFile( "cacheSettings.json" , optional: false ); } #endregion } } |
Service.A.Service 类库下新增AService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using Surging.Core.ProxyGenerator; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace Service.A.Service { public class AService:ProxyServiceBase,IAService { public Task< string > SayHello( string name) { return Task.FromResult($ "{name} say : hello" ); } } } |
新增IAService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using Surging.Core.CPlatform.Ioc; using Surging.Core.CPlatform.Runtime.Server.Implementation.ServiceDiscovery.Attributes; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace Service.A.Service { [ServiceBundle( "api/{Service}" )] public interface IAService : IServiceKey { Task< string > SayHello( string name); } } |
其他类库和服务与以上代码基本无二,这里不在赘述。不清楚的可以留言
所有代码都处理好后,在Service.A、Service.B、Service.C项目上右键新增docker支持文件,然后会生成一下文件
修改其中的docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | version: '3' services: service.a: image: servicea ports: - "127.0.0.1:9990:9990" network_mode: "bridge" build: context: . dockerfile: Service.A/Dockerfile service.b: image: serviceb ports: - "127.0.0.1:9991:9991" network_mode: "bridge" build: context: . dockerfile: Service.B/Dockerfile service.c: image: servicec ports: - "127.0.0.1:9992:9992" network_mode: "bridge" build: context: . dockerfile: Service.C/Dockerfile webapplication1: image: webapplication1 build: context: . dockerfile: ../WebApplication1/Dockerfile |
然后选择docker运行即可
最后访问surging网关,即可看见效果
以上就是本文的全部内容,希望对大家的学习有所帮助