public static IServiceHostServerBuilder UseConsulCheckHealth(this IServiceHostServerBuilder serviceHostBuilder, RegisterServer registerServer) { serviceHostBuilder.RegisterService(containerBuilder => { List <NamedParameter> ListNamedParameter = new List <NamedParameter>() { new NamedParameter("registerServer", registerServer), new NamedParameter("address", serviceHostBuilder.Address), }; containerBuilder.RegisterType <ConsulDiscovery>().As <IServiceDiscovery>().As <IHealthCheck>().WithParameters(ListNamedParameter).SingleInstance(); }); serviceHostBuilder.AddInitializer(container => { while (!container.IsRegistered <IServer>()) { //default(SpinWait).SpinOnce(); Thread.Sleep(200); } ILogger logger = container.Resolve <ILogger>(); logger.Info($"[config]use consul for services discovery, consul ip: {registerServer.Ip}:{registerServer.Port}"); IServer server = container.Resolve <IServer>(); List <ServiceRoute> routes = server.GetServiceRoutes(); logger.Debug("running consul found routes count: " + routes.Count); try { IServiceDiscovery discovery = container.Resolve <IServiceDiscovery>(); discovery.ClearAsync().Wait(); discovery.SetRoutesAsync(routes).Wait(); } catch (Exception ex) { logger.Error($"error occurred while connecting with consul, ensure consul is running.\r\n", ex); } }); serviceHostBuilder.AddRunner(container => { IServer server = container.Resolve <IServer>(); IHealthCheck check = container.Resolve <IHealthCheck>(); check.RunAsync(); }); return(serviceHostBuilder); }
public static IServiceHostServerBuilder UseHttpForTransfer(this IServiceHostServerBuilder serviceHostBuilder, string ip, int port, Action <IServer> action = null, Action <IWebHostBuilder> builderAction = null) { serviceHostBuilder.RegisterService(containerBuilder => { containerBuilder.RegisterType <HttpServer>().As <IServer>().WithParameter("ip", ip).WithParameter("port", port).WithParameter("builderAction", builderAction).SingleInstance(); }); serviceHostBuilder.AddRunner(container => { var logger = container.Resolve <ILogger>(); logger.Info($"[config]use http for transfer"); var server = container.Resolve <IServer>(); var routes = server.GetServiceRoutes(); server.StartAsync(); action?.Invoke(server); }); return(serviceHostBuilder); }
public static IServiceHostServerBuilder UseJwtForOAuth(this IServiceHostServerBuilder serviceHostBuilder, JwtAuthorizationOptions options) { serviceHostBuilder.AddRunner(container => { ILogger logger = container.Resolve <ILogger>(); logger.Info($"[config]use jwt for OAuth"); while (!container.IsRegistered <IServer>() || !container.IsRegistered <IServiceDiscovery>()) { Thread.Sleep(200); } IServer server = container.Resolve <IServer>(); ISerializer serializer = container.Resolve <ISerializer>(); server.UseMiddleware <JwtAuthorizationMiddleware>(options, serializer); if (string.IsNullOrEmpty(options.TokenEndpointPath)) { return; } if (options.ServerIp == "localhost" || options.ServerIp == "127.0.0.1") { IServiceDiscovery discovery = container.Resolve <IServiceDiscovery>(); ServerAddress addr = new ServerAddress(options.ServerIp, options.ServerPort); List <ServiceRoute> tokenRoute = new List <ServiceRoute> { new ServiceRoute { Address = new List <ServerAddress> { addr }, ServiceDescriptor = new ServiceDesc { Id = options.TokenEndpointPath.TrimStart('/'), RoutePath = options.TokenEndpointPath, HttpMethod = "Post", Parameters = serializer.Serialize <string>(new List <ServiceParameterDesc> { new ServiceParameterDesc { Comment = "username", Format = "System.String", Name = "username", Type = "object" }, new ServiceParameterDesc { Comment = "password", Format = "System.String", Name = "password", Type = "object" }, }), ReturnDesc = serializer.Serialize <string>(new ServiceReturnDesc { Comment = "Token", ReturnType = "object", ReturnFormat = "{\"access_token\":\"System.String | token\", \"expired_in\":\"System.Int32 | expired timestamp which is the number of seconds between 1970-01-01 and expired datetime\"}" }) } } }; discovery.ClearServiceAsync(tokenRoute.First().ServiceDescriptor.Id).Wait(); //discovery.SetRoutesAsync(tokenRoute); discovery.AddRouteAsync(tokenRoute).Wait(); } }); return(serviceHostBuilder); }