net core服务注入到consul,简单调用 电脑版发表于:2020/5/29 21:55 下雨又停电,听说下雨天奶茶和代码最配了,找个奶茶店写代码吧  在奶茶店看到有几个小妹妹耍王者好想和她们一起打两把,我jio得我应该可以带的动。。。。 <img src="https://img.tnblog.net/arcimg/aojiancc2/5cacbf79e64b4d449fdb9df76d618c9c.jpg" alt="love" style='max-width:429px' /> 废话就不说了,consul的安装请参考:https://www.tnblog.net/aojiancc2/article/details/3848 环境.net core3.0+consul1.7.3 [TOC] ####要把.net core的服务注入到consul其实也比较简单就那么几步 <br> #####一:下载consul依赖 方法一 ``` install-package Consul ``` 方法2:在需要项目的csproj中加入一句关于consul的PackageReference(vs2019可以直接点开很方便) ``` <ItemGroup> <PackageReference Include="Consul" Version="0.7.2.6" /> </ItemGroup> ``` #####二:添加consul配置 创建一个IApplicationBuilder扩展方法的类,方便添加 ``` public static class ConsulBuilderExtensions { public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app) { var consulClient = new ConsulClient(x => { // consul 服务地址(你要注册到哪个consul服务就填写哪个) x.Address = new Uri("http://127.0.0.1:8500"); }); var registration = new AgentServiceRegistration() { ID = Guid.NewGuid().ToString(), Name = "axj",// 服务名 Address = "127.0.0.1", // 服务绑定IP(也就是你这个项目运行的ip地址) Port = 9000, // 服务绑定端口(也就是你这个项目运行的端口) Check = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔 HTTP = "http://localhost:9000/Health/HealthCheck",//健康检查地址 Timeout = TimeSpan.FromSeconds(5) } }; // 服务注册 consulClient.Agent.ServiceRegister(registration).Wait(); // 应用程序终止时,服务取消注册 //lifetime.ApplicationStopping.Register(() => //{ // consulClient.Agent.ServiceDeregister(registration.ID).Wait(); //}); return app; } } ``` 这里其实就是配置一下你服务的地址以及consul服务的地址,还有就是健康检查,健康检查在这一步可以先不管。 这里的端口9000就是你当前这个项目运行的端口号,如果不知道可以直接运行这个项目的时候看地址栏就知道了,或者在Program中去配置一下即可  要注意配置了这个端口号要使用这种方式运行:  这种方式运行在控制台可以看到效果  如果用iis express方式运行的话就没有效果了。哈哈,不过这个也不影响服务的注入只是会影响服务的调用 然后在Configure中去调用一下创建好的扩展方法 ``` //注册consul服务 app.RegisterConsul(); ``` 就可以看到服务被成功注入了  当然由于健康检查还没有做,那个红色的叉叉意思就是健康检查失败了。如果健康检查失败他会在一定时间之内把那个服务去掉。 还有就是要注意,那个ConsulServer的地址也就是那个Consul服务的地址一定要写对,否则会报错,服务器积极拒绝 #####三:实现consul健康检查 先回家在写哟,把没有喝完的奶茶拿回去配个晚饭后买的绝味的鸭脑壳应该会比较不错。 继续继续,要做健康检查其实就是让你配置的那个健康检查地址可以被成功的访问。我们上面配置的健康检查的地址是:http://localhost:9000/Health/HealthCheck 我们创建一个Health的控制器与HealthCheck的action(当然这个是可以自己随意配置的) ``` public class HealthController : Controller { /// <summary> /// 把健康检查的地址简单实现一下 /// </summary> /// <returns></returns> public IActionResult HealthCheck() { return Ok(); } } ``` 然后我们就可以看到健康检查也是正确了  #####四:把consul的配置写入配置文件,方便维护 在appsettings.json中添加关于consul的配置 ``` { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", //Consul的配置 "Consul": { "ServiceName": "axj", "ServiceIP": "127.0.0.1", "ServicePort": 9000, "ServiceHealthCheck": "http://localhost:9000/Health/HealthCheck", "ConsulAddress": "http://127.0.0.1:8500" } } ``` 其实可以看到除了ConsulAddress外,其他命令都是Service开头的,也就是关于本服务的配置 然后创建一个对象用于在Startup中去读取配置文件,放到对象中 ``` /// <summary> /// Consul 注册发现相关参数 /// </summary> public class ConsulOption { /// <summary> /// 服务名称 /// </summary> public string ServiceName { get; set; } /// <summary> /// 服务IP /// </summary> public string ServiceIP { get; set; } /// <summary> /// 服务端口 /// </summary> public int ServicePort { get; set; } /// <summary> /// 服务健康检查地址 /// </summary> public string ServiceHealthCheck { get; set; } /// <summary> /// Consul 地址 /// </summary> public string ConsulAddress { get; set; } } ``` 在Startup中去读取配置文件,放到对象中 ``` //获取关于Consul的配置节点 var consulSection = Configuration.GetSection("Consul"); var consulOption = new ConsulOption { ServiceName = consulSection["ServiceName"], ServiceIP = consulSection["ServiceIP"], ServicePort = Convert.ToInt32(consulSection["ServicePort"]), ServiceHealthCheck = consulSection["ServiceHealthCheck"], ConsulAddress = consulSection["ConsulAddress"] }; //注册consul服务 app.RegisterConsul(consulOption); ``` 最后把扩展方法修改一下 ``` public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, ConsulOption consulOption) { var consulClient = new ConsulClient(x => { // consul 服务地址(你要注册到哪个consul服务就填写哪个) x.Address = new Uri(consulOption.ConsulAddress); }); var registration = new AgentServiceRegistration() { ID = Guid.NewGuid().ToString(), Name = consulOption.ServiceName,// 服务名 Address = consulOption.ServiceIP, // 服务绑定IP(也就是你这个项目运行的ip地址) Port = consulOption.ServicePort, // 服务绑定端口(也就是你这个项目运行的端口) Check = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔 HTTP = consulOption.ServiceHealthCheck,//健康检查地址 Timeout = TimeSpan.FromSeconds(5) } }; // 服务注册 consulClient.Agent.ServiceRegister(registration).Wait(); // 应用程序终止时,服务取消注册 //lifetime.ApplicationStopping.Register(() => //{ // consulClient.Agent.ServiceDeregister(registration.ID).Wait(); //}); return app; } ``` 搞定! #####五:通过consul简单的接口调用 这一步就要尝试通过consul调用一下接口了 那么就要先创建一个接口了,随便创建一个测试接口即可 ``` [Route("api/[controller]")] [ApiController] public class TestController : ControllerBase { // GET: api/Test [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET: api/Test/5 [HttpGet("{id}", Name = "Get")] public string Get(int id) { return "value"; } } ```  然后自己在当前项目调用一下即可 ``` public IActionResult Index() { string consulAddress = _configuration.GetSection("Consul")["ConsulAddress"].ToString(); using (var consulClient = new ConsulClient(a => a.Address = new Uri(consulAddress))) { var services = consulClient.Catalog.Service("axj").Result.Response; if (services != null && services.Any()) { // 模拟随机一台进行请求,这里只是测试,可以选择合适的负载均衡框架 Random r = new Random(); int index = r.Next(services.Count()); var service = services.ElementAt(index); using (HttpClient client = new HttpClient()) { var response = client.GetAsync($"http://{service.ServiceAddress}:{service.ServicePort}/api/Test/520").Result; string result = response.Content.ReadAsStringAsync().Result; ViewBag.msg = result; } } else { ViewBag.msg = "未找到服务"; } } return View(); } ``` 调用成功,结果如下:  #####六:最后贴一个demo的下载地址,需要的可以看一下 https://download.tnblog.net/resource/index/3b09102aec5441ce893bbad68208a7d9 下期预告:使用consul做一个简单的服务集群