笔者是windows下面开发的(也能够使用Docker)。
官网下载windows的Consuljson
https://www.consul.io/windows
使用cmd窗口打开,输入consul agent -dev
访问默认127.0.0.1:8500就能够看到界面化的Consulapi
接着上一篇app
using Consul; using Grpc.Core; using GRPCServer.Entity; using MagicOnion.Server; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; namespace GRPCServer { public class Startup { public Startup(IConfiguration configuration) { this.Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); MagicOnionServiceDefinition service = MagicOnionEngine.BuildServerServiceDefinition(new MagicOnionOptions(true) { MagicOnionLogger = new MagicOnionLogToGrpcLogger() }); Server server = new Server { Services = { service }, Ports = { new ServerPort(this.Configuration["Service:LocalIPAddress"], Convert.ToInt32(this.Configuration["Service:Port"]), ServerCredentials.Insecure) } }; server.Start(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); ServiceEntity serviceEntity = new ServiceEntity { IP = this.Configuration["Service:LocalIPAddress"], Port = Convert.ToInt32(this.Configuration["Service:Port"]), ServiceName = this.Configuration["Service:Name"], ConsulIP = this.Configuration["Consul:IP"], ConsulPort = Convert.ToInt32(this.Configuration["Consul:Port"]) }; 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 = this.Configuration["Service:Examination"],//健康检查地址 Timeout = TimeSpan.FromSeconds(5) }; var 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();//服务中止时取消注册 }); } } }
appsettings.jsonasync
{ "Service": { "Name": "Test3", "Port": "8083", "LocalIPAddress": "192.168.1.8", "Examination": "http://192.168.1.8:5000/api/Values" }, "Consul": { "IP": "127.0.0.1", "Port": "8500" } }
using Consul; using Grpc.Core; using MagicOnion.Client; using ServerDefinition; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; var aaa= AvaliableServices("Test3","").Result; public static async Task<ServiceEntry[]> AvaliableServices(string name, string tags) { var services = new List<ServiceEntry>(); using (var client = new ConsulClient()) { foreach (var tag in tags.Split(',')) { var result = await client.Health.Service(name, !string.IsNullOrEmpty(tag) ? tag : null, true).ConfigureAwait(false); foreach (var item in result.Response) { if (!services.Any(service => service.Node.Address == item.Node.Address && service.Service.Port == item.Service.Port)) { services.Add(item); } } } //交集处理,仅取出彻底匹配服务 foreach (var tag in tags.Split(',')) { if (string.IsNullOrEmpty(tag)) { continue; } var alsorans = services.Where(service => !service.Service.Tags.Contains(tag)).ToList(); foreach (var alsoran in alsorans) { services.Remove(alsoran); } } } return services.ToArray(); }
这个时候我就能经过'Test3'来得到Test3的服务和接口。微服务
可是我是使用的MagicOnion,仍是没办法拿到我定义的方法SumAsyncui
怎么办?this
1.引用ITest (让微服务之间有引用,不太好)url
2.使用网关spa
下一篇我会想法办法使他们能相互通信(其实我还不知道怎么搞)