【开发经验】gateway网关开发调试优先选择本地服务

这篇具有很好参考价值的文章主要介绍了【开发经验】gateway网关开发调试优先选择本地服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景
在微服务开发时,本地要启动太多的服务,比如基本服务,注册中心、网关、鉴权等等。还要启动当前代码所在的服务。这样,本地环境会特别卡,影响开发效率。

【开发经验】gateway网关开发调试优先选择本地服务
如下图所示:
在局域网内搭建一套开发环境,在开发时,这个开发环境启动的服务用来做“备胎”。
1.客户端访问的时候,携带自己想要优先访问的ip。
2.网关在转发时,发现客户端有想要优先访问的ip,则优先转发。

在整个微服务转发过程中,设计到进入网关时转发RPC调用时转发;此只介绍网关转发时锁定远程ip。
如果是dubbo调用时想锁定远程ip可参考文章dubbo多服务本地开发调试

代码思路

网关层面在进行服务选择时,肯定会加载所有的服务,然后根据随机、轮训、权重等规则进行分发。只要自定义自己的路由规则即可。新建远程锁定ip负载均衡类LockRemoteIpLoadBalancer.java


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.*;
import org.springframework.cloud.loadbalancer.core.*;
import org.springframework.http.HttpHeaders;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class LockRemoteIpLoadBalancer implements ReactorServiceInstanceLoadBalancer {
    private static final Log log = LogFactory.getLog(LockRemoteIpLoadBalancer.class);
    private static final String LockIp="lock-remote—ip";
    ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
    final String serviceId;

    public LockRemoteIpLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {
        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
        this.serviceId = serviceId;
    }

    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
                .getIfAvailable(NoopServiceInstanceListSupplier::new);
        return supplier.get(request).next()
                .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances, request));
    }

    private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier,
                                                              List<ServiceInstance> serviceInstances,
                                                              Request request) {
        Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(serviceInstances, request);
        if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
            ((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());
        }
        return serviceInstanceResponse;
    }

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, Request request) {

        if (instances.isEmpty()) {
            if (log.isWarnEnabled()) {
                log.warn("No servers available for service: " + serviceId);
            }
            return new EmptyResponse();
        }
        int index = ThreadLocalRandom.current().nextInt(instances.size());

        ServiceInstance instance = instances.get(index);
        //锁定远程ip逻辑
        //在请求头添加想要访问的ip
        if (request instanceof DefaultRequest) {
            DefaultRequest defaultRequest = (DefaultRequest) request;
            if (defaultRequest.getContext() instanceof RequestDataContext) {
                RequestDataContext requestDataContext = (RequestDataContext) defaultRequest.getContext();
                HttpHeaders headers = requestDataContext.getClientRequest().getHeaders();
                if (headers.containsKey(LockIp)){
                    ServiceInstance lockIpInstance = this.chooseLockIpInstance(instances,headers.get(LockIp));
                    instance = lockIpInstance!=null?lockIpInstance:instance;
                }

            }
        }
        return new DefaultResponse(instance);
    }

    private ServiceInstance chooseLockIpInstance(List<ServiceInstance> instances, List<String> strings) {
        //获取想要访问的ip
        String ip = strings.get(0);
        // 循环所有服务器,查看是否有符合规则的服务
        for(ServiceInstance instance:instances){
            if(ip.equals(instance.getHost())){
                return instance;
            }
        }
        return null;
    }
}

添加配置类,选用自己的负责均衡规则

@Configuration
@LoadBalancerClients(
                                   //远程服务名称,比如订单服务、商品服务。如果哪个服务想要使用此规则,在这边添加即可
        @LoadBalancerClient(name = "order-application", configuration = GatewayConfig.class)
)
public class GatewayConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,
                                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new LockRemoteIpLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

然后在请求头添加如下:
lock-remote—ip:192.168.1.50
即可优先访问这个ip。文章来源地址https://www.toymoban.com/news/detail-432136.html

到了这里,关于【开发经验】gateway网关开发调试优先选择本地服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 本地clion开发/优雅地调试,并实时同步远程服务器

    实现本地Clion写项目,远程连接Ubuntu服务器,并将本地所做的修改实时同步到Ubuntu上 一、Ubuntu服务器 开启sshd服务 安装工具链,g++,gcc,make,cmake,gdb,(apt install安装的版本不符,就去搜其他方式安装适合的版本) 二、本地Win10 参考windows clion安装 配置Ubuntu服务器: 文件

    2024年02月04日
    浏览(46)
  • SpringCloud - GateWay服务网关

    gateway 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务

    2024年02月07日
    浏览(53)
  • 【SpringCloud】Gateway服务网关

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的

    2024年02月13日
    浏览(51)
  • 微服务-统一网关Gateway

    对用户请求做身份认证、权限校验 将用户请求路由到微服务,并实现负载均衡 对用户请求做限流 创建新module,命名为Gateway,引入依赖(1.SpringCloudGateway依赖;2.Eureka客户端依赖或者nacos的服务发现依赖)。在本案例中使用的是Eureka。 配置Application.yml的网关服务 路由id:路由

    2024年02月08日
    浏览(43)
  • 微服务整合Gateway网关

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 微服务探索之旅 ✨特色专栏: MySQL学习 🥭本文内容:微服务整合Gateway网关 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库: 知识库

    2024年02月07日
    浏览(44)
  • 微服务网关 Gateway

    不同的微服务一般会有不同的网络地址,客户端在访问这些微服务时必须记住几十甚至几百个地址,这对于客户端方来说太复杂也难以维护。 如果让客户端直接与各个微服务通讯,可能会有很多问题: 客户端会请求多个不同的服务,需要维护不同的请求地址,增加开发难度

    2024年02月08日
    浏览(56)
  • 服务网关Gateway

    API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态特点。 为了保证对外服务的安全性,我们需要实

    2024年02月06日
    浏览(37)
  • Gateway的服务网关

    Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的 核心功能特性 : 请求路由 权限控制 限流 架构如下:    创建gateway服务,引入依赖   创建application.yml文件,内容如下 在gateway服务的application.yml文件中,添加下面的配置      

    2024年02月10日
    浏览(34)
  • 服务网关 Gateway

    在微服务架构中,一个大的系统被拆分成为了多个小的服务提供出来,每一个服务他们自成体系,每一个服务可以拥有自己的数据库,可以使用不同的技术框架和不同的语言进行开发,每一个服务都有自己的服务地址,服务之间通常以提供 Rest Api 风格的接口来相互调用。 客

    2024年02月12日
    浏览(36)
  • SpringCloud:Gateway服务网关

    网关(Gateway)是将两个使用不同协议的网络段连接在一起的设备。 网关的作用就是对两个网络段中的使用不同传输协议的数据进行互相的翻译转换。 创建服务 导入依赖 编写启动类 添加配置 Route Predicate Factories :: Spring Cloud Gateway 对所有路径都生效 全局过滤器的作用也是处理

    2024年02月01日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包