.Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...

1.服务注册

在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类:

    public static class AppBuilderExtensions{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLifetime lifetime,ServiceEntity serviceEntity){var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));//请求注册的Consul地址var httpCheck = new AgentServiceCheck(){DeregisterCriticalServiceAfter=TimeSpan.FromSeconds(5),//服务启动多久后注册Interval=TimeSpan.FromSeconds(10),//健康检查时间间隔,或者成为心跳间隔HTTP=$"http://{serviceEntity.IP}:{serviceEntity.Port}/api/health",//健康检查地址Timeout=TimeSpan.FromSeconds(5)};//Register service with consulvar registration = new AgentServiceRegistration(){Checks = new[] {httpCheck},ID=Guid.NewGuid().ToString(),Name=serviceEntity.ServiceName,Address=serviceEntity.IP,Port=serviceEntity.Port,Tags = new[] { $"urlprefix-/{serviceEntity.ServiceName}"} //添加urlprefix-/servicename格式的tag标签,以便Fabio识别
            };consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用Consul API进行注册(HttpClient发起)lifetime.ApplicationStopping.Register(() =>{consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册
            });return app;}}public class ServiceEntity{public string IP { get; set; }public int Port { get; set; }public string ServiceName { get; set; }public string ConsulIP { get; set; }public int ConsulPort { get; set; }}

通过这个类可以提供服务注册的基本参数。

修改Startup启动项中的Configure方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}#region Consul 服务注册ServiceEntity serviceEntity = new ServiceEntity{IP = "127.0.0.1",   //服务运行地址Port = Convert.ToInt32(Configuration["Consul:ServicePort"]), //服务运行端口ServiceName = Configuration["Consul:Name"], //服务标识,Ocelot中会用到ConsulIP = Configuration["Consul:IP"], //Consul运行地址ConsulPort = Convert.ToInt32(Configuration["Consul:Port"])  //Consul运行端口(默认8500)
            };app.RegisterConsul(lifetime, serviceEntity);#endregionapp.UseIdentityServer();//app.UseAuthentication();
            app.UseStaticFiles();app.UseMvcWithDefaultRoute();}

看下配置文件需要新增的东西:

{"Service": {"Name": "MI.Service","Port": "7001","DocName": "Account Service","Version": "v1","Title": "Account Service API"},"Identity": {"IP": "localhost","Port": "7000","Scheme": "Bearer"},"ConnectionStrings": {"SqlConnection": "server=.;uid=sa;pwd=sa;database=MI"},"Consul": {"Name": "MI.Service.Account","ServiceProt": "7001","IP": "localhost","Port": "8500"}
}

蓝色标识的Consul部分是我们这里需要用到的,这里我把项目名称当作服务注册标识。

然后还需要为两个服务添加两个方法,一个是用来做健康检查的,一个是用来测试的:

    [Route("api/Health")]public class HealthController : Controller{[HttpGet]public IActionResult Get() => Ok("ok");}
public class MiUserController : Controller{public MIContext _context;public MiUserController(MIContext _context){this._context = _context;}public string Index(){return "Successful";}。。。。。。
}

 

通过“consul agent -dev”命令运行Consul,访问127.0.0.1:8500我们可以看到Consul的UI界面:

这里可以看到我们已经注册的两个服务。

 

2.服务发现

新建API项目MI.Ocelot,通过NuGet引用Ocelot和Ocelot.Provider.Consul两个包,并修改启动项注册Ocelot和Consul:

public void ConfigureServices(IServiceCollection services){//services.AddMvc();
            services.AddOcelot(Configuration).AddConsul();}// 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();//app.UseMvc();  }

然后添加配置文件consul.json:

{"ReRoutes": [{"UseServiceDiscovery": true, //启用服务发现"DownstreamPathTemplate": "/Account/{url}", //下游转发路由"DownstreamScheme": "http", //标识头"ServiceName": "MI.Service.Account", //服务注册标识"LoadBalancer": "RoundRobin", //服务均衡:轮询"UpstreamPathTemplate": "/Account/{url}", //上游请求路由"UpstreamHttpMethod": [ "Get", "Post" ], //请求的方法类型"ReRoutesCaseSensitive": false //不区分大小写
    },{"UseServiceDiscovery": true,"DownstreamPathTemplate": "/Identity/{url}","DownstreamScheme": "http","ServiceName": "MI.Service.IdentityServer","LoadBalancer": "RoundRobin","UpstreamPathTemplate": "/Identity/{url}","UpstreamHttpMethod": [ "Get", "Post" ],"ReRoutesCaseSensitive": false}],"GlobalConfiguration": {//"BaseUrl": "http://localhost:7003","ServiceDiscoveryProvider": {"Host": "127.0.0.1", // Consul Service IP"Port": 8500, // Consul Service Port"Type": "PollConsul","PollingInterval": 100 //健康检查时间端
    }}
}

