记一次使用Consul进行服务注册和服务发现

摘要:
服务注册与发现因为Consul对.netcore的支撑和对Ocelot的高度兼容性,所以,.netcore使用的服务注册与发现的组件大多数使用的Consul。用于对外提供服务。首先,还是先安装Consul组件。然后创建一个IConsulTestAppService,并用ConsulTestAppService实现它。publicclassConsulTestAppService:IConsulTestAppService{privatereadonlyIConfiguration_configuration;publicConsulTestAppService{_configuration=configuration;}publicasyncTaskGetAsync(){varconsulClient=newConsulClient;varservices=consulClient.Health.Service.Result.Response;//健康的服务string[]serviceUrls=services.Select.ToArray();//订单服务地址列表if(!访问服务,TestService已经正常响应数据。
服务注册与发现

因为Consul对.net core的支撑和对Ocelot的高度兼容性,所以,.net core使用的服务注册与发现的组件大多数使用的Consul。

首先。我有一个测试服务A。这个服务会进行服务注册。用于对外提供服务。

服务A :

首先,Nuget安装Consul

记一次使用Consul进行服务注册和服务发现第1张

添加一个扩展类ConsulExtensions

public static class ConsulExtensions
    {
        public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IConfiguration configuration)//, IHostApplicationLifetime lifetime)
        {
            var consulClient = new ConsulClient(c =>
            {
                c.Address = new Uri(configuration["ConsulSetting:ConsulAddress"]);
            });

            var registration = new AgentServiceRegistration()
            {
                ID = Guid.NewGuid().ToString(),//服务实例唯一标识
                Name = configuration["ConsulSetting:ServiceName"],//服务名
                Address = configuration["ConsulSetting:ServiceIP"], //服务IP
                Port = int.Parse(configuration["ConsulSetting:ServicePort"]),//服务端口 因为要运行多个实例,端口不能在appsettings.json里配置,在docker容器运行时传入
                Check = new AgentServiceCheck()
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔
                    HTTP = $"http://{configuration["ConsulSetting:ServiceIP"]}:{configuration["ConsulSetting:ServicePort"]}{configuration["ConsulSetting:ServiceHealthCheck"]}",//健康检查地址
                    Timeout = TimeSpan.FromSeconds(5)//超时时间
                }
            };

            //服务注册
            consulClient.Agent.ServiceRegister(registration).Wait();

            ////应用程序终止时,手动取消注册
            //lifetime.ApplicationStopping.Register(() =>
            //{
            //    consulClient.Agent.ServiceDeregister(registration.ID).Wait();
            //});

            return app;
        }
    }

在Starup里面注册Consul服务

app.RegisterConsul(context.GetConfiguration());

在appsettings.json里面添加配置

"ConsulSetting": {
    "ServiceName": "TestService",
    "ServiceIP": "localhost",
    "ServiceHealthCheck": "/healthcheck",
    "ServicePort": "5000",
    "ConsulAddress": "http://localhost:8500"}

启动服务,在Consul里面就能看见这个服务已经注册进去了

记一次使用Consul进行服务注册和服务发现第2张

现在再开始进入测试服务B,这个服务用于服务发现,并调用测试服务A的接口。

首先,还是先安装Consul组件。然后创建一个IConsulTestAppService,并用ConsulTestAppService实现它。

public classConsulTestAppService : IConsulTestAppService
    {
        private readonlyIConfiguration _configuration;
        publicConsulTestAppService(IConfiguration configuration)
        {
            _configuration =configuration;
        }
        public async Task<string>GetAsync()
        {
            var consulClient = new ConsulClient(c =>{
                //consul地址
                c.Address = new Uri(_configuration["ConsulSetting:ConsulAddress"]);
            });

            var services = consulClient.Health.Service("TestService", null, true, null).Result.Response;//健康的服务

            string[] serviceUrls = services.Select(p => $"http://{p.Service.Address + ":"+ p.Service.Port}").ToArray();//订单服务地址列表

            if (!serviceUrls.Any())
            {
                return await Task.FromResult("【TestService】服务列表为空");
            }

            //每次随机访问一个服务实例
            var Client = new RestClient(serviceUrls[new Random().Next(0, serviceUrls.Length)]);
            var request = new RestRequest("/api/test/GetOne", Method.GET);

            var response = awaitClient.ExecuteAsync(request);
            returnresponse.Content;
        }
    }

我这里使用RestSharp来进行Http请求。

访问服务,TestService已经正常响应数据。

记一次使用Consul进行服务注册和服务发现第3张

免责声明:文章转载自《记一次使用Consul进行服务注册和服务发现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端团队成长计划(一):基础知识梳理微信开发者工具最新版本的调试器中不显示AppData和Storage选项问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python web前端 06 运算符 循环

Python web前端 06 运算符 循环 一、运算符 #JS六大数据类型 #number 数字 #string 字符串 #boolean 布尔型 #function 函数 #undefined 未定义:一个变量声明之后没有复制就是未定义 #object 对象 在JS里面null属于对象类型,但是它不具有很多对象的共性,所以很多资料将他归为单...

让requestAnimationFrame实现定时调用功能

原理 创建函数call和render call----->setTimeout----->render----->requestAnimationFrame----->call 实施 webgl渲染点,每秒重新渲染一次 效果 源码 <!DOCTYPE html> <html lang="en"> <...

js获取本月,本季度,上个季度,本周,上周的起始和结束时间

1 /* 获得某月的天数 */ 2 function getMonthDays(myMonth) { 3 var nowYear = new Date().getFullYear(); //当前年 4 var monthStartDate = new Date(nowYear, myMonth, 1)...

数据加密之SymmetricAlgorithm加密

1 #region SymmetricAlgorithm加密 2 /// <summary> 3 /// 按指定对称算法、键和向量加密字符串 4 /// </summary> 5 public static byte[] Encrypt(...

Kerberos 简单安装配置

Kerberos 简单安装配置 标签(空格分隔): Kerberos 一,Kerberos简史 Kerberos是一种网络安全认证协议,最早由麻省理工研发,用来保护项目 Athena提供的网络服务器。这个协议以希腊神话中的人物Kerberos(或者Cerberus)命名,他在希腊神话中是Hades的一条凶猛的三头保卫神犬。 kerberos Intern...

JQuery window.opener

$('#Save').click(function () {var parent = $(parent.document.body);$(parent).find('input#addr_address1').val(addone);$(parent).find('input#addr_address2').val(addtwo);$(parent).fi...