基于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. select 下拉选择自动到textarea框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 一种hyperscan API使用(1)

    hyperscan: 编译和安装:http://www.cnblogs.com/zzqcn/p/4900643.html 简单介绍:http://www.cnblogs.com/zzqcn/p/489 ...

  3. Unity中有限状态机的用法教程

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  4. s21day23 python笔记

    s21day23 python笔记 一.内容回顾及补充 字符串格式化 %s # 示例一:特别注意:最后的右括号前面必须有逗号(,) msg = '我是%s,年龄%s'%('alex',19,) # 元 ...

  5. 增删改查js

    -----------------------------------------------------一---------------------------------------------- ...

  6. 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A

    ╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ...

  7. viewport定义,弹性布局,响应式布局及LESS和SASS框架应用

    一,移动端宽度设置 viewport视图窗口,<meta name="viewport" content="width=device-width,initial-s ...

  8. vue cli3.0配制axios代理

    今天学习时,想访问网易新闻接口,结果显而易见,因为跨域被浏览器拒绝了. 去网上找一下结果一开始找到的是2.x版本的配置,生硬的放进去,给我各种报错.编译阶段就炸了.浪费好多时间 再按3.0版本去搜索才 ...

  9. 《python for data analysis》第九章,数据聚合与分组运算

    # -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...

  10. win10 uwp 读取resw资源文件

    ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMa ...