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

时间:2022-11-01 22:52:36

基于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脚本配置不同的服务端口

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

网关实现:

   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直接拷贝的

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

docker部署网关与api:

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

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

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

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

 

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

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

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

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

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

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

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

.net core Ocelot实现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. &period;NET Core 微服务—API网关&lpar;Ocelot&rpar; 教程 &lbrack;一&rsqb;

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

  2. &period;NET Core 微服务—API网关&lpar;Ocelot&rpar; 教程 &lbrack;二&rsqb;

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

  3. &period;NET Core 微服务—API网关&lpar;Ocelot&rpar; 教程 &lbrack;三&rsqb;

    前言: 前一篇文章<.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&period;Net Core WebAPI&plus;PostgreSQL部署在Docker中

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

  6. 把ABP框架部署到Docker中

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

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

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

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

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

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

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

随机推荐

  1. BZOJ 2724&colon; &lbrack;Violet 6&rsqb;蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  2. algo&lowbar;预备

    章 C + +程序设计 大家好!现在我们将要开始一个穿越" 数据结构.算法和程序" 这个抽象世界的特殊旅程,以解决现实生活中的许多难题.在程序开发过程中通常需要做到如下两点:一是高 ...

  3. SED入门

    使用Linux多年,SED和AWK两大神器却始终无法得心应手的来提高自己的工作效率,每每需要查找替换,都要依赖于ST2等一众图形工具,深感愧疚,乃专门抽时间学习之,志在使之真正成为左右手.   SED ...

  4. QPBOC扩展应用交易流程

    1 Q扩展部分数据 增加3个DGI,分别为:A001,8020,9020 9103中增加DF60(9F38中),DF61 增加DF62,DF63 1.1  A001扩展应用配置 DGI 长度 值(示例 ...

  5. java 执行redis的部分方法

    @Autowired private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(R ...

  6. delphi中 dataset容易出错的地方

    最近写delphi项目,用到的数据集中的dataset,一直修改exception啊,写下过程. 在对数据集进行任何操作之前,首先要打开数据集.要打开数据集,可以把Active属性设为True,例如: ...

  7. TCP断线重连

    struct sockaddr_in TempSadd; TempSadd.sin_family = AF_INET; TempSadd.sin_port = htons(m_ServerPort); ...

  8. Usbhub驱动编译

    在3g 4g的usb驱动基础上,加入以下部分,就可以驱动hub了 kmod-usb-hid 3.3.8-1 kmod-usbip 3.3.8-1 kmod-usbip-client 3.3.8-1 k ...

  9. IDEA设置类注解和方法注解(详解)

    从eclipse工具到IDEA工具的转化,发现IDEA工具配置注释模板变的不一样了,不说废话了,直接开始 一.设置类注解模板(在创建类的时候自动填充模板) /** * @ProjectName: ${ ...

  10. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...