spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发

简介: spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发

本文为博主原创,转载请注明出处:

  在spring cloud gateway 为 2.x 的版本的时候,可以通过引入 ribbon ,在进行过滤器 LoadBalancerClientFilter 进行服务请求路由时,通过调用 choose 方法选择具体的服务实例,源码如下:

public class LoadBalancerClientFilter implements GlobalFilter, Ordered {
    public static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10100;
    private static final Log log = LogFactory.getLog(LoadBalancerClientFilter.class);
    protected final LoadBalancerClient loadBalancer;
    private LoadBalancerProperties properties;
    public LoadBalancerClientFilter(LoadBalancerClient loadBalancer, LoadBalancerProperties properties) {
        this.loadBalancer = loadBalancer;
        this.properties = properties;
    }
    public int getOrder() {
        return 10100;
    }
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        URI url = (URI)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
        String schemePrefix = (String)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR);
        if (url != null && ("lb".equals(url.getScheme()) || "lb".equals(schemePrefix))) {
            ServerWebExchangeUtils.addOriginalRequestUrl(exchange, url);
            if (log.isTraceEnabled()) {
                log.trace("LoadBalancerClientFilter url before: " + url);
            }
            ServiceInstance instance = this.choose(exchange);
            if (instance == null) {
                throw NotFoundException.create(this.properties.isUse404(), "Unable to find instance for " + url.getHost());
            } else {
                URI uri = exchange.getRequest().getURI();
                String overrideScheme = instance.isSecure() ? "https" : "http";
                if (schemePrefix != null) {
                    overrideScheme = url.getScheme();
                }
                URI requestUrl = this.loadBalancer.reconstructURI(new DelegatingServiceInstance(instance, overrideScheme), uri);
                if (log.isTraceEnabled()) {
                    log.trace("LoadBalancerClientFilter url chosen: " + requestUrl);
                }
                exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, requestUrl);
                return chain.filter(exchange);
            }
        } else {
            return chain.filter(exchange);
        }
    }
    protected ServiceInstance choose(ServerWebExchange exchange) {
        return this.loadBalancer.choose(((URI)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR)).getHost());
    }
}

  在choose 方法的调用中,打断点跟进,如果服务中引入了 ribbon ,断点会进入 到  RibbonLoadBalancerClient 中

  在使用 ribbon 的过程中,服务的实例是在 RibbonLoadBalancerClient.RibbonServer 类中进行了实例的封装,源码如下:

public static class RibbonServer implements ServiceInstance {
        private final String serviceId;
        private final Server server;
        private final boolean secure;
        private Map<String, String> metadata;
        public RibbonServer(String serviceId, Server server) {
            this(serviceId, server, false, Collections.emptyMap());
        }
        public RibbonServer(String serviceId, Server server, boolean secure, Map<String, String> metadata) {
            this.serviceId = serviceId;
            this.server = server;
            this.secure = secure;
            this.metadata = metadata;
        }
        public String getInstanceId() {
            return this.server.getId();
        }
        public String getServiceId() {
            return this.serviceId;
        }
        public String getHost() {
            return this.server.getHost();
        }
        public int getPort() {
            return this.server.getPort();
        }
        public boolean isSecure() {
            return this.secure;
        }
        public URI getUri() {
            return DefaultServiceInstance.getUri(this);
        }
        public Map<String, String> getMetadata() {
            return this.metadata;
        }
        public Server getServer() {
            return this.server;
        }
        public String getScheme() {
            return this.server.getScheme();
        }
        public String toString() {
            StringBuilder sb = new StringBuilder("RibbonServer{");
            sb.append("serviceId='").append(this.serviceId).append('\'');
            sb.append(", server=").append(this.server);
            sb.append(", secure=").append(this.secure);
            sb.append(", metadata=").append(this.metadata);
            sb.append('}');
            return sb.toString();
        }
    }

  在 服务路由进行请求时,会根据其中的  isSecure 属性判断是否进行 https 请求,如果是 isSecure 是 true,则请求的scheme 协议为 https,反之为 http ;该值可以通过以下方式进行配置:

