基于Ocelot(http://ocelot.readthedocs.io)搭建的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的配置文件:172.17.0.1为docker的ip

{
"ReRoutes": [
{
"UpstreamPathTemplate": "/api/{controller}",
"UpstreamHttpMethod": [ "Get" ],
"DownstreamPathTemplate": "/api/{controller}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"host": "172.17.0.1",
"port": 5001
},
{
"host": "172.17.0.1",
"port": 5002
},
{
"host": "172.17.0.1",
"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脚本使用 vi build.sh创建,然后在编辑的时候将命令copy即可,由于我将build.sh直接copy到虚拟机之后执行此文件会报错

至此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分支下)

.net core Ocelot实现API网关并部署在docker中的更多相关文章

  1. .NET Core 微服务—API网关(Ocelot) 教程 [一]

    前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...

  2. .NET Core 微服务—API网关(Ocelot) 教程 [二]

    上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...

  3. .NET Core 微服务—API网关(Ocelot) 教程 [三]

    前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...

  4. Ocelot实现API网关服务

    NET Core微服务之基于Ocelot实现API网关服务 https://www.cnblogs.com/edisonchou/p/api_gateway_ocelot_foundation_01. ...

  5. Asp.Net Core WebAPI+PostgreSQL部署在Docker中

     PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...

  6. 把ABP框架部署到Docker中

    本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像.启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile. ...

  7. .NET Core微服务之基于Ocelot实现API网关服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...

  8. .NET Core微服务之基于Ocelot实现API网关服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...

  9. NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

    前言 我们都知道,API网关是工作在应用层上网关程序,为何要这样设计呢,而不是将网关程序直接工作在传输层.或者网络层等等更底层的环境呢?让我们先来简单的了解一下TCP/IP的五层模型.     (图片 ...

随机推荐

  1. C# receive 接收的字符串 对比不相等的问题

    背景: 最近写了一个C/S架构的 C# Socket 通讯项目,服务端,客户端弄通了之后,客户端发送给服务端后,服务端回复一个字符串告诉客户端确认收到了.问题就在这. 问题: 一开始,我让服务端回复了 ...

  2. C语言 进制转换

    这个程序仅仅是由十进制转换为其他进制的过程,其转换的规则如下图所示. 我使用的思路:首先在除基的过程中用一个数组保存余数,然后在输出进制转换结果的时候倒序输出,并且在输出前判断余数是否大于10,如果大 ...

  3. IIS Express服务器遇到400/503/IIS Express Error的解决办法

    目前脑子比较乱.下午想让室友从局域网中它的主机访问我电脑上自己部署的一个网站,可是接二连三遇到了400,503,...等问题,弄得有点头大.还好现在解决了.下面记录一下遇到的问题: (不知道为什么图片 ...

  4. [转]https://www.jianshu.com/p/06443248f4d8

    eos是什么? 原文 https://www.jianshu.com/p/06443248f4d8 简介 用一句话来定义eos,即:区块链操作系统,支持在它之上构建dapp,支持智能合约.帐户.身份验 ...

  5. ppt图片在word中不能正常显示,只显示为矩形框的解决方法

    word中插入的其他图片是好的,但是从ppt复制粘贴过来的图片只显示个框. 解决方法:以下红框中内容去选中.

  6. Sublime Text 3 package control 解决 "There are no packages available for installation" 错误

    造成这个错误的原因估计是因为由于packagecontrol.io无法访问,所以导致无法读取“https://packagecontrol.io/channel_v3.json”文件的原因. 解决方法 ...

  7. python接口测试-将运行结果写入Excel表格

    公司工作是促进学习的第一生产力!! 一个get请求的接口,我想清楚的在Excel中看到所有的数据! 带着学过H5,php觉得所有代码都很简单的自信,在公司开发的[鼓励]下开始了一上午的斗争 一个小时. ...

  8. Vue基础之内部指令(下)

    v-on绑定事件监听器 直接撸代码: <div id="app"> <h2>计数器</h2> number:{{number}} <but ...

  9. js: 文件(excel)下载处理

    以前很少接触文件下载的功能,昨天和后台开发人员联调下载功能出现了问题,一开始我请求接口,返回二进制文件流乱码,在网上找了方法,可以解决.后面后台开发人员改了一下,返回文件地址,然后就解决了.所以我了解 ...

  10. es6去重

    // set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目. var arr=[9,9,"丸子","丸子",undefined, ...