新文章 网摘 文章 随笔 日记

.net core +ocelot+ consul 服务治理(干货)

 
 

本文案例说明环境:

Windows10、 VS2019、 netcore 3.1

 

consul概述说明

参考官方地址:https://www.consul.io/docs

 

Consul 是一个服务网格解决方案,提供具有服务发现、配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用来构建完整的服务网格。是一个分布式、高可用的系统。

 

Consul 的主要特点是:

 

服务发现:Consul 的客户端可以注册服务,例如 apior mysql,其他客户端可以使用 Consul 发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。

 

健康检查:Consul 客户端可以提供任意数量的健康检查,或者与给定服务相关联(“网络服务器是否返回 200 OK”),或者与本地节点相关联(“内存利用率是否低于 90%”)。操作员可以使用此信息来监控集群的健康状况,服务发现组件使用它来将流量从不健康的主机中路由出去。

 

KV 存储:应用程序可以将 Consul 的分层键/值存储用于任意数量的目的,包括动态配置、特征标记、协调、领导者选举等。简单的 HTTP API 使其易于使用。

 

安全服务通信:Consul 可以为服务生成和分发 TLS 证书以建立相互 TLS 连接。 意图 可用于定义允许通信的服务。可以通过可以实时更改的意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。

 

多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。

 

consul 下载

下载地址:Downloads | Consul by HashiCorp

根据自身系统环境,安装对应版本

 

consul 可视化管理

 

下载安装解压到指定目录:

 

 

运行-CMD->切换到解压目录 D:\tools\consul_1.12.1_windows_amd64

启动consul命令:consul agent -dev (其它命令参考https://www.consul.io/commands)

默认端口8500

 

 

运行成功,浏览器打开http://127.0.0.1:8500/

 

 

.net core 网关

1)新建项目

新建一个.net core web api项目来做网关,部署时候需要分布式部署来达到高可用,以免单台机宕机后造成损失。

 

 

2)nuget 添加包

<PackageReference Include="Ocelot" Version="16.0.1" />

<PackageReference Include="Ocelot.Provider.Consul" Version="16.0.1" />

<PackageReference Include="Consul" Version="1.6.10.5" />

<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />

这里我是.net core3.1 版本支持包。如果使用了.net5、.net6可以安装更高版本

 

3)ocelot 配置

新增ocelot 配置文件:OcelotSettings.json

配置内容:

{

  "Routes": [ //这里注意一下版本(旧版本用ReRoutes),官方文档ReRoutes全节点示例

    {

      //Upstream表示上游请求,即客户端请求到API Gateway的请求

      "UpstreamPathTemplate": "/test/{url}", //请求路径模板

      "UpstreamHttpMethod": [ "Get", "Post" ], //请求方法数组

 

      //Downstreamb表示下游请求,即API Gateway转发的目标服务地址

      "DownstreamPathTemplate": "/{url}", //下游请求地址模板

      "DownstreamScheme": "https", //请求协议,目前应该是支持http和https

 

      "LoadBalancerOptions": {

        "type": "RoundRobin" // 负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)

      },

 

      "UseServiceDiscovery": true, //使用服务发现,目前Ocelot只支持Consul的服务发现

      "ServiceName": "ConsulService" //consul服务名称

    },

    { //官方文档ReRoutes全节点示例

      //Upstream表示上游请求,即客户端请求到API Gateway的请求

      "UpstreamPathTemplate": "/hello/{url}", //请求路径模板

      "UpstreamHttpMethod": [ "Get", "Post" ], //请求方法数组

 

      //Downstreamb表示下游请求,即API Gateway转发的目标服务地址

      "DownstreamPathTemplate": "/{url}", //下游请求地址模板

      "DownstreamScheme": "https", //请求协议,目前应该是支持http和https

 

      "LoadBalancerOptions": {

        "type": "RoundRobin" // 负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)

      },

 

      "UseServiceDiscovery": true, //使用服务发现,目前Ocelot只支持Consul的服务发现

      "ServiceName": "HelloService" //consul服务名称

    }

  ],

  "GlobalConfiguration": {

    "BaseUrl": "https://localhost:5001", //网关对外地址

    "ServiceDiscoveryProvider": {

      "Host": "localhost",

      "Port": 8500,

      "Type": "Consul" //由Consul提供服务发现

    }

  }

}

 