ribbon.isSecure=true

  在 spring cloud gateway 中spring-cloud--openfeign-core为 3.x 的版本的时候,该依赖中 将 ribbon 单独的脱离了出来,此时的ribbon 配置不会生效。通过阅读源码之后会发现,该请求的协议是通过调用服务的 sslPort端口来判断是否进行https 请求,如果 sslPort端口不为空,则进行https 请求,

  以使用 zookeeper 为注册中心时,查看自动发现配置的property 文件:

@ConfigurationProperties("spring.cloud.zookeeper.discovery")
public class ZookeeperDiscoveryProperties {
  public static final String DEFAULT_URI_SPEC = "{scheme}://{address}:{port}";
  private HostInfo hostInfo;
  private boolean enabled = true;
  private String root = "/services";
  private String uriSpec = "{scheme}://{address}:{port}";
  private String instanceId;
  private String instanceHost;
  private String instanceIpAddress;
  private boolean preferIpAddress = false;
  private Integer instancePort;
  private Integer instanceSslPort;
  private boolean register = true;
  private Map<String, String> metadata = new HashMap();
  private String initialStatus = "UP";
  private int order = 0;
}

  在 choose 选择路由的服务时,会 根据ServiceInstance的实例的 isSecure 属性,解析得出http 或https,而zookeeperInstance 是根据  instanceSslPort 端口是否为空进行解析出http或https。zookeeperInstance解析http与https的源码在ZookeeperServiceInstance中

如果想在服务路由时,进行https 的路由,可以进行如下的配置:

server:
  port: 9000
spring:
  application:
    name: my-zookeeper-registry
  cloud:
    zookeeper:
      connect-string: localhost:2181
      discovery:
        register: true
        enabled: true
        root: my-registry
        instance-ssl-port: {{server.port}}

 

  按照上述配置,可以实现 https 的网关路由转发。

 

标签: spring cloud

相关文章
|
11月前
|
人工智能 Ubuntu 前端开发
Dify部署全栈指南:AI从Ubuntu配置到HTTPS自动化的10倍秘籍
本文档介绍如何部署Dify后端服务及前端界面,涵盖系统环境要求、依赖安装、代码拉取、环境变量配置、服务启动、数据库管理及常见问题解决方案,适用于开发与生产环境部署。
1878 1
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
1140 87
|
10月前
|
网络安全 开发工具 git
在GitLab CI中同步HTTPS仓库地址的yaml配置
最后,提交并推送 `.gitlab-ci.yml`文件到您的GitLab仓库。GitLab CI/CD将自动识别这个文件,并在每次推送到 `master`分支时执行定义的同步任务。
484 16
|
12月前
|
API
使用Gateway with Inference Extension路由外部MaaS服务
本文介绍如何通过Gateway with Inference Extension对接百炼服务,实现请求路由时自动添加API Key并重写路径,包含操作步骤及验证方法。
|
Java API Nacos
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2627 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
497 1
Gateway服务网关
|
API
Istio 使用ingress和gateway两种方式公开服务
本文档指导您完成Istio网关的部署与配置。首先安装`istiod`(步骤略过)。接着,创建`ingress.yaml`文件,定义Istio入口网关的服务、部署及权限设置,通过`kubectl apply -f ingress.yaml`命令应用。最后,创建Ingress资源,指定主机名、后端服务及TLS配置,实现对外部请求的路由管理。
1469 1
|
安全 应用服务中间件 网络安全
49.3k star,本地 SSL 证书生成神器,轻松解决 HTTPS 配置痛点
mkcert是一款由Filippo Valsorda开发的免费开源工具,专为生成受信任的本地SSL/TLS证书而设计。它通过简单的命令自动生成并安装本地信任的证书,使本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,已获得49.2K的GitHub Star,成为开发者首选的本地SSL工具。
1336 10
|
安全 应用服务中间件 Shell
nginx配置https的ssl证书和域名
nginx配置https的ssl证书和域名

热门文章

最新文章