Esempio n. 1
0
        private void ListMethods(FileDescriptorResponse resp, InfoRS infoRs)
        {
            byte[] bytes = new byte[resp.FileDescriptorProto.First().Length];
            resp.FileDescriptorProto.First().CopyTo(bytes, 0);
            var fdp = ProtobufExtensions.Deserialize <FileDescriptorProto>(bytes);

            foreach (var service in fdp.Services)
            {
                foreach (var method in service.Methods)
                {
                    var name = $"{fdp.Package}.{service.Name}/{method.Name}";
                    infoRs.MethodInfos.Add(new MethodInfo()
                    {
                        Name = name
                    });
                    var inputTypeName  = method.InputType.Split('.').Last();
                    var outputTypeName = method.OutputType.Split('.').Last();
                    var intputType     = fdp.MessageTypes.First(p => p.Name == inputTypeName);
                    var outputType     = fdp.MessageTypes.First(p => p.Name == outputTypeName);
                    var infoMethodRS   = new MethodInfoRS()
                    {
                        RequestJson  = intputType.Fields.ToDictionary(p => p.Name, p => GetFiledDefaultValue(p, fdp.MessageTypes)).ToJson(),
                        ResponseJson = outputType.Fields.ToDictionary(p => p.Name, p => GetFiledDefaultValue(p, fdp.MessageTypes)).ToJson()
                    };
                    dicInfoMethods.AddOrUpdate(name, infoMethodRS, (k, v) => infoMethodRS);
                }
            }
        }
Esempio n. 2
0
        public async Task <IActionResult> OnGet(string serviceName, string serverAddress = null)
        {
            ServiceName        = serviceName?.Trim();
            CurrentAddressInfo = serverAddress?.Trim();
            AddressInfos       = new List <string> {
                CurrentAddressInfo
            };

            if (string.IsNullOrWhiteSpace(ServiceName) && string.IsNullOrWhiteSpace(CurrentAddressInfo))
            {
                return(RedirectToPage("Error", new { msg = "请指定consul服务名称或Grpc服务地址" }));
            }

            if (!string.IsNullOrWhiteSpace(serverAddress))
            {
                var arr  = serverAddress.Split(':', System.StringSplitOptions.RemoveEmptyEntries);
                var ip   = arr[0];
                var port = int.Parse(arr[1]);

                Info = await _grpcSrv.GetInfo(ip, port);
            }
            else
            {
                var service = await _consulSrv.GetService(ServiceName);

                if (service == null || service.Count == 0)
                {
                    return(RedirectToPage("Error", new { msg = $"consul中找不到服务{ServiceName}" }));
                }
                AddressInfos = service.Select(q => $"{q.Address}:{q.Port}").Distinct().ToList();
                var ip   = service.First().Address;
                var port = service.First().Port;
                CurrentAddressInfo = $"{ip}:{port}";

                Info = await _grpcSrv.GetInfo(ip, port);
            }

            if (Info == null)
            {
                return(RedirectToPage("Error", new { msg = $"consul服务({ServiceName})未集成FM.GrpcExtensions" }));
            }
            return(Page());
        }
Esempio n. 3
0
        public async Task <InfoRS> GetInfo(string address, int port)
        {
            var result  = new InfoRS();
            var channel = new Channel(address, port, ChannelCredentials.Insecure);

            try
            {
                var client = new ServerReflection.ServerReflectionClient(channel);
                var resp   = client.ServerReflectionInfo();
                await resp.RequestStream.WriteAsync(new ServerReflectionRequest()
                {
                    ListServices = ""
                });

                await resp.ResponseStream.ForEachAsync(async res =>
                {
                    switch (res.MessageResponseCase.ToString())
                    {
                    case "ListServicesResponse":
                        await ListServices(resp.RequestStream, res.ListServicesResponse);
                        break;

                    case "FileDescriptorResponse":
                        ListMethods(res.FileDescriptorResponse, result);
                        break;
                    }
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                throw ex;
            }
            finally
            {
                await channel.ShutdownAsync();
            }
            return(result);
        }