在Program中启用这个配置文件:

        public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().ConfigureAppConfiguration((hostingContext,builder)=> {builder.AddJsonFile("consul.json");}).Build();

到此,网关配置完毕。现在我将网关项目MI.Gateway部署在7003端口,登录服务MI.Service.Account部署在7001端口,鉴权服务部署在7000端口,我会通过访问网关服务来请求登录服务:

这里的流程是这样的,Ocelot通过“/Account/MiUser/Index”匹配到了“/Account/{url}”这个路由,进而拿到了“MI.Service.Account”这个服务注册标识,然后通过Consul拿到了对应的地址,并转发了请求,同时返回结果。

 

到此,具备服务注册和发现的简单网关服务就搭建完毕了,后面有时间会继续优化,添加限流、熔断,同时身份验证会在Ocelot中进行,而不是再去访问单独的鉴权服务。

 

转载于:https://www.cnblogs.com/weiBlog/p/9833807.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四参数坐标转换c++_GPSRTK坐标转换及四参数、七参数适用条件

工程测量仪器已由经纬仪、全站仪过渡到GNSS(全球卫星导航系统)&#xff0c;特别是公路行业&#xff0c;GPS-RTK作为GNSS的一种应用目前已十分普及。现阶段GPS-RTK以WGS-84 坐标系统为主流&#xff0c;所发布的星历参数也是基于此坐标系统&#xff0c;但随着北斗导航系统的逐步完…

java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)

HDFS的Java APIJava API介绍将详细介绍HDFS Java API&#xff0c;一下节再演示更多应用。Java API 官网如上图所示&#xff0c;Java API页面分为了三部分&#xff0c;左上角是包(Packages)窗口&#xff0c;左下角是所有类(All Classes是)窗口&#xff0c;右侧是详情窗口。这里推…

最大连通子数组

这次是求联通子数组的求和&#xff0c;我们想用图的某些算法&#xff0c;比如迪杰斯特拉等&#xff0c;但是遇到了困难。用BFS搜索能达到要求&#xff0c;但是还未能成功。 那么我们这样想&#xff0c;先将每行的最大子数组之和&#xff0c;然后再将这些最大之和组成一个数组&a…

[Matlab] 画图命令

matlab画图命令&#xff0c;不定时更新以便查找 set(gcf, color, [1 1 1]);     % 使图背景为白色 alpha(0.4);           %设置平面透明度 plot(Circle1,Circle2,k--,linewidth,1.25);  % k--设置线型  ‘linewidth’,1.25  设置线宽度为1.25 %线型   …

终端terminal的颜色配置

PS1 color 终端terminal的颜色配置 PS1"\[\e[92;1m\][\u\e[90;5m\e[25m\[\e[91;4m\]Atlas\e[24m\[\e[1m\]\[\e[92;1m\] \W ]\\$\[\e[0m\]" Set CodeDescriptionExamplePreview1Bold/Bright echo -e "Normal \e[1mBold" 2Dim echo -e "Normal \e[2mDi…

Linux Kernel Oops异常分析

0&#xff0e;linux内核异常常用分析方法 异常地址是否在0附近&#xff0c;确认是否是空指针解引用问题异常地址是否在iomem映射区&#xff0c;确认是否是设备访问总线异常问题&#xff0c;如PCI异常导致的地址访问异常异常地址是否在stack附近&#xff0c;如果相邻&#xff0c…

【懒癌发作】收集各种懒癌发作时用程序写作业的程序

updata:20170621 好的&#xff0c;已经是准高一了&#xff0c;现在看起来太蠢了。。。 -------------------------------------------------------------------------------------- 要真正的运用&#xff0c;程序一定是要来解决实际问题的——比如作业&#xff08;懒就直说&…

50欧姆线设计 高频pcb_硬件设计基础100问(三)

