falcon 0.56.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/context/cluster-deployment.md +36 -30
- data/context/getting-started.md +17 -0
- data/context/index.yaml +2 -1
- data/lib/falcon/command/serve.rb +4 -4
- data/lib/falcon/environment/rackup.rb +1 -1
- data/lib/falcon/environment/serve.rb +73 -0
- data/lib/falcon/server.rb +18 -5
- data/lib/falcon/version.rb +1 -1
- data/readme.md +6 -5
- data/releases.md +10 -0
- data.tar.gz.sig +0 -0
- metadata +2 -1
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4d899d227cc38f6f4b766bfcef947ec0bd7a2a1396e695e96454ed707395e6eb
|
|
4
|
+
data.tar.gz: b72457b92c692a02e23be49d05734cda178c86bf5f983c2f2dd1b8f9788de40a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 99243d8b4f61bc2280b502e664c291184c36968b8783048587ec9e1ea38f7e659b261262b73f3839873c145f7c772c849e404db0482a401be8af1bba84a9ab74
|
|
7
|
+
data.tar.gz: dcc6b26e79a764d8c522713b2b61cc1ff9d4c981a03955a0e0743a5761fa1f11b77b11b456eb0167486d32d9f0929a91afd40fbea0791286b232e02e8895464b
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Dynamic Clusters with Envoy
|
|
2
2
|
|
|
3
|
-
This guide explains how to run Falcon workers with independently bound endpoints
|
|
3
|
+
This guide explains how to run Falcon workers with independently bound endpoints, publish them dynamically using xDS, and balance requests according to their current load using ORCA.
|
|
4
4
|
|
|
5
5
|
## When to Use a Cluster
|
|
6
6
|
|
|
@@ -17,7 +17,9 @@ A regular {ruby Falcon::Service::Server} binds one listener and shares it with e
|
|
|
17
17
|
|
|
18
18
|
Each cluster worker can bind to `localhost` with port `0`, allowing the operating system to assign an available port. Falcon describes the bound resource with a {ruby Falcon::Listener}, including its name, scheme, supported protocols, and concrete addresses.
|
|
19
19
|
|
|
20
|
-
The worker registers that listener with `async-service-supervisor-envoy`. The supervisor publishes the current workers through an xDS control plane
|
|
20
|
+
The worker registers that listener with `async-service-supervisor-envoy`. The supervisor publishes the current workers and load-balancing policy through an xDS control plane. Envoy uses Cluster Discovery Service (CDS) and Endpoint Discovery Service (EDS) updates to maintain the upstream cluster.
|
|
21
|
+
|
|
22
|
+
The supervisor also samples each worker's CPU utilization and request counter. It exposes those measurements using out-of-band Open Request Cost Aggregation (ORCA), which lets Envoy's client-side weighted-round-robin policy direct more requests to workers with more available capacity. This avoids coupling connection acceptance to a process-local token limiter while still responding to CPU-heavy work.
|
|
21
23
|
|
|
22
24
|
Requests arrive at Envoy's stable listener. Envoy selects one of the discovered worker endpoints and forwards the request to it:
|
|
23
25
|
|
|
@@ -29,14 +31,15 @@ flowchart LR
|
|
|
29
31
|
Envoy[Envoy]
|
|
30
32
|
|
|
31
33
|
subgraph Falcon[Falcon container]
|
|
32
|
-
Supervisor[Supervisor
|
|
34
|
+
Supervisor[Supervisor, xDS, and ORCA]
|
|
33
35
|
Worker1[Falcon worker 1]
|
|
34
36
|
Worker2[Falcon worker 2]
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
Worker1 -.->|Register endpoint| Supervisor
|
|
38
40
|
Worker2 -.->|Register endpoint| Supervisor
|
|
39
|
-
Supervisor -.->|
|
|
41
|
+
Supervisor -.->|Dedicated CDS and EDS streams| Envoy
|
|
42
|
+
Supervisor -.->|Per-worker ORCA reports| Envoy
|
|
40
43
|
Envoy -->|HTTP on dynamic port| Worker1
|
|
41
44
|
Envoy -->|HTTP on dynamic port| Worker2
|
|
42
45
|
end
|
|
@@ -48,7 +51,7 @@ Add Falcon and the Envoy supervisor integration to your `gems.rb`:
|
|
|
48
51
|
|
|
49
52
|
```ruby
|
|
50
53
|
gem "falcon", "~> 0.56.0"
|
|
51
|
-
gem "async-service-supervisor-envoy", "~> 0.
|
|
54
|
+
gem "async-service-supervisor-envoy", "~> 0.5"
|
|
52
55
|
```
|
|
53
56
|
|
|
54
57
|
Define a Falcon cluster service and an accompanying supervisor in `falcon.rb`:
|
|
@@ -81,7 +84,7 @@ service "cluster" do
|
|
|
81
84
|
}, [body]]
|
|
82
85
|
end
|
|
83
86
|
|
|
84
|
-
Falcon::Server.
|
|
87
|
+
Falcon::Server.rack_middleware(application, cache: false)
|
|
85
88
|
end
|
|
86
89
|
end
|
|
87
90
|
|
|
@@ -89,16 +92,21 @@ service "supervisor" do
|
|
|
89
92
|
include Async::Service::Supervisor::Environment
|
|
90
93
|
|
|
91
94
|
monitors do
|
|
95
|
+
utilization_monitor = Async::Service::Supervisor::UtilizationMonitor.new
|
|
96
|
+
|
|
92
97
|
[
|
|
98
|
+
utilization_monitor,
|
|
93
99
|
Async::Service::Supervisor::Envoy::Monitor.new(
|
|
94
|
-
bind: "http://
|
|
100
|
+
bind: "http://[::]:18000",
|
|
101
|
+
orca: true,
|
|
102
|
+
utilization_monitor: utilization_monitor,
|
|
95
103
|
),
|
|
96
104
|
]
|
|
97
105
|
end
|
|
98
106
|
end
|
|
99
107
|
```
|
|
100
108
|
|
|
101
|
-
The Falcon service name becomes the listener name, so the corresponding Envoy
|
|
109
|
+
The Falcon service name becomes the listener name, so the corresponding Envoy cluster uses `cluster` as its service name. Configure Envoy to receive cluster and endpoint updates from the supervisor:
|
|
102
110
|
|
|
103
111
|
```yaml
|
|
104
112
|
node:
|
|
@@ -106,12 +114,14 @@ node:
|
|
|
106
114
|
cluster: falcon-cluster
|
|
107
115
|
|
|
108
116
|
dynamic_resources:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
cds_config:
|
|
118
|
+
resource_api_version: V3
|
|
119
|
+
api_config_source:
|
|
120
|
+
api_type: GRPC
|
|
121
|
+
transport_api_version: V3
|
|
122
|
+
grpc_services:
|
|
123
|
+
- envoy_grpc:
|
|
124
|
+
cluster_name: xds_cluster
|
|
115
125
|
|
|
116
126
|
static_resources:
|
|
117
127
|
listeners:
|
|
@@ -128,6 +138,7 @@ static_resources:
|
|
|
128
138
|
stat_prefix: ingress_http
|
|
129
139
|
route_config:
|
|
130
140
|
name: local_route
|
|
141
|
+
validate_clusters: false
|
|
131
142
|
virtual_hosts:
|
|
132
143
|
- name: falcon
|
|
133
144
|
domains: ["*"]
|
|
@@ -142,16 +153,6 @@ static_resources:
|
|
|
142
153
|
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
|
|
143
154
|
|
|
144
155
|
clusters:
|
|
145
|
-
- name: cluster
|
|
146
|
-
connect_timeout: 1s
|
|
147
|
-
type: EDS
|
|
148
|
-
lb_policy: ROUND_ROBIN
|
|
149
|
-
eds_cluster_config:
|
|
150
|
-
service_name: cluster
|
|
151
|
-
eds_config:
|
|
152
|
-
ads: {}
|
|
153
|
-
resource_api_version: V3
|
|
154
|
-
|
|
155
156
|
- name: xds_cluster
|
|
156
157
|
connect_timeout: 1s
|
|
157
158
|
type: STATIC
|
|
@@ -162,7 +163,7 @@ static_resources:
|
|
|
162
163
|
- endpoint:
|
|
163
164
|
address:
|
|
164
165
|
socket_address:
|
|
165
|
-
address:
|
|
166
|
+
address: "::1"
|
|
166
167
|
port_value: 18000
|
|
167
168
|
typed_extension_protocol_options:
|
|
168
169
|
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
|
|
@@ -171,7 +172,7 @@ static_resources:
|
|
|
171
172
|
http2_protocol_options: {}
|
|
172
173
|
```
|
|
173
174
|
|
|
174
|
-
The `xds_cluster` connection uses HTTP/2 because
|
|
175
|
+
The `xds_cluster` connection uses HTTP/2 because CDS and EDS are served over gRPC. The supervisor serves dedicated CDS and EDS streams together with ORCA on port `18000`; Envoy uses that as an alternative to each worker's HTTP port when opening ORCA streams. Envoy 1.39 or later is required for this alternative reporting-port configuration.
|
|
175
176
|
|
|
176
177
|
## Worker Registration
|
|
177
178
|
|
|
@@ -179,19 +180,24 @@ When each worker starts:
|
|
|
179
180
|
|
|
180
181
|
1. Falcon binds the worker to an available loopback port.
|
|
181
182
|
2. The worker registers its concrete addresses and supported protocols with the supervisor.
|
|
182
|
-
3. The supervisor's Envoy monitor publishes the current worker endpoints as
|
|
183
|
-
4. Envoy receives the
|
|
183
|
+
3. The supervisor's Envoy monitor publishes the cluster policy and current worker endpoints as CDS and EDS resources.
|
|
184
|
+
4. Envoy receives the resources over dedicated CDS and EDS streams and updates its upstream cluster.
|
|
185
|
+
5. The supervisor samples worker CPU time and request totals, then streams the current load reports to Envoy using ORCA.
|
|
186
|
+
|
|
187
|
+
The first processor and request samples establish baselines. Load-aware weights become available after the next sampling interval. If a report is temporarily unavailable, Envoy retains its normal policy fallback rather than making the worker unreachable.
|
|
184
188
|
|
|
185
189
|
The listener preserves all addresses returned by the bound endpoint. This allows the same interface to describe IP sockets, Unix-domain sockets, and endpoints with additional addresses.
|
|
186
190
|
|
|
187
191
|
## Worker Restarts
|
|
188
192
|
|
|
189
|
-
If a worker exits, its supervisor connection closes and the monitor
|
|
193
|
+
If a worker exits, its supervisor connection closes and the monitor removes both its endpoint and ORCA report. Falcon restarts the worker, which binds a new available port and registers it. The monitor then publishes another update, and Envoy receives both changes over its existing EDS stream without polling or restarting.
|
|
190
194
|
|
|
191
195
|
This lifecycle is important when ports are ephemeral or a directory may contain stale Unix-domain socket paths: consumers should use the supervisor's current endpoint state as the source of truth.
|
|
192
196
|
|
|
193
197
|
## Network Topology
|
|
194
198
|
|
|
195
|
-
Falcon and Envoy can run in the same network namespace, allowing workers to bind to loopback addresses while remaining reachable by Envoy. With Docker Compose, `network_mode: service:falcon` gives the Envoy service access to Falcon's network namespace, so
|
|
199
|
+
Falcon and Envoy can run in the same network namespace, allowing workers to bind to loopback addresses while remaining reachable by Envoy. With Docker Compose, `network_mode: service:falcon` gives the Envoy service access to Falcon's network namespace, so loopback addresses refer to the same interface for both processes.
|
|
200
|
+
|
|
201
|
+
The configuration binds the supervisor endpoint to the IPv6 wildcard address because `localhost` worker endpoints use IPv6 in the container. Envoy connects to CDS and EDS through `::1`; for each ORCA stream it uses the worker's address with the configured supervisor port `18000`. The supervisor listener must therefore be reachable using the same address family as every published worker endpoint.
|
|
196
202
|
|
|
197
203
|
Without a shared network namespace, Envoy cannot connect to worker endpoints bound to Falcon's loopback interface. In a different deployment topology, bind workers to an interface that Envoy can reach and apply the appropriate network access controls.
|
data/context/getting-started.md
CHANGED
|
@@ -44,6 +44,23 @@ Then run the application with:
|
|
|
44
44
|
$ falcon serve
|
|
45
45
|
~~~
|
|
46
46
|
|
|
47
|
+
#### Rack Applications Defined in Ruby Files
|
|
48
|
+
|
|
49
|
+
Rack can load a Ruby file directly and infer the application constant from its filename. For example, `Rack::Builder.parse_file("app.rb")` requires the file and uses `::App` as the Rack application.
|
|
50
|
+
|
|
51
|
+
Falcon reserves `.rb` serve configurations for protocol HTTP middleware. Existing Rack applications can be exposed through `config/serve.rb` using {ruby Protocol::Rack::Adapter}:
|
|
52
|
+
|
|
53
|
+
~~~ ruby
|
|
54
|
+
# config/serve.rb
|
|
55
|
+
|
|
56
|
+
require "protocol/rack"
|
|
57
|
+
require_relative "../app"
|
|
58
|
+
|
|
59
|
+
run Protocol::Rack::Adapter.new(App)
|
|
60
|
+
~~~
|
|
61
|
+
|
|
62
|
+
Running `falcon serve` loads `config/serve.rb` as protocol HTTP middleware, while the adapter translates requests and responses for the existing Rack application. This replaces the older `falcon serve --config app.rb` convention without requiring changes to `App` itself.
|
|
63
|
+
|
|
47
64
|
## Running a Local Server
|
|
48
65
|
|
|
49
66
|
For local application development, you can use the `falcon serve` command. This will start a local server on `https://localhost:9292`. Falcon generates self-signed certificates for `localhost`. This allows you to test your application with HTTPS locally.
|
data/context/index.yaml
CHANGED
|
@@ -21,7 +21,8 @@ files:
|
|
|
21
21
|
- path: cluster-deployment.md
|
|
22
22
|
title: Dynamic Clusters with Envoy
|
|
23
23
|
description: This guide explains how to run Falcon workers with independently bound
|
|
24
|
-
endpoints
|
|
24
|
+
endpoints, publish them dynamically using xDS, and balance requests according
|
|
25
|
+
to their current load using ORCA.
|
|
25
26
|
- path: performance-tuning.md
|
|
26
27
|
title: Performance Tuning
|
|
27
28
|
description: This guide explains the performance characteristics of Falcon.
|
data/lib/falcon/command/serve.rb
CHANGED
|
@@ -8,7 +8,7 @@ require_relative "../server"
|
|
|
8
8
|
require_relative "../endpoint"
|
|
9
9
|
require_relative "../service/server"
|
|
10
10
|
require_relative "../environment/server"
|
|
11
|
-
require_relative "../environment/
|
|
11
|
+
require_relative "../environment/serve"
|
|
12
12
|
|
|
13
13
|
require "async/service/configuration"
|
|
14
14
|
require "async/container"
|
|
@@ -32,7 +32,7 @@ module Falcon
|
|
|
32
32
|
option "-h/--hostname <hostname>", "Specify the hostname which would be used for certificates, etc."
|
|
33
33
|
option "-t/--timeout <duration>", "Specify the maximum time to wait for non-blocking operations.", type: Float, default: nil
|
|
34
34
|
|
|
35
|
-
option "-c/--config <path>", "
|
|
35
|
+
option "-c/--config <path>", "Application configuration file to load."
|
|
36
36
|
option "--preload <path>", "Preload the specified path before creating containers."
|
|
37
37
|
|
|
38
38
|
option "--cache", "Enable the response cache."
|
|
@@ -72,7 +72,7 @@ module Falcon
|
|
|
72
72
|
# @returns [Async::Service::Environment] The configured server environment.
|
|
73
73
|
def environment
|
|
74
74
|
Async::Service::Environment.new(Falcon::Environment::Server).with(
|
|
75
|
-
Falcon::Environment::
|
|
75
|
+
Falcon::Environment::Serve,
|
|
76
76
|
root: Dir.pwd,
|
|
77
77
|
|
|
78
78
|
verbose: self.parent&.verbose?,
|
|
@@ -81,7 +81,7 @@ module Falcon
|
|
|
81
81
|
container_options: self.container_options,
|
|
82
82
|
endpoint_options: self.endpoint_options,
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
configuration_path: @options[:config],
|
|
85
85
|
preload: [@options[:preload]].compact,
|
|
86
86
|
url: @options[:bind],
|
|
87
87
|
|
|
@@ -25,7 +25,7 @@ module Falcon
|
|
|
25
25
|
# Build the middleware stack for the rack application.
|
|
26
26
|
# @returns [Protocol::HTTP::Middleware] The middleware stack.
|
|
27
27
|
def middleware
|
|
28
|
-
::Falcon::Server.
|
|
28
|
+
::Falcon::Server.rack_middleware(rack_app, verbose: verbose, cache: cache)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Released under the MIT License.
|
|
4
|
+
# Copyright, 2026, by Samuel Williams.
|
|
5
|
+
|
|
6
|
+
require "protocol/http/middleware/builder"
|
|
7
|
+
require "protocol/rack"
|
|
8
|
+
|
|
9
|
+
require_relative "../server"
|
|
10
|
+
|
|
11
|
+
module Falcon
|
|
12
|
+
module Environment
|
|
13
|
+
# Provides application configuration discovery and loading for `falcon serve`.
|
|
14
|
+
#
|
|
15
|
+
# When {#configuration_path} is `nil`, {#resolved_configuration_path} looks for
|
|
16
|
+
# `config/serve.rb` first and falls back to `config.ru`. An explicit
|
|
17
|
+
# {#configuration_path} bypasses this discovery order.
|
|
18
|
+
#
|
|
19
|
+
# The file extension selects the application interface:
|
|
20
|
+
#
|
|
21
|
+
# - `.rb` files are evaluated by {Protocol::HTTP::Middleware.load} using the
|
|
22
|
+
# protocol HTTP middleware builder interface.
|
|
23
|
+
# - `.ru` files are parsed as Rack applications and wrapped with
|
|
24
|
+
# {Protocol::Rack::Adapter}.
|
|
25
|
+
#
|
|
26
|
+
# Both application interfaces respond to `call`, so the configuration file
|
|
27
|
+
# extension is the explicit contract rather than inspecting the loaded object.
|
|
28
|
+
module Serve
|
|
29
|
+
# The explicitly specified application configuration path, if any.
|
|
30
|
+
# @returns [String | Nil]
|
|
31
|
+
def configuration_path
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Resolve the application configuration path.
|
|
36
|
+
# @returns [String] The absolute application configuration path.
|
|
37
|
+
def resolved_configuration_path
|
|
38
|
+
if configuration_path
|
|
39
|
+
return File.expand_path(configuration_path, root)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
serve_path = File.expand_path("config/serve.rb", root)
|
|
43
|
+
if File.file?(serve_path)
|
|
44
|
+
return serve_path
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
rackup_path = File.expand_path("config.ru", root)
|
|
48
|
+
if File.file?(rackup_path)
|
|
49
|
+
return rackup_path
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
raise ArgumentError, "Could not find config/serve.rb or config.ru in #{root}!"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Load and wrap the configured application.
|
|
56
|
+
# @returns [Protocol::HTTP::Middleware] The middleware stack.
|
|
57
|
+
def middleware
|
|
58
|
+
path = resolved_configuration_path
|
|
59
|
+
|
|
60
|
+
case File.extname(path)
|
|
61
|
+
when ".rb"
|
|
62
|
+
application = ::Protocol::HTTP::Middleware.load(path)
|
|
63
|
+
return ::Falcon::Server.protocol_middleware(application, verbose: verbose, cache: cache)
|
|
64
|
+
when ".ru"
|
|
65
|
+
application = ::Protocol::Rack::Adapter.parse_file(path)
|
|
66
|
+
return ::Falcon::Server.rack_middleware(application, verbose: verbose, cache: cache)
|
|
67
|
+
else
|
|
68
|
+
raise ArgumentError, "Unsupported application configuration: #{path}!"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
data/lib/falcon/server.rb
CHANGED
|
@@ -17,11 +17,26 @@ require "protocol/rack"
|
|
|
17
17
|
module Falcon
|
|
18
18
|
# A server listening on a specific endpoint, hosting a specific middleware.
|
|
19
19
|
class Server < Async::HTTP::Server
|
|
20
|
-
#
|
|
20
|
+
# @deprecated Use {rack_middleware} instead.
|
|
21
|
+
def self.middleware(...)
|
|
22
|
+
warn("`Falcon::Server.middleware` is deprecated, use `.rack_middleware` instead.", uplevel: 1, category: :deprecated) if $VERBOSE
|
|
23
|
+
|
|
24
|
+
return self.rack_middleware(...)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Wrap a Rack application with the standard server middleware.
|
|
21
28
|
# @parameter rack_app [Proc | Object] A rack application/middleware.
|
|
22
29
|
# @parameter verbose [Boolean] Whether to add the {Middleware::Verbose} middleware.
|
|
23
30
|
# @parameter cache [Boolean] Whether to add the {Async::HTTP::Cache} middleware.
|
|
24
|
-
def self.
|
|
31
|
+
def self.rack_middleware(rack_app, verbose: false, cache: true)
|
|
32
|
+
return self.protocol_middleware(::Protocol::Rack::Adapter.new(rack_app), verbose: verbose, cache: cache)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Wrap a protocol application with the standard server middleware.
|
|
36
|
+
# @parameter application [Protocol::HTTP::Middleware] The protocol application/middleware.
|
|
37
|
+
# @parameter verbose [Boolean] Whether to add the {Middleware::Verbose} middleware.
|
|
38
|
+
# @parameter cache [Boolean] Whether to add the {Async::HTTP::Cache} middleware.
|
|
39
|
+
def self.protocol_middleware(application, verbose: false, cache: true)
|
|
25
40
|
::Protocol::HTTP::Middleware.build do
|
|
26
41
|
if verbose
|
|
27
42
|
use Middleware::Verbose
|
|
@@ -32,9 +47,7 @@ module Falcon
|
|
|
32
47
|
end
|
|
33
48
|
|
|
34
49
|
use ::Protocol::HTTP::ContentEncoding
|
|
35
|
-
|
|
36
|
-
use ::Protocol::Rack::Adapter
|
|
37
|
-
run rack_app
|
|
50
|
+
run application
|
|
38
51
|
end
|
|
39
52
|
end
|
|
40
53
|
|
data/lib/falcon/version.rb
CHANGED
data/readme.md
CHANGED
|
@@ -35,7 +35,7 @@ Please see the [project documentation](https://socketry.github.io/falcon/) for m
|
|
|
35
35
|
|
|
36
36
|
- [Deployment](https://socketry.github.io/falcon/guides/deployment/index) - This guide explains how to deploy applications using the Falcon web server. It covers the recommended deployment methods, configuration options, and examples for different environments, including systemd and kubernetes.
|
|
37
37
|
|
|
38
|
-
- [Dynamic Clusters with Envoy](https://socketry.github.io/falcon/guides/cluster-deployment/index) - This guide explains how to run Falcon workers with independently bound endpoints
|
|
38
|
+
- [Dynamic Clusters with Envoy](https://socketry.github.io/falcon/guides/cluster-deployment/index) - This guide explains how to run Falcon workers with independently bound endpoints, publish them dynamically using xDS, and balance requests according to their current load using ORCA.
|
|
39
39
|
|
|
40
40
|
- [Performance Tuning](https://socketry.github.io/falcon/guides/performance-tuning/index) - This guide explains the performance characteristics of Falcon.
|
|
41
41
|
|
|
@@ -49,6 +49,11 @@ Please see the [project documentation](https://socketry.github.io/falcon/) for m
|
|
|
49
49
|
|
|
50
50
|
Please see the [project releases](https://socketry.github.io/falcon/releases/index) for all releases.
|
|
51
51
|
|
|
52
|
+
### v0.57.0
|
|
53
|
+
|
|
54
|
+
- Update the Envoy cluster example to use dedicated CDS and EDS services from `async-service-supervisor-envoy` v0.5.
|
|
55
|
+
- [Rack Compatibility](https://socketry.github.io/falcon/releases/index#rack-compatibility)
|
|
56
|
+
|
|
52
57
|
### v0.56.0
|
|
53
58
|
|
|
54
59
|
- Add `Falcon::Environment::Cluster` and `Falcon::Service::Cluster` for running workers with independently bound endpoints.
|
|
@@ -90,10 +95,6 @@ Please see the [project releases](https://socketry.github.io/falcon/releases/ind
|
|
|
90
95
|
|
|
91
96
|
- Fix handling of old style supervisors from `Async::Container::Supervisor`.
|
|
92
97
|
|
|
93
|
-
### v0.54.0
|
|
94
|
-
|
|
95
|
-
- Introduce `Falcon::CompositeServer` for hosting multiple server instances in a single worker.
|
|
96
|
-
|
|
97
98
|
## Contributing
|
|
98
99
|
|
|
99
100
|
We welcome contributions to this project.
|
data/releases.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Releases
|
|
2
2
|
|
|
3
|
+
## v0.57.0
|
|
4
|
+
|
|
5
|
+
- Update the Envoy cluster example to use dedicated CDS and EDS services from `async-service-supervisor-envoy` v0.5.
|
|
6
|
+
|
|
7
|
+
### Rack Compatibility
|
|
8
|
+
|
|
9
|
+
Falcon is shifting its application boundary from a Rack-centric design to {ruby Protocol::HTTP::Middleware}. `falcon serve` now prefers protocol HTTP middleware configured by `config/serve.rb`, while continuing to discover and run Rack `config.ru` applications through {ruby Protocol::Rack::Adapter}.
|
|
10
|
+
|
|
11
|
+
Use {ruby Falcon::Server.protocol\_middleware} for protocol HTTP applications and {ruby Falcon::Server.rack\_middleware} for Rack applications. {ruby Falcon::Server.middleware} is deprecated. Explicit `.rb` serve configurations are now interpreted as {ruby Protocol::HTTP::Middleware}; Rack applications defined in Ruby files should use `config.ru` or wrap the application explicitly with {ruby Protocol::Rack::Adapter}.
|
|
12
|
+
|
|
3
13
|
## v0.56.0
|
|
4
14
|
|
|
5
15
|
- Add `Falcon::Environment::Cluster` and `Falcon::Service::Cluster` for running workers with independently bound endpoints.
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: falcon
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.57.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Samuel Williams
|
|
@@ -276,6 +276,7 @@ files:
|
|
|
276
276
|
- lib/falcon/environment/rackup.rb
|
|
277
277
|
- lib/falcon/environment/redirect.rb
|
|
278
278
|
- lib/falcon/environment/self_signed_tls.rb
|
|
279
|
+
- lib/falcon/environment/serve.rb
|
|
279
280
|
- lib/falcon/environment/server.rb
|
|
280
281
|
- lib/falcon/environment/tls.rb
|
|
281
282
|
- lib/falcon/environment/virtual.rb
|
metadata.gz.sig
CHANGED
|
Binary file
|