上一篇【.Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)】已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来连接客户端与服务。

Ocelot

官网:https://ocelot.readthedocs.io/
Ocelot正是为.Net微服务体系提供一个统一的入口点,称为:Gateway(网关)。

  • 上手Ocelot:

首先创建一个空的asp.net core web项目。

注意ocelot.json是我们添加的Ocelot的配置文件,记得设置生成时复制到输出目录。ocelot.json的文件名不是固定的,可以自己定义。

NuGet安装一下Ocelot:

只需简单的修改几处默认代码:
Program.cs:

    public class Program    {        public static void Main(string[] args)        {            CreateHostBuilder(args).Build().Run();        }        public static IHostBuilder CreateHostBuilder(string[] args) =>            Host.CreateDefaultBuilder(args)                .ConfigureAppConfiguration((hostingContext, config) =>                {                    config.AddJsonFile("ocelot.json");                })                .ConfigureWebHostDefaults(webBuilder =>                {                    webBuilder.UseStartup();                });    }

Startup.cs:

    public class Startup    {        // This method gets called by the runtime. Use this method to add services to the container.        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940        public void ConfigureServices(IServiceCollection services)        {            //添加ocelot服务            services.AddOcelot();        }        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            //设置Ocelot中间件            app.UseOcelot().Wait();        }    }

ocelot.json:

{  "Routes": [    {      "DownstreamPathTemplate": "/products",      "DownstreamScheme": "http",      "DownstreamHostAndPorts": [        {          "Host": "localhost",          "Port": 9050        },        {          "Host": "localhost",          "Port": 9051        },        {          "Host": "localhost",          "Port": 9052        }      ],      "UpstreamPathTemplate": "/products",      "UpstreamHttpMethod": [        "Get"      ],      "LoadBalancerOptions": {        "Type": "RoundRobin" //负载均衡,轮询机制 LeastConnection/RoundRobin/NoLoadBalancer/CookieStickySessions      }    },    {      "DownstreamPathTemplate": "/orders",      "DownstreamScheme": "http",      "DownstreamHostAndPorts": [        {          "Host": "localhost",          "Port": 9060        },        {          "Host": "localhost",          "Port": 9061        },        {          "Host": "localhost",          "Port": 9062        }      ],      "UpstreamPathTemplate": "/orders",      "UpstreamHttpMethod": [        "Get"      ],      "LoadBalancerOptions": {        "Type": "RoundRobin" //负载均衡,轮询机制 LeastConnection/RoundRobin/NoLoadBalancer/CookieStickySessions      }    }  ],  "GlobalConfiguration": {    "BaseUrl": "http://localhost:9070"  }}

我们先暂时忽略Consul,将服务实例的地址都写在配置文件中。要知道Consul、Ocelot等组件都是可以独立存在的。
配置文件中的Routes节点用来配置路由,Downstream代表下游,也就是服务实例,Upstream代表上游,也就是客户端。我们的路径比较简单,只有/products、/orders,路径中如果有不固定参数则使用{}匹配。我们这个配置的意思呢就是客户端访问网关的/orders、/products,网关会转发给服务实例的/orders、/products,注意这个上游的路径不一定要和下游一致,比如上游路径可以配置成/api/orders,/xxx都可以。
LoadBalancerOptions节点用来配置负载均衡,Ocelot内置了 LeastConnection、RoundRobin、NoLoadBalancer、CookieStickySessions 4种负载均衡策略。
BaseUrl节点就是配置我们ocelot网关将要运行的地址。

  • 运行gateway:

目前不考虑网关集群,就不放在docker里了。直接控制台执行:`dotnet Ocelot.APIGateway.dll --urls="http://*:9070"

用浏览器测试一下:

测试正常,我们通过网关可以正常的访问到服务实例。

  • 接下来继续改造客户端代码:

因为改动太多就直接新建一个GatewayServiceHelper来做。
GatewayServiceHelper:

    ///     /// 通过gateway调用服务    ///     public class GatewayServiceHelper : IServiceHelper    {        public async Task GetOrder()        {            var Client = new RestClient("http://localhost:9070");            var request = new RestRequest("/orders", Method.GET);            var response = await Client.ExecuteAsync(request);            return response.Content;        }        public async Task GetProduct()        {            var Client = new RestClient("http://localhost:9070");            var request = new RestRequest("/products", Method.GET);            var response = await Client.ExecuteAsync(request);            return response.Content;        }        public void GetServices()        {            throw new NotImplementedException();        }    }

然后在Startup中修改一下注入的类型,别的就不用改了,这就是依赖注入的好处之一。。。
Startup.ConfigureServices():

//注入IServiceHelper//services.AddSingleton();            //注入IServiceHelperservices.AddSingleton();

Startup.Configure():

//程序启动时 获取服务列表//serviceHelper.GetServices();

运行客户端测试:

好了,现在客户端对服务的调用都通过网关进行中转,客户端再也不用去关心那一堆服务实例的地址,只需要知道网关地址就可以了。另外,服务端也避免了服务地址直接暴露给客户端。这样做对客户端,服务都非常友好。

至于我们的api网关呢,又要说到服务发现的问题了。目前我们的服务地址是写在ocelot.json配置文件里的,当然这种做法在服务实例不经常变化的情况下是没有问题的,一旦服务变化,需要人为的修改配置文件,这又显得不太合理了。

当然,强大的Ocelot为我们提供了服务发现的方案。

代码放在:https://github.com/xiajingren/NetCoreMicroserviceDemo

.net core ocelot 获取路由的mothed_Net Core微服务入门全纪录(四)Ocelot网关(上)相关推荐

  1. swagger 返回json字符串_Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.yml文件的编写,最后使用docker compose的一个up指 ...

  2. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    点击上方蓝字"小黑在哪里"关注我吧 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.yml文件 ...

  3. .NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

    前言 最近一直在忙公司和私下的兼职,白天十个小时,晚上四个小时,感觉每天都是打了鸡血似的,精神满满的,连自己那已经学打酱油的娃都很少关心,也有很长一段时间没有更新博客了,特别抱歉,小伙伴们都等得想取关 ...

  4. .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门--Ocelot API网关接入(二) 我们先接入Consul,实现服务发现 服务发现 1.引入 Ocelot.Provider.Consul 包 2.修改ocelot.js ...

  5. .Net Core微服务入门——Ocelot API网关接入(一)

    .Net Core微服务入门--Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现,但是现实生产环境我们直接通过Client自行连接Consul ...

  6. .Net Core微服务入门——Ocelot和Consul集群高可用

    .Net Core微服务入门--Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群,并且访问成功. 但是,我们也遇到了问题,把 192.168.8.25 上 ...

  7. 使用ASP.NET Core、Ocelot、MongoDB和JWT的微服务

    目录 介绍 开发环境 技术 体系结构 源代码 微服务 API网关 客户端应用 单元测试 使用健康检查进行监视 如何运行应用程序 如何部署应用程序 进一步阅读 本文显示了一个使用ASP.NET Core ...

  8. .NET微服务体系结构中为什么使用Ocelot实现API网关

    为什么要使用API网关而不是直接通信? 在微服务架构中,客户端应用程序通常需要使用来自多个微服务的功能.如果直接执行该消费,则客户端需要处理多个微服务端点以进行呼叫.当应用程序发展并引入新的微服务或更 ...

  9. NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

    前言 最近一直在忙公司和私下的兼职,白天十个小时,晚上四个小时,感觉每天都是打了鸡血似的,精神满满的,连自己那已经学打酱油的娃都很少关心,也有很长一段时间没有更新博客了,特别抱歉,小伙伴们都等得想取关 ...

最新文章

  1. linux下搭建mrbs会议室预定管理系统
  2. getHibernateTemplate()和getSession()的区别
  3. 精简三星Galaxy III 迷你版 自带无用软件
  4. Boost::context模块callcc的解析器测试程序
  5. mkfs -t ext3 错误/dev/sdxx is apparently in use by the system; 解决方法
  6. python 温度转换程序_Python程序将米转换为码
  7. 516. 最长回文子序列
  8. centos 安装tomcat_简单介绍Linux配置mysql,tomcat,Nginx 开机自启动的几个方式
  9. javascript动态合并纵向单元格
  10. php密码重复,AngularJs验证重复密码的方法(两种)
  11. tornado异步客户端(Future)
  12. jQuery-选择器-查找标签
  13. Android Ndef Message解析
  14. PMP学习笔记(一):PMP 目录
  15. 借助栈将一个带头节点的单链表倒置
  16. 深度学习基础技术分析2:神经网络(含代码分析)
  17. 分销APP联盟商家入驻商城系统开发
  18. 蓝牙技术|防丢背包获奖,Find My产品受追捧
  19. 【阿里出品】数智园区白皮书(附下载)
  20. 【壁纸】 Kali Linux 2020.1b 最新原版壁纸

热门文章

  1. Python Matplotlib基本用法
  2. HDU1010 Tempter of the Bone DFS+剪枝
  3. java 加法 溢出_java实现两个大数相加,可能出现溢出错误
  4. 【Java后端】三目运算符失效问题刨根问底(及NPE分析)
  5. junit4/5 getDefaultClassLoader()Ljava/lang/ClassLoader;
  6. 教你一招如何使用几行代码实现zookeeper作为springcloud的服务注册中心
  7. vue实现时间选择器,精确到秒
  8. 「数据库系列一」为什么要用数据库?
  9. 通过过滤器防止用户通过url访问不在权限内的菜单
  10. JavaScript + Tampermonkey——易班优课YOOC课群在线测试自动答题解决方案(十七)复合型解决方案油猴脚本