硬件基础知识问答今天依旧是节前知识储备哦&#xff0c;jacky大神整理的硬件基础知识很细致&#xff0c;第三弹学起来&#xff01;01 1、晶体管基本放大电路有共射、共集、共基三种接法&#xff0c;请简述这三种基本放大电路的特点。共射&#xff1a;共射放大电路具有放大电流和…

java操作文件爱女_Java的IO操作---File类

目标1)掌握File类作用2)可以使用file类中方法对文件进行读写操作。File类唯一与文件有关的类。使用file类可进行创建或删除操作&#xff0c;要想使用File类&#xff0c;首先观察File类的构造方法。public File(String pathname);实例化File类的时候&#xff0c;必须设置好路径。…

openssl创建私有ca

openssl创建私有ca1.ssl大概内容PKI&#xff1a;公钥基础设施结构CA&#xff1a;证书权威机构&#xff0c;PKI的核心CRL&#xff1a;证书吊销列表,使用证书之前需要检测证书有效性证书存储格式常见的X509格式包含内容 公钥有效期限证书的合法拥有人证书该如何使用CA的信息CA签名…

查询显示注释_SQL的简单查询

1.基本的查询语句-- *代表查询所有的列select * from <表名>;distinct表示列中不包括重复的值&#xff0c;例如select distinct 姓名&#xff1b;如果是select distinct 姓名,学号&#xff1b;则表示姓名和学号都重复的值才会显示。as为列设定别名&#xff0c;例如select…

【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)...

引入 我们首先提出一个问题&#xff1a; 给出n个串每个串的长度≤m 然后给出一个长度为k的串&#xff0c;询问前n个串中有多少个是匹配成了的 暴力搜索 这题不是sb题目吗&#xff1f; 随随便便O(kmn)跑过。 。。。。 n10000 m50 k1000000 。。。。 好吧——我们用AC自动…

java 栈空间_初学JAVA——栈空间堆空间的理解

1.Person pangzi; //这是在“开拓空间”于栈空间pangzinew Person(); //这是赋值于堆空间上两步就是在做与空间对应的事。2.值类型直接存入栈空间&#xff0c;如AF&#xff0c;引用类型存入堆空间&#xff0c;在栈空间存有“索引地址”&#xff0c;如当需要B时&#xff0…

jmeter+maven+jenkins自动化接口测试(下)

mavenjmeter已经写好了&#xff0c;可以通过maven来执行jmeter的接口测试脚本&#xff0c;怎样实现定时执行测试并发送报告邮件就需要通过jenkins了&#xff08;jmeter或者testng也可以结合不同的邮件jar包来发送邮件&#xff0c;这里使用jenkins&#xff09; 安装jenkins笔记有…

Android RecyclerView (一) 使用完全解析

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的…

Asix下日志包冲突

为什么80%的码农都做不了架构师&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的时候发生如下错误&#xff0c;原因是程序运行时logFactoryImple加载了JBOSS下面的sff4j包…

kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础&#xff1a;1. 已安装、配置kubernetes2. 集群中有tomcat与mysql容器镜像3. 有docker基础具体步骤部署tomcat创建tomcat RC对象我们想要在kubernetes集群中配置tomcat服务器&#xff0c;首先要保证集群中的节点上…

【原】Jenkins持续集成环境搭建之创建java项目的job【centos6.5 java maven git 项目】...

一、构建一个maven项目在jenkins主页上&#xff0c;左侧&#xff0c;选择“新建”&#xff0c;然后填写项目名称&#xff0c;选择“构建一个maven项目”二、Git配置保存之后&#xff0c;进入详细配置页面&#xff1a;这里的源码管理&#xff1a;选择git&#xff0c;输入代码的g…

Linux内核分析作业第八周

进程的切换和系统的一般执行过程 一、进程调度的时机 中断处理过程&#xff08;包括时钟中断、I/O中断、系统调用和异常&#xff09;中&#xff0c;直接调用schedule()&#xff0c;或者返回用户态时根据need_resched标记调用schedule()&#xff1b; 内核线程可以直接调用sched…

iOS--数据存储NSUserDefaults

2019独角兽企业重金招聘Python工程师标准>>> 今天去面试&#xff0c;被问道NSUserDefaults的存取并手写出来&#xff0c;一时想不起来&#xff0c;回来之后看看之前的笔记&#xff0c;稍作一些整理 NSUserDefaults是一个单例&#xff0c;在整个程序中只有一个实例对…