• [转载]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.ServiceService.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代码如下:

    <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:surgingError" />
        <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地址

    {
        "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的地址

    {
      "EventBusConnection": "172.17.0.3",
      "EventBusUserName": "guest",
      "EventBusPassword": "guest"
    }

    Program.cs的代码如下

    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

    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

    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

    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

    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网关,即可看见效果

     
     
  • 相关阅读:
    P1603 斯诺登的密码
    C++ 文件操作
    Hibernate Dialect must be explicitly set
    Dijkstra算法详解
    Php 使用 fsockopen发送http请求
    再探java基础——break和continue的用法
    Android源码的下载和编译
    ALV列、行、单元格颜色设置
    数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(2)
    [poj 2926]Requirements[最远曼哈顿距离]
  • 原文地址:https://www.cnblogs.com/bigmango/p/10392730.html
Copyright © 2020-2023  润新知