Skip to content

Commit

Permalink
优化反向代理转发性能 (#13)
Browse files Browse the repository at this point in the history
* 优化反向代理转发请求的性能
  • Loading branch information
w-sodalite committed Jan 20, 2024
1 parent 222bc3d commit decc228
Show file tree
Hide file tree
Showing 15 changed files with 314 additions and 134 deletions.
3 changes: 1 addition & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ tracing = { version = "0.1" }
futures = { version = "0.3" }
qstring = { version = "0.7" }
cookie = { version = "0.18" }
rustls = { version = "0.22.0" }
path-tree = { version = "0.7" }
serde_yaml = { version = "0.9" }
hyper-util = { version = "0.1" }
Expand Down
14 changes: 14 additions & 0 deletions examples/echo.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 服务配置
server:
# 服务端口
port: 8003

# 路由配置
router:
# 路由表
routes:
# 静态文件
- id: echo
matchers:
- Path=/echo/+
service: Echo
19 changes: 19 additions & 0 deletions examples/proxy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 服务配置
server:
# 服务端口
port: 8002

# 路由配置
router:
# 路由表
routes:
# 静态文件
- id: proxy
matchers:
- Path=/backend/+
layers:
- PathStrip=1
service:
kind: Proxy
args:
uri: http://127.0.0.1:3000
4 changes: 3 additions & 1 deletion examples/satex.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ satex:
# 日志配置
tracing:
# 日志级别
max_level: info
max_level: warn
# 是否使用ANSI
ansi: true
# 是否显示级别
Expand All @@ -18,3 +18,5 @@ satex:
serves:
- examples/static.yaml
- examples/tls/static.yaml
- examples/proxy.yaml
- examples/echo.yaml
62 changes: 0 additions & 62 deletions satex-core/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,6 @@ pub struct ServeConfig {
///
#[serde(default)]
discovery: Vec<Metadata>,

///
/// Http Client配置
///
#[serde(default)]
client: Client,
}

impl ServeConfig {
Expand All @@ -155,9 +149,6 @@ impl ServeConfig {
pub fn discovery(&self) -> &[Metadata] {
&self.discovery
}
pub fn client(&self) -> &Client {
&self.client
}
pub fn from_yaml<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
let display = path.as_ref().display();
let bytes = std::fs::read(path.as_ref())
Expand Down Expand Up @@ -384,59 +375,6 @@ impl Route {
}
}

#[derive(Debug, Clone, Deserialize)]
pub struct Client {
#[serde(default = "Client::default_pool_max_idle_per_host")]
pool_max_idle_per_host: usize,

#[serde(default = "Client::default_pool_idle_timeout_secs")]
pool_idle_timeout_secs: u64,

#[serde(default = "Client::default_retry_canceled_requests")]
retry_canceled_requests: bool,

#[serde(default = "Client::default_set_host")]
set_host: bool,
}

impl Default for Client {
fn default() -> Self {
Self {
pool_max_idle_per_host: Self::default_pool_max_idle_per_host(),
pool_idle_timeout_secs: Self::default_pool_idle_timeout_secs(),
retry_canceled_requests: Self::default_retry_canceled_requests(),
set_host: Self::default_set_host(),
}
}
}

impl Client {
fn default_pool_max_idle_per_host() -> usize {
16
}
fn default_pool_idle_timeout_secs() -> u64 {
60
}
fn default_retry_canceled_requests() -> bool {
true
}
fn default_set_host() -> bool {
true
}
pub fn pool_max_idle_per_host(&self) -> usize {
self.pool_max_idle_per_host
}
pub fn pool_idle_timeout_secs(&self) -> u64 {
self.pool_idle_timeout_secs
}
pub fn retry_canceled_requests(&self) -> bool {
self.retry_canceled_requests
}
pub fn set_host(&self) -> bool {
self.set_host
}
}

#[derive(Debug, Default, Clone, Deserialize)]
pub struct Tls {
///
Expand Down
2 changes: 0 additions & 2 deletions satex-layer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@ hyper = { workspace = true }
bytes = { workspace = true }
tracing = { workspace = true }
futures = { workspace = true }
hyper-rustls = { workspace = true }
leaky-bucket = { workspace = true }
aho-corasick = { workspace = true }
http-body-util = { workspace = true }
tower = { workspace = true, features = ["limit"] }
serde = { workspace = true, features = ["derive"] }
hyper-util = { workspace = true, features = ["client"] }
tower-http = { workspace = true, features = [
"limit",
"set-header",
Expand Down
1 change: 0 additions & 1 deletion satex-layer/src/make/default/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use satex_core::export_make;
mod make;
mod registry;
mod set_discovery;
mod set_http_client;
mod trace;

export_make!(MakeDefaultRouteServiceLayer);
7 changes: 1 addition & 6 deletions satex-layer/src/make/default/registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@ use satex_core::config::ServeConfig;
use satex_core::{registry, Error};

use crate::make::default::set_discovery::MakeSetDiscoveryLayer;
use crate::make::default::set_http_client::MakeSetHttpClientLayer;
use crate::make::default::trace::MakeTraceLayer;
use crate::make::default::{ArcMakeDefaultRouteServiceLayer, MakeDefaultRouteServiceLayer};
use crate::NamedRouteServiceLayer;

registry!(
MakeDefaultRouteServiceLayerRegistry,
ArcMakeDefaultRouteServiceLayer,
[
MakeSetDiscoveryLayer,
MakeSetHttpClientLayer,
MakeTraceLayer
]
[MakeSetDiscoveryLayer, MakeTraceLayer]
);

impl MakeDefaultRouteServiceLayerRegistry {
Expand Down
43 changes: 0 additions & 43 deletions satex-layer/src/make/default/set_http_client.rs

This file was deleted.

11 changes: 5 additions & 6 deletions satex-layer/src/make/path_strip/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ where
fn call(&mut self, mut req: Request<ReqBody>) -> Self::Future {
let level = self.level;
if level > 0 {
let uri = req.uri();
debug!("path strip source: {}", uri);
let mut path = uri
let source = req.uri();
let mut path = source
.path()
.split('/')
.filter(|segment| !segment.is_empty())
Expand All @@ -52,14 +51,14 @@ where
.map(|query| format!("{}?{}", path, query))
.unwrap_or(path);
let mut builder = Uri::builder().path_and_query(path_and_query);
if let Some(schema) = uri.scheme_str() {
if let Some(schema) = source.scheme_str() {
builder = builder.scheme(schema);
}
if let Some(authority) = uri.authority() {
if let Some(authority) = source.authority() {
builder = builder.authority(authority.as_str());
}
let uri = builder.build().expect("build uri error!");
debug!("path strip target: {}", uri);
debug!("Strip path: {} => {}", source, uri);
*req.uri_mut() = uri;
}
self.inner.call(req)
Expand Down
11 changes: 7 additions & 4 deletions satex-serve/src/router/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,13 @@ where
match <Route as ServiceExt<Request<Body>>>::ready_oneshot(route).await {
Ok(mut route) => match route.call(request).await {
Ok(response) => Ok(response),
Err(e) => Ok(make_response(
format!("{e}"),
StatusCode::INTERNAL_SERVER_ERROR,
)),
Err(e) => {
warn!("[{:?}] call request error: {}", route, e);
Ok(make_response(
format!("{e}"),
StatusCode::INTERNAL_SERVER_ERROR,
))
}
},
Err(e) => Ok(make_response(
format!("{e}"),
Expand Down
1 change: 1 addition & 0 deletions satex-service/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ serde = { workspace = true }
tower = { workspace = true }
hyper = { workspace = true }
bytes = { workspace = true }
rustls = { workspace = true }
tracing = { workspace = true }
futures = { workspace = true }
tower-http = { workspace = true, features = ["fs"] }
Expand Down

0 comments on commit decc228

Please sign in to comment.