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

本文涉及的产品
MSE Nacos 企业版免费试用,1600元额度,限量50份
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
7月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
445 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
5月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
533 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
8月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
244 1
Gateway服务网关
|
7月前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
821 1
|
9月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
267 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
9月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
632 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
10月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
488 5
|
10月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
276 3
|
10月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
513 6
|
9月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
188 0

热门文章

最新文章