美文网首页Linux全新框架Java
Gateway高可用集群与动态网关

Gateway高可用集群与动态网关

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-11-22 07:20 被阅读0次

    上一篇 <<<Zuul的反向代理、过滤及动态网关配置实例
    下一篇 >>>Gateway的谓词配置实例


    1.集群思路

    网关宕机会导致整个微服务无法实现通讯,所以网关需要实现集群,基于Nginx实现。
    Nginx也会存在宕机,所以上面用LVS和Keepalived实现,由于lvs是linux自身的服务,keepalived又保证了高可用,所以不用考虑宕机的情况。

    2.动态网关实现方案

    任何配置都不需要修改也不用重启即可实现网关刷新的功能。
    方案:
    1.基于数据库形式实现 阅读性高,建议使用
    2.基于配置中心实现 需要定义json格式配置,阅读性和维护性差,不建议使用

    3.数据库实现动态网关思路

    a、网关启动的时候,读取数据库配置信息加入到内存中
    b、配置信息在数据库增删改查操作后,修改网关内存中的数据

    /**
     * 动态网关业务层接口
     */
    @Service
    public class GatewayService implements ApplicationEventPublisherAware {
        private ApplicationEventPublisher publisher;
        @Autowired
        private RouteDefinitionWriter routeDefinitionWriter;
        @Autowired
        private MayiktGatewayMapper mayiktGateway;
    
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
            this.publisher = applicationEventPublisher;
        }
    
        public void initAllRoute() {
            // 从数据库查询配置的网关配置后加载
            List<GateWayEntity> gateWayEntities = mayiktGateway.gateWayAll();
            for (GateWayEntity gw :
                    gateWayEntities) {
                loadRoute(gw);
            }
        }
    
        /**
         * 网关信息加载到容器中
         * @param gateWayEntity
         * @return
         */
        public String loadRoute(GateWayEntity gateWayEntity) {
            RouteDefinition definition = new RouteDefinition();
            Map<String, String> predicateParams = new HashMap<>(8);
            PredicateDefinition predicate = new PredicateDefinition();
            FilterDefinition filterDefinition = new FilterDefinition();
            Map<String, String> filterParams = new HashMap<>(8);
            // 如果配置路由type为0的话 则从注册中心获取服务
            URI uri = null;
            if (gateWayEntity.getRouteType().equals("0")) {
                uri = uri = UriComponentsBuilder.fromUriString("lb://" + gateWayEntity.getRouteUrl() + "/").build().toUri();
            } else {
                uri = UriComponentsBuilder.fromHttpUrl(gateWayEntity.getRouteUrl()).build().toUri();
            }
            // 定义的路由唯一的id
            definition.setId(gateWayEntity.getRouteId());
            predicate.setName("Path");
            //路由转发地址
            predicateParams.put("pattern", gateWayEntity.getRoutePattern());
            predicate.setArgs(predicateParams);
    
            // 名称是固定的, 路径去前缀
            filterDefinition.setName("StripPrefix");
            filterParams.put("_genkey_0", "1");
            filterDefinition.setArgs(filterParams);
            definition.setPredicates(Arrays.asList(predicate));
            definition.setFilters(Arrays.asList(filterDefinition));
            definition.setUri(uri);
            routeDefinitionWriter.save(Mono.just(definition)).subscribe();
            this.publisher.publishEvent(new RefreshRoutesEvent(this));
            return "success";
        }
    }
    

    推荐阅读:
    <<<网关背景分类及常用框架
    <<<微服务网关与过滤器的区别
    <<<Nginx与Zuul的区别
    <<<Zuul与Gateway有哪些区别
    <<<Nginx与网关的区别
    <<<如何保证微服务接口的安全
    <<<Gateway网关转发demo
    <<<Zuul的反向代理、过滤及动态网关配置实例
    <<<Gateway的谓词配置实例
    <<<Gateway配置及流程分析

    相关文章

      网友评论

        本文标题:Gateway高可用集群与动态网关

        本文链接:https://www.haomeiwen.com/subject/gzppzltx.html