注:这里Routes为了更好说明,配置了两个。正常我们配置一个则可,二级目录可以通过微服务api项目route指定 area。 这里通过配置指定test、hello 二级目录名称。

后面微服务api对配置项做说明

4)ocelot注入

 

 

 

 

这里要注意AddConfigStoredInConsul 这个扩展。加上这个ocelot这个配置内容将可以在consul界面查看管理(修改及时生效),可视化管理配置。

 

 

至此网关结束

 

.net core api

1)新建项目

新增ConsfulDemo、ConsulDemoTwo 两个.net core web api项目

两个项目分部添加一个HealthController控制做健康监测,方便区分返回不同值

 

 

 

  1. 添加一个consul通用注册静态类

这里为了更方便同一个微服务api指定多个端口访问。如果指定一个端口访问可以直接把相关值放配置文件

 

public static void ConsulReg(this IConfiguration configuration)

        {

            ConsulClient client = new ConsulClient(c =>

            {

                ///找到 Consul地址,默认地址

                c.Address = new Uri("http://127.0.0.1:8500/"); //放入配置文件

                c.Datacenter = "test_demo";

            });

            string ip = configuration["ip"] ?? "localhost"; //ip

            string group = configuration["group"] ?? "ConsulService"; //注册服务名称(组)(对应网关配置ServiceName)

            string tag = configuration["weight"]??"1"; //权重

            int port = int.Parse(configuration["port"]??"0"); //端口

            if (port == 0)

            {

                Console.WriteLine($"https://{ip}:{port}注册失败:请指定port,且不能重复");

                return;

            }

            client.Agent.ServiceRegister(new AgentServiceRegistration()

            {

                ///微服务唯一标识,唯一的

                ID = "service-" + port,

                Name = group,//服务名称(组)

                Address = ip,//ip地址

                Port = port,//端口

                ///标签参数,可以在注册的时候根据拿到tags标签来当权重,可以是属于地址参数上的tag

                ///注册服务时指定权重,分配时获取权重并以此为依据分配实例

                Tags = new string[] { tag },

 

                #region 配置心跳检查的

                Check = new AgentServiceCheck()

                {

                    ///心跳时间

                    Interval = TimeSpan.FromSeconds(10),

                    ///心跳地址

                    HTTP = $"https://{ip}:{port}/health/index",

                    ///超时时间

                    Timeout = TimeSpan.FromSeconds(5),

                    ///取消服务注册时间

                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5)

                }

                #endregion

 

            });

            Console.WriteLine($"https://{ip}:{port}完成注册");

        }

 

注:这里注意以上Name(对应网关配置的ServiceName) 、Tags 权重(调用的权重比重)

 

  1. 注入

两个项目分别注入

 

 

注入配置如果配置写死,运行两个微服务api项目,则服务自动注入到consul

 

这里通过命令形式,分别对两个微服务指定不同端口注册到consul

 

 

4)consul注册

 

运行->CMD 切换到项目目录  \bin\Debug\netcoreapp3.1>

执行命令:

dotnet ConsfulDemo.dll --urls="https://*:5010" --ip="localhost" --port=5010 --weight=1 

dotnet ConsfulDemo.dll --urls="https://*:5011" --ip="localhost" --port=5011 --weight=2

两个不同权重,不同端口

 

dotnet ConsulDemoTwo.dll --urls="https://*:5020" --ip="localhost" --port=5020 --weight=1 --group=HelloService

dotnet ConsulDemoTwo.dll --urls="https://*:5021" --ip="localhost" --port=5021 --weight=2

 

 

 

--group=HelloService  默认不配置会使用ConsulService 这个服务名称

 

 

回到consul管理界面 Service服务列表多了刚才注入的两个服务

 

 

 

 

浏览器访问网关地址:https://localhost:5001/test/health/index 不停刷新,会在ok111、ok222切换

 

我们单独服务HelloService 的配置:

 

 

 停掉5011端口,心跳检测马上显示异常

 

 

网关配置管理

 

 

可视化界面看网关配置,我们把ConsulService 服务的 请求路径地址模板改一下test 改成test1 保存,浏览器访问https://localhost:5001/test1/health/index

 

 .net core +ocelot+ consul 服务治理-pudn.com

 

 

 
posted @ 2022-11-26 09:22  岭南春  阅读(159)  评论(0)    收藏  举报