Solon Cloud —— 服务网关

server/2025/2/26 0:04:28/

说明

Solon Cloud Gateway 是 一个可 Java 编程的分布式网关,提供了服务路由的能力和各种拦截的支持,只要是 http 服务(不需要关心实现的语言)都可以通过 Solon Cloud Gateway 进行代理转发,代理转发的服务也不一定要注册到服务注册中心。

虽然 Solon Cloud 提供了网关的实现,但在其官网出于性能及资源等原因的考虑,推荐优先使用专业网关(ngix,apisix,kong, k8s ingress controller),其次才是 Java 实现的网关 Spring Cloud Gateway 和 Solon Cloud Gateway。因此,在实际的项目中需要结合自己的项目情况来选择。

以下是微服务框架配合网关的架构图,图片来自 Solon 官网。https://solon.noear.org/article/328 。

在这里插入图片描述

依赖

dependencies {implementation platform(project(":demo-parent"))implementation("org.noear:nacos2-solon-cloud-plugin")implementation("org.noear:solon.cloud.gateway")annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")testImplementation("org.noear:solon-test-junit5")
}

实现

响应式

Solon Cloud Gateway 使用响应式接口,由 Solon-Rx 来实现,是基于 reactive-streams 封装的 RxJava 极简版。目前仅一个接口 Completable,意为:可完成的发布者。

接口说明
Completable作为返回类型
Completable::complete()构建完成发布者
Completable::error(cause)构建异常发布者
Completable::create((emitter)->{…})构建发射器发布者

路由检测器

