コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }