.net core Ocelot实现API网关并部署在docker中
基于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中的更多相关文章
- .NET Core 微服务—API网关(Ocelot) 教程 [一]
前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [二]
上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [三]
前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...
- Ocelot实现API网关服务
NET Core微服务之基于Ocelot实现API网关服务 https://www.cnblogs.com/edisonchou/p/api_gateway_ocelot_foundation_01. ...
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中
PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...
- 把ABP框架部署到Docker中
本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像.启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile. ...
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇
前言 我们都知道,API网关是工作在应用层上网关程序,为何要这样设计呢,而不是将网关程序直接工作在传输层.或者网络层等等更底层的环境呢?让我们先来简单的了解一下TCP/IP的五层模型. (图片 ...
随机推荐
- 深度学习(PYTORCH)-2.python调用dlib提取人脸68个特征点
在看官方教程时,无意中发现别人写的一个脚本,非常简洁. 官方教程地址:http://pytorch.org/tutorials/beginner/data_loading_tutorial.html# ...
- 日常踩坑 — 相邻元素之间的margin合并问题。
踩坑:使用v-for渲染的组件,当然图中的id已经换成class,还是没有解决这个问题,于是各种查找资料,我就不信简单的CSS问题这么难解决! v-for渲染组件级传值: <div class= ...
- 使用Selenium进行浏览器自动化操作记录
一位经验丰富的同事交给了我一个任务:将20个IP地址添加到公司系统对应的目录下. 这个任务之前做过,并且数量是远不止20个,当时就学习Selenium并且使用Python3.6写了一个脚本用来自动化地 ...
- videojs播放直播源rtmp时画面在左上角解决方案
问题描述:https://stackoverflow.com/questions/30383135/videojs-live-rtmp-stream-player-and-video-size-iss ...
- 克拉美罗界(CRB)
转载自:http://www.cnblogs.com/rubbninja/p/4512765.html 各种研究领域(包括无线定位方向)都会碰到参数估计的问题,这时常常会看到克拉美罗界 (Cramér ...
- java语言基础--接口
接口定义: 是一个特殊的抽象类,在接口里面的所有方法都是抽象的. 接口用interface来声明. 注意: 接口中只能出现常量和抽象方法: 接口里面没有构造方法,无法创建接口的对象: 接口和接口之间支 ...
- Jdbc来操作事物 完成模拟银行的转账业务
创建JDBC工具类 package cn.aa4_2.JDBCUtils; import java.io.FileReader; import java.io.IOException; import ...
- Mabatis面试题
Mybatis面试题 1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="U ...
- Hbase常用操作记录
Hbase常用操作记录 Hbase 创建表 查看表结构 修改表结构 删除表 创建表 语法:create <table>, {NAME => <family>, VERSI ...
- HOMEWORD2
开发工具和语言选择 语言 :pyhton3.6 工具 我选择的是 pycharm2019.1.由于之前已经安装好了,这里就不再贴出. 自动单元测试练习 python单元测试框架Unittest.Uni ...