.net core Ocelot实现API网关并部署在docker中

 基于Ocelot搭建的API网关demo

软件以及系统版本:

   Asp.Net Core 2.2

  Ocelot 13.5.0

  CentOS 7.6.1810

  Docker 18.09.4

项目结构:

  Sample.Gateway为服务网关

  Sample.Api为下游服务

 这里我偷懒我只创建了一个api的项目,然后根据shell脚本配置不同的服务端口

    

网关实现:

   1.新建一个基于Asp.net Core 2.2的网站Sample.Gateway

   2.在程序包管理控制台中输入 Install-Package Ocelot安装Ocelot ,默认最新版本

   3.然后新增Ocelot.json的配置文件:

{
  "ReRoutes": [
    {
      "UpstreamPathTemplate": "/api/{controller}",
      "UpstreamHttpMethod": [ "Get" ],
      "DownstreamPathTemplate": "/api/{controller}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "host": "192.168.1.107",
          "port": 5001
        },
        {
          "host": "192.168.1.107",
          "port": 5002
        },
        {
          "host": "192.168.1.107",
          "port": 5003
        }
      ],
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    }
  ],

  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}

 

4.修改Program读取Ocelot的配置

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((contex, builder) =>
                {
                    builder.SetBasePath(contex.HostingEnvironment.ContentRootPath).AddJsonFile("Ocelot.json");
                })
            .UseStartup<Startup>();

 5.在Startup中注入并使用Ocelot

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseOcelot().Wait();

            app.UseMvc();
        }

6.由于本人实践的是在docker中部署的,那么我们就需要添加一个Dockerfile文件

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app/sample.gateway
COPY . .
#EXPOSE 80

ENTRYPOINT ["dotnet", "Sample.Gateway.dll"]

7.新建一个build.sh的shell脚本,主要是不想频繁的输入命令

#!/bin/bash
sudo docker stop api.gateway 
sudo docker rm api.gateway
sudo docker rmi api.gateway
sudo docker build -t api.gateway . sudo docker run --name=api.gateway -d -p 5000:5000 -e "ASPNETCORE_URLS=http://+:5000" api.gateway

 sudo docker stop api.gateway:由于在不在测试重新运行容器会报错所以先停止容器然后做删除操作

    sudo docker rm api.gateway:删除容器

    sudo docker build -t api.gateway .:构建一个名为api.gateway的镜像

    sudo docker rmi api.gateway:移除镜像api.gateway

    sudo docker run --name=api.gateway -d -p 5000:5000 -e "ASPNETCORE_URLS=http://+:5000" api.gateway:使用api.gateway镜像构建一个名为api.gateway的容器,因为前面需要删除容器,如果根据容器id的话行是不行滴,所以使用--name=api.gateway给容器命名

   注意:需要将build.sh,build.sh设置成始终复制,这样在发布的时候才会将这两个文件复制到打包的文件夹下   

                   

   至此Ocelot网关部分已完成

Api实现:

  1.新建Sample.Api的asp.net core2.2的api项目

   2.修改ValuesController代码

[Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IConfiguration _configuration;
        public ValuesController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        // GET api/values
        [HttpGet]
        public string Get()
        {
            return $"prot={HttpContext.Request.Host.Port} appName={ _configuration["AppName"]}  thisTime={DateTime.Now.ToString()}";
        }


    }

  

  3.设置appsetting.json    

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "AppName": "Api"
}

  4.新建Dockerfile文件

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app/api.a
COPY . .
#EXPOSE 80

ENTRYPOINT ["dotnet", "Sample.Api.dll"]

 5.新建build.sh文件 

#!/bin/bash
sudo docker stop api.a
sudo docker rm api.a
sudo docker stop api.b
sudo docker rm api.b
sudo docker stop api.c
sudo docker rm api.c

sudo docker rmi api.a

sudo docker build --no-cache -t api.a .
sudo docker run --name=api.a -d -p 5001:5001 -e "ASPNETCORE_URLS=http://+:5001" api.a
sudo docker run --name=api.b -d -p 5002:5002 -e "ASPNETCORE_URLS=http://+:5002" api.a
sudo docker run --name=api.c -d -p 5003:5003 -e "ASPNETCORE_URLS=http://+:5003" api.a

 api服务我这里只构建的一个镜像,然后根据构建的镜像生成3个api容器

   到这里api服务的部分也完成了,接下来将网关与api服务发布到,发布成功后将网关与api服务的文件拷贝到centos虚拟机中,我这里用的WinScp直接拷贝的

       

 docker部署网关与api:

   1.cd至网关所在文件目录,输入命令:chmod u+x build.sh 更改权限

 

  2.输入 ./build.sh 执行网关的部署

  

 

  3.cd至api服务所在文件目录,执行 chmod u+x build.sh 更改权限

   

 4..输入 ./build.sh 执行api的部署

  

      至此api和网关都已部署在docker中,下面来验证下

    

   

  

  从上面的截图证实基于Ocelot框架的服务网关已经搭建成功

 参考博客:https://www.cnblogs.com/alan-lin/p/9126155.html

 源码地址:https://github.com/4567646/NetCoreSamples.git (在Ocelot.Sample分支下)

猜你喜欢

转载自www.cnblogs.com/lf13/p/10693559.html