内置路由检测器
匹配检测器工厂本置前缀说明与示例
AfterPredicateFactoryAfter=After 时间检测器,ZonedDateTime 格式 (After=2017-01-20T17:42:47.789-07:00[America/Denver])
BeforePredicateFactoryBefore=After 时间检测器,ZonedDateTime 格式 (Before=2017-01-20T17:42:47.789-07:00[America/Denver])
CookiePredicateFactoryCookie=Cookie 检测器 (Cookie=token)(Cookie=token, ^user.)
HeaderPredicateFactoryHeader=Header 检测器 (Header=token)(Header=token, ^user.)
MethodPredicateFactoryMethod=Method 检测器 (Method=GET,POST)
PathPredicateFactoryPath=Path 检测器(支持多路径匹配,以","号隔开) (Path=/demo/) ,(Path=/demo/,/hello/**)

通常情况下,我们使用 PathPredicateFactory 就够用,不需要额外的配置。

路由过滤器

内置过滤器

Solon 提供了一些内置的路由过滤器,可以通过直接的配置就可以使用。

过滤器工厂本置前缀说明与示例
AddRequestHeaderFilterFactoryAddRequestHeader=添加请求头 (AddRequestHeader=Demo-Ver,1.0)
AddResponseHeaderFilterFactoryAddResponseHeader=添加响应头 (AddResponseHeader=Demo-Ver,1.0)
PrefixPathFilterFactoryPrefixPath=附加路径前缀 (PrefixPath=/app)
RedirectToFilterFactoryRedirectTo=跳转到 (RedirectTo=302,http://demo.org/a,true)
RemoveRequestHeaderFilterFactoryRemoveRequestHeader=移除请求头 (RemoveRequestHeader=Demo-Ver,1.0)
RemoveResponseHeaderFilterFactoryRemoveResponseHeader=移除响应头 (RemoveResponseHeader=Demo-Ver,1.0)
StripPrefixFilterFactoryStripPrefix=移除路径前缀段数 (StripPrefix=1)
定制

通过RouteFilterFactory定制路由过滤规则,实现不同类型的接口过滤。

package com.example.demo.solon.filter;import io.vertx.core.buffer.Buffer;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.text.StrUtil;
import org.noear.solon.annotation.Component;
import org.noear.solon.cloud.gateway.exchange.ExContext;
import org.noear.solon.cloud.gateway.exchange.ExFilter;
import org.noear.solon.cloud.gateway.exchange.ExFilterChain;
import org.noear.solon.cloud.gateway.route.RouteFilterFactory;
import org.noear.solon.rx.Completable;/*** @author airhead*/
@Component
@Slf4j
public class AuthFilterFactory implements RouteFilterFactory {public static final String TOKEN = "token";public static final String EMPTY = "empty";@Overridepublic String prefix() {return "Auth";}@Overridepublic ExFilter create(String config) {if (TOKEN.equals(config)) {return new TokenFilter();} else {return new EmptyAuthFilter();}}/** 默认的空鉴权 */public static class EmptyAuthFilter implements ExFilter {public EmptyAuthFilter() {}@Overridepublic Completable doFilter(ExContext ctx, ExFilterChain chain) {log.info("empty filter, do nothing");return chain.doFilter(ctx);}}/** token 鉴权 ,如果鉴权逻辑比较复杂的,用独立类 */public static class TokenFilter implements ExFilter {@Overridepublic Completable doFilter(ExContext ctx, ExFilterChain chain) {String token = ctx.rawHeader("token");if (StrUtil.isBlank(token)) {ctx.newResponse().status(401);ctx.newResponse().body(Buffer.buffer("token is empty"));return Completable.complete();}return chain.doFilter(ctx);}}
}

其中 EmptyFilter 只是简单的记录日志,而 TokenFilter 会从头中获取 token 信息判断是否为空,为空是返回错误信息,不为空时正常情况。

配置

server.port: 8000solon.app:name: 'demo-cloud-gateway'# group: "DEFAULT_GROUP" # 默认值为 DEFAULT_GROUP# namespace: "public" # 默认值为 publicknife4j.enable: true# 运行样例时,屏蔽,或者配置app-local.yml
solon.env: localsolon.cloud.nacos:server: "localhost:8848"           #nacos2 服务地址config:load: "demo-cloud-gateway.yml"solon.cloud.gateway:discover:enabled: falseexcludedServices:- "self-service"httpClient:responseTimeout: 1800 #单位:秒routes:- id: demoindex: 0 #默认为0target: "http://127.0.0.1:8081"predicates:- "Path=/demo/**"filters:- "Auth=empty"- "StripPrefix=1"timeout:responseTimeout: 1800 #单位:秒- id: service01index: 0 #默认为0target: lb://demo-cloud-service01predicates:- "Path=/service01/**"filters:- "Auth=token"- "StripPrefix=1"timeout:responseTimeout: 1800 #单位:秒

这里使用 service01 作为上游服务,配置直接地址和使用服务注册的地址来分别测试。

使用直接地址时,使用了一个空的鉴权逻辑,然后利用 Solon 内置的StripPrefix 来移除url 中的第一段,然后请求实际的服务。

使用注册服务时,使用了一个简单的Token鉴权逻辑,然后利用 Solon 内置的StripPrefix 来移除url 中的第一段,然后请求实际的服务。

验证

启动 demo-cloud-gateway 和 demo-cloud-service01。

通过service01来调用,也就是通过注册服务来调用。

在这里插入图片描述

通过demo来调用,也就是通过直接地址来调用。

在这里插入图片描述

如果 servic01 没有启动的情况返回的是404的错误。

小结

Solon Cloud Gateway 通过配置的方式就可以对服务进行代理转发,在实际的业务使用中通常会与服务发现一起,实现负载均衡,也可以通过编程的方式进一步的定制自己的业务逻辑,实现统一鉴权,限流熔断,灰度发布等功能。


http://www.ppmy.cn/server/170636.html

相关文章

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品模式1. 模式2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…

51单片机-80C51的串行口

目录 1、80C51的串行口 1.1、80C51串行口的控制寄存器 1.2、80C51串行口的工作方式 1.3、波特率的计算 1.4、串口如何使用 2、单片机与单片机的通信 1、80C51的串行口 有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一个地址99H;接收器是双缓冲结构;发送缓冲器,…

【Jenkins】显示 HTML 标签

需求 在 Jenkins 中显示 HTML 标签内容(例如格式化的文本、颜色、图标等)是一个常见的需求,如下,编译工程显示当前编译的分支: 但 Jenkins 默认会出于安全考虑(防止 XSS 攻击)转义 HTML 标签&a…

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…

2025最新Python机器视觉实战:基于OpenCV与深度学习的多功能工业视觉检测系统(附完整代码)

2025最新Python机器视觉实战:基于OpenCV与深度学习的多功能工业视觉检测系统(附完整代码) 摘要:本文基于OpenCV与深度学习模型,实现一个多功能工业视觉检测系统,包含缺陷检测、尺寸测量、颜色识别、OCR文本识别、目标分类与数据可视化等功能。代码兼容Python 3.7+,功能…

微信小程序——访问服务器媒体文件的实现步骤

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:趣享先生的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏&…

Matplotlib | 一文搞定Matplotlib从入门到实战演练!

文章目录 1 什么是Matplotlib1.1 Matplotlib的安装1.2 Matplotlib的基本使用 2 绘制直线3 绘制折线设置标签文字和线条粗细设置中文标题风格的设置 4 绘制曲线绘制曲线yx^2绘制正弦曲线和余弦曲线画布分区 5 绘制散点图绘制不同种类不同颜色的线 6 绘制条形图(柱状&…

Redis 缓存穿透、击穿、雪崩:问题与解决方案

在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…