精华内容
下载资源
问答
  • 网关路由 & 跨域

    2020-08-03 16:51:11
    网关路由 & 跨域配置网关路由 & 路径重写网关统一配置跨域跨域跨域流程解决跨域方案一、使用nginx部署为同一域二、配置当次请求允许跨域 配置网关路由 & 路径重写 ​ 可以将所有请求通过网关转发给...

    配置网关路由 & 路径重写

    ​ 可以将所有请求通过网关转发给renren-fast,改成网关端口88:http://localhost:88/api。测试发现重新需要登录,而且验证码也没有了,由于验证码请求发送给renren-fast,所以让网关将所有默认的请求发送给renren。

    1. 修改前端index.js 的api接口请求,所有请求都转发到api:

        // api接口请求地址
        window.SITE_CONFIG['baseUrl'] = 'http://localhost:88/api';
      

      在这里插入图片描述

    2. 网关发现服务:

    • renren依赖common(common引入了nacos注册配置中心),加入到注册中心;
    • renren配置application.yml:
     spring:
         application:
            name: renren-fast
          cloud:
            nacos:
              discovery:
                server-addr: 127.0.0.1:8848
    
    • @EnableDiscoveryClient
      
    • 网关配置路由yml:

      ## 前端项目,/api(88/api),默认发送到renrenfast
      ## 验证码图片访问失败 http://localhost:88/api/captcha.jpg
      ## 先从注册中心找 http://renren-fast:8080/api/captcha.jpg
      ## 但实际上应该是 http://localhost:8080/renren-fast(项目名)/captcha.jpg
      ## 所以需要转换一下路径格式,用Spring Cloud Gateway的路径重写RewritePath
      - id: admin_route
      uri: lb://renren-fast
      predicates:
      - Path=/api/**
      filters:
      - RewritePath=/api/(?<segment>/?.*),/renren-fast/$\{segment}
      
    • 重启renren

      • !!!启动失败!多次测试,可能是和common里的其他依赖出现版本不一致等问题!!(这个有可能还是因为我的项目是直接down别人的,common已经有很多后续一栏,产生冲突)
      • 解决:单独将nacos注册/配置中心以及的依赖导入renren-fast(希望以后renren不需要common里的其他依赖)

    网关统一配置跨域

    跨域

    • 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制(403 Forbidden)。默认不允许向远程端口发送ajax请求(XmlHttpRequest对象)。
    • 同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域,不允许范围数据。

    在这里插入图片描述

    跨域流程

    在这里插入图片描述

    • 非简单请求:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

    在这里插入图片描述

    • 预检请求:非简单请求。先发options请求,询问是否允许访问。

    • OPTIONS:打头兵,探路者

    解决跨域方案

    一、使用nginx部署为同一域

    ​ 目标网站和远程请求网站不在同一个域,协议端口号等有任意发生变化,跨域使用nginx转换为同一个域。

    • 将前后端均部署到nginx服务器,网关也又nginx代理
    • 不访问前端项目地址,访问nginx地址,nginx将静态请求默认代理给前端项目,将带前缀api的动态项目代理给网关,再转发给其他项目。
    • 在开发期间比较麻烦,此项目不采用

    在这里插入图片描述

    二、配置当次请求允许跨域

    OPTIONS预检请求询问是否可以跨域,响应返回能跨即可

    1. 添加响应头
    • Access-Control-Allow-Origin:支持哪些来源的请求跨域
    • Access-Control-Allow-Methods:支持哪些方法跨域
    • Access-Control-Allow-Credentials:跨域请求默认不包含cookie,设置为true可以包含cookie
    • Access-Control-**Expose-Headers:**跨域请求暴露的字段CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
    • Access-Control-Max-Age:表明该响应的有效时间为多少秒。在有效时间内,浏览器无
      须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果
      该首部字段的值超过了最大有效时间,将不会生效。
    1. 用filter自动添加相应字段
    • 在网关的config文件夹配置CorsConfiguration.java,将SpringBoot提供的CorsWebFilter放入容器即可
    /**
     * 配置跨域
     */
    @Configuration
    public class GulimallCorsConfiguration {
    
        @Bean
        public CorsWebFilter corsWebFilter() {
            // org.springframework.web.cors.reactive.xxx:webflex响应式编程
            // 跨域配置信息
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            CorsConfiguration corsConfiguration = new CorsConfiguration();
    
            // 配置跨域(*默认全部允许)
            corsConfiguration.addAllowedHeader("*");// 头
            corsConfiguration.addAllowedMethod("*");// 请求方式
            corsConfiguration.addAllowedOrigin("*");// 请求来源
            corsConfiguration.setAllowCredentials(true); // 允许cookie
    
            source.registerCorsConfiguration("/**",corsConfiguration);
            return new CorsWebFilter(source);
        }
    
    }
    
    • 测试:报错,相应字段重复出现两次,应该只有一个:

    在这里插入图片描述
    在这里插入图片描述

    ​ 因为renren脚手架也有默认的跨域,注释掉:
    在这里插入图片描述

    展开全文
  • Zuul的作用 统一将外部请求转发到具体的微服务实列上面,是...--路由网关 zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netf

    Zuul的作用

    统一将外部请求转发到具体的微服务实列上面,是实现访问的统一路径;

    如何搭建一个Zuul网关服务?

    第一步 准备一个服务 zt-frank-zuul-service-4001;

    第二步 引入zuul的依赖

    <!--路由网关 zuul -->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    	<version>2.0.0.RELEASE</version>
    </dependency>
    

    第三步 yml文件的配置

    server:
      port: 4001 #服务注册中心端口号
    spring:
      application:
        name: zt-frank-zuul-service-4001
    eureka:
      instance:
        instance-id: zuul_4001 #eureka 界面statua栏的别称
        hostname: zuul4001.com #Zuul的IP地址
        perfer-ip-address: true  #eureka界面显示ip地址
        leaserenewalintervalinseconds: 1   #eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance
        leaseexpirationdurationinseconds: 2   #eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance
      client:
        register-with-eureka: true #是否向服务注册中心注册自己
        healthcheck:
          enable: true #开启健康检查
        service-url: #服务注册中心的配置内容,指定服务注册中心的位置
          #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/,http://eureka6003.com:6003/eureka/  #集群配置
      server:
        enable-self-preservation: false #false取消eureka的自我保护机制
        eviction-interval-timer-in-ms: 30000         #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
    
    #erueka当前项目的信息
    info:
      app.name: spring-zuul-service-4001
      company.name: zuul-config-4001
    #网关配置
    zuul:
      routes:
        client-a:   #路径以/config开头的请求都转发到 zt-frank-config-service 服务上面
          path: /config/**
          service-id: zt-frank-config-service  #yml文件spring.application.name的值
          strip-prefix: false
        client-b:
          path: /hystrix/**
          service-id: zt-frank-config-service-hystrix-7003
          strip-prefix: false
    

    注意:上面的yml文件中的 eureka.instance.hostname = zuul4001.com 是hosts文件配置的(C:\Windows\System32\drivers\etc\hosts)以及 Zuul是需要注册到Eurka中的
    在这里插入图片描述
    第五步:主启动类上面添加注解 @EnableZuulProxy

    @SpringBootApplication
    //启动zuul相关的代理作用
    @EnableZuulProxy
    //可以获得其他服务的IP端口
    @EnableDiscoveryClient
    public class ZtFrankZuulApplication4001 {
    
    	private static Logger logger = Logger.getLogger(ZtFrankZuulApplication4001.class);
    
    	public static void main(String[] args) {
    
    		SpringApplication.run(ZtFrankZuulApplication4001.class, args);
    		logger.info("***************************ZtFrankZuulApplication4001启动成功***************************");
    	}
    }
    

    第六步 启动项目看4001项目是否注册到eurka了( Zuul是需要注册到Eurka中的);
    在这里插入图片描述
    ok可以!

    第七步:再准备两个服务,8002 和7001 服务,我们以feign的方式实现8002服务调用4001网关服务,再由网关服务转发请求到7001服务的接口(7001网关的zuul配置已经配置好了 第三步的 client-a 就是的)

    postmen ===》 8002服务(feign) ===》 4001网关服务 ===》 7001服务

    第八步 8002服务代码编写;其中feign注解的value值就是网关服务4001 yml文件spring.application.name的值;fallbackFactory 是熔断的的备用方法==》 服务降级
    而接口的请求地址就是“/config/zuul” 就是7001接口的请求地址的URL,调用ZuulTestService的controller 就不再这里展示了

    @FeignClient(value = "ZT-FRANK-ZUUL-SERVICE-4001",fallbackFactory = HystrixZuulClientServiceConfig.class)
    public interface ZuulTestService {//这个接口是7001服务的接口,不是网关的
        @RequestMapping(value = "/config/zuul",method = RequestMethod.POST)
        String zuulTest(@RequestParam("id") String req);
    }
    

    第九步 7001服务接口的编写

    @Controller
    @RequestMapping("/config")
    public class Test {
    
        private static Logger logger = Logger.getLogger(Test.class);
        @PostMapping("/zuul")
        @ResponseBody
        public String zuulTest(@RequestParam("id") String id){
            logger.info("zuul测试方法"+id);
            return "SUCCESS_UP_ZUUL_7001";
        }
    }
    

    第十步 测试postmen 调用8002服务的接口

    在这里插入图片描述
    好大功告成!当然每个人可能应为版本,环境等其它原因会碰到一些不一样的问题,这里仅仅给大家提供一个参考! 如果对你有帮助的话点个赞吧!!!

    Zuul的限流保护:
    1,引入限流依赖:

    <!--zuul限流保护-->
    <dependency>
    	<groupId>com.marcosbarbero.cloud</groupId>
    	<artifactId>spring-cloud-zuul-ratelimit</artifactId>
    	<version>2.0.2.RELEASE</version>
    </dependency>
    

    2,配置文件配置限流规则

    #全局配置限流

    zuul.ratelimit.enabled=true  #开启限流
    zuul.ratelimit.default-policy.limit=3
    zuul.ratelimit.default-policy.refresh-interval=60  #60s内请求超过3次,服务端就抛出异常,60s后可以恢复正常请求
    zuul.ratelimit.default-policy.type=origin
    

    #针对某个服务进行限流

    zuul.routes.book-product.path= /config/**
    zuul.routes.book-product.serviceId= zt-frank-config-service
    
    #开启限流
    zuul.ratelimit.enabled=true
    #60s内请求超过3次,服务端就抛出异常,60s后可以恢复正常请求
    zuul.ratelimit.policies.book-product.limit=3
    zuul.ratelimit.policies.book-product.refresh-interval=60
    #针对某个IP进行限流,不影响其他IP
    zuul.ratelimit.policies.book-product.type=origin
    
    展开全文
  • 配置中心还可以管理yml文件,比如将Zuul网关的配置放在配置中心。 ...在micro-service-api-gateway工程中,去除application.yml中的zuul网关路由配置。并新增bootstrap.yml,加入配置中心的c...

    配置中心还可以管理yml文件,比如将Zuul网关的配置放在配置中心。

     

    在microserviceconfig目录中新建api-gateway-dev.yml文件,并上传到git上面。

     

    git add -A ./*

     

    git commit -m "update config"

    git push

     

     

     

    在micro-service-api-gateway工程中,去除application.yml中的zuul网关路由配置。并新增bootstrap.yml,加入配置中心的config。

     

    同时,还需要在pom.xml中加入spring-cloud-config-client依赖。

     

    重启配置中心微服务和网关微服务micro-serivce-api-gateway,再访问http://localhost:8484/product-service/product/1网关地址,可以看到结果。

    访问结果:

     

    {"id":1,"name":"mobile"}

     

     

    展开全文
  • Spring Cloud Alibaba | Gateway基于Nacos动态网关路由

    千次阅读 热门讨论 2019-09-03 08:44:01
    Spring Cloud Alibaba | Gateway基于Nacos动态网关路由 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Greenwich.SR2 Spring CLoud Alibaba:2.1.0.RELEASE 前面几篇文章我们介绍了...

    Spring Cloud Alibaba | Gateway基于Nacos动态网关路由

    本篇实战所使用Spring有关版本:

    SpringBoot:2.1.7.RELEASE

    Spring Cloud:Greenwich.SR2

    Spring CLoud Alibaba:2.1.0.RELEASE

    前面几篇文章我们介绍了《Nacos服务注册与发现》《Nacos配置管理》,还没看过的小伙伴们快去看一下,本篇文章是建立在这两篇文章基础上的一次实战。

    背景介绍

    在Spring Cloud微服务体系下,常用的服务网关有Netflix公司开源的Zuul,还有Spring Cloud团队自己开源的Spring Cloud Gateway,其中NetFlix公司开源的Zuul版本已经迭代至2.x,但是Spring Cloud并未集成,目前Spring Cloud集成的Spring Cloud Zuul还是Zuul1.x,这一版的Zuul是基于Servlet构建的,采用的方案是阻塞式的多线程方案,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。Spring Cloud自己开源的Spring Cloud Gateway则是基于Spring Webflux来构建的,Spring Webflux有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API, Websockets得到支持,并且由于它与Spring紧密集成,将会得到更好的开发体验。

    本文将基于Gateway服务网关来介绍如何使用Nacos的配置功能来实现服务网关动态路由。

    实现方案

    在开始之前我们先介绍一下具体实现方式:

    1. 路由信息不再配置在配置文件中,将路由信息配置在Nacos的配置中。
    2. 在服务网关Spring Cloud Gateway中开启监听,监听Nacos配置文件的修改。
    3. Nacos配置文件一旦发生改变,则Spring Cloud Gateway重新刷新自己的路由信息。

    环境准备

    首先,需要准备一个Nacos服务,我这里的版本是使用的Nacos v1.1.3,如果不会配置Nacos服务的同学,请参考之前的文章《Nacos服务中心初探》

    工程实战

    创建工程gateway-nacos-config,工程依赖pom.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.springcloud.alibaba</groupId>
        <artifactId>gateway-nacos-config</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>gateway-nacos-config</name>
        <description>gateway-nacos-config</description>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
            <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-webflux</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>io.projectreactor</groupId>
                <artifactId>reactor-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${spring-cloud-alibaba.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
    • 在使用Spring Cloud Alibaba组件的时候,在<dependencyManagement>中需配置spring-cloud-alibaba-dependencies,它管理了Spring Cloud Alibaba组件的版本依赖。

    配置文件application.yml如下:

    server:
      port: 8080
    spring:
      application:
        name: spring-cloud-gateway-server
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.44.129:8848
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    • spring.cloud.nacos.discovery.server-addr:配置为Nacos服务地址,格式为ip:port

    接下来进入核心部分,配置Spring Cloud Gateway动态路由,这里需要实现一个Spring提供的事件推送接口ApplicationEventPublisherAware,代码如下:

    @Component
    public class DynamicRoutingConfig implements ApplicationEventPublisherAware {
    
        private final Logger logger = LoggerFactory.getLogger(DynamicRoutingConfig.class);
    
        private static final String DATA_ID = "zuul-refresh-dev.json";
        private static final String Group = "DEFAULT_GROUP";
    
        @Autowired
        private RouteDefinitionWriter routeDefinitionWriter;
    
        private ApplicationEventPublisher applicationEventPublisher;
    
        @Bean
        public void refreshRouting() throws NacosException {
            Properties properties = new Properties();
            properties.put(PropertyKeyConst.SERVER_ADDR, "192.168.44.129:8848");
            properties.put(PropertyKeyConst.NAMESPACE, "8282c713-da90-486a-8438-2a5a212ef44f");
            ConfigService configService = NacosFactory.createConfigService(properties);
            configService.addListener(DATA_ID, Group, new Listener() {
                @Override
                public Executor getExecutor() {
                    return null;
                }
    
                @Override
                public void receiveConfigInfo(String configInfo) {
                    logger.info(configInfo);
    
                    boolean refreshGatewayRoute = JSONObject.parseObject(configInfo).getBoolean("refreshGatewayRoute");
    
                    if (refreshGatewayRoute) {
                        List<RouteEntity> list = JSON.parseArray(JSONObject.parseObject(configInfo).getString("routeList")).toJavaList(RouteEntity.class);
    
                        for (RouteEntity route : list) {
                            update(assembleRouteDefinition(route));
                        }
                    } else {
                        logger.info("路由未发生变更");
                    }
    
    
                }
            });
        }
    
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
            this.applicationEventPublisher = applicationEventPublisher;
        }
    
        /**
         * 路由更新
         * @param routeDefinition
         * @return
         */
        public void update(RouteDefinition routeDefinition){
    
            try {
                this.routeDefinitionWriter.delete(Mono.just(routeDefinition.getId()));
                logger.info("路由更新成功");
            }catch (Exception e){
                logger.error(e.getMessage(), e);
            }
    
            try {
                routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();
                this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
                logger.info("路由更新成功");
            }catch (Exception e){
                logger.error(e.getMessage(), e);
            }
        }
    
        public RouteDefinition assembleRouteDefinition(RouteEntity routeEntity) {
    
            RouteDefinition definition = new RouteDefinition();
    
            // ID
            definition.setId(routeEntity.getId());
    
            // Predicates
            List<PredicateDefinition> pdList = new ArrayList<>();
            for (PredicateEntity predicateEntity: routeEntity.getPredicates()) {
                PredicateDefinition predicateDefinition = new PredicateDefinition();
                predicateDefinition.setArgs(predicateEntity.getArgs());
                predicateDefinition.setName(predicateEntity.getName());
                pdList.add(predicateDefinition);
            }
            definition.setPredicates(pdList);
    
            // Filters
            List<FilterDefinition> fdList = new ArrayList<>();
            for (FilterEntity filterEntity: routeEntity.getFilters()) {
                FilterDefinition filterDefinition = new FilterDefinition();
                filterDefinition.setArgs(filterEntity.getArgs());
                filterDefinition.setName(filterEntity.getName());
                fdList.add(filterDefinition);
            }
            definition.setFilters(fdList);
    
            // URI
            URI uri = UriComponentsBuilder.fromUriString(routeEntity.getUri()).build().toUri();
            definition.setUri(uri);
    
            return definition;
        }
    }
    

    这里主要介绍一下refreshRouting()这个方法,这个方法主要负责监听Nacos的配置变化,这里先使用参数构建一个ConfigService,再使用ConfigService开启一个监听,并且在监听的方法中刷新路由信息。

    Nacos配置如图:

    Nacos配置

    {
        "refreshGatewayRoute":false,
        "routeList":[
            {
                "id":"github_route",
                "predicates":[
                    {
                        "name":"Path",
                        "args":{
                            "_genkey_0":"/meteor1993"
                        }
                    }
                ],
                "filters":[
    
                ],
                "uri":"https://github.com",
                "order":0
            }
        ]
    }
    

    配置格式选择JSON,Data ID和Group与程序中的配置保持一致,注意,我这里的程序配置了namespace,如果使用默认namespace,可以不用配置。

    这里配置了一个路由/meteor1993,直接访问这个路由会访问到作者的Github仓库。

    剩余部分的代码这里就不一一展示了,已经上传至代码仓库,有需要的同学可以自行取用。

    测试

    启动工程,这时是没有任何路由信息的,打开浏览器访问:http://localhost:8080/meteor1993 ,页面返回404报错信息,如图:

    同时,也可以访问链接:http://localhost:8080/actuator/gateway/routes ,可以看到如下打印:

    []
    

    打开在Nacos Server端的UI界面,选择监听查询,选择namespace为springclouddev的栏目,输入DATA_ID为zuul-refresh-dev.json和Group为DEFAULT_GROUP,点击查询,可以看到我们启动的工程gateway-nacos-config正在监听Nacos Server端,如图:

    笔者这里的本地ip为:192.168.44.1。监听正常,这时,我们修改刚才创建的配置,将里面的refreshGatewayRoute修改为true,如下:

    {"refreshGatewayRoute": true, "routeList":[{"id":"github_route","predicates":[{"name":"Path","args":{"_genkey_0":"/meteor1993"}}],"filters":[],"uri":"https://github.com","order":0}]}
    

    点击发布,可以看到工程gateway-nacos-config的控制台打印日志如下:

    2019-09-02 22:09:49.254  INFO 8056 --- [38-2a5a212ef44f] c.s.a.g.config.DynamicRoutingConfig      : {
        "refreshGatewayRoute":true,
        "routeList":[
            {
                "id":"github_route",
                "predicates":[
                    {
                        "name":"Path",
                        "args":{
                            "_genkey_0":"/meteor1993"
                        }
                    }
                ],
                "filters":[
    
                ],
                "uri":"https://github.com",
                "order":0
            }
        ]
    }
    2019-09-02 22:09:49.268  INFO 8056 --- [38-2a5a212ef44f] c.s.a.g.config.DynamicRoutingConfig      : 路由更新成功
    

    这时,我们的工程gateway-nacos-config的路由已经更新成功,访问路径:http://localhost:8080/actuator/gateway/routes ,可以看到如下打印:

    [{"route_id":"github_route","route_definition":{"id":"github_route","predicates":[{"name":"Path","args":{"_genkey_0":"/meteor1993"}}],"filters":[],"uri":"https://github.com","order":0},"order":0}]
    

    我们再次在浏览器中访问链接:http://localhost:8080/meteor1993 ,可以看到页面正常路由到Github仓库,如图:

    总结

    至此,Nacos动态网关路由就介绍完了,主要运用了服务网关端监听Nacos配置改变的功能,实现服务网关路由配置动态刷新,同理,我们也可以使用服务网关Zuul来实现基于Nacos的动态路由功能。

    基于这个思路,我们可以使用配置中心来实现网关的动态路由,而不是使用服务网关本身自带的配置文件,这样每次路由信息变更,无需修改配置文件而后重启服务。

    目前市面上使用比较多的配置中心有携程开源的Apollo,服务网关还有Spring Cloud Zuul,下一篇文章我们介绍如何使用Apollo来实现Spring Cloud Zuul的动态路由。

    示例代码

    Github-示例代码

    Gitee-示例代码

    展开全文
  • 一、基础复习 1、什么是SpringCloud? 答:SpringCloud是一套完美的微服务解决框架。主要做RPC远程调用框架 ...zuul接口网关:跨域、路由、拦截参数 hystrix:断路器 -- 服务雪崩效应、服务降级、熔断机制、限流 分...
  • Zuul路由网关

    2019-11-26 20:51:21
    请看上图,这里的API 路由网关服务 由Zuul实现,主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的接口细节,从来有利于保护系统的安全性; 路由配置 Zuul 路由配置 新建一个...
  • 使用路由网关统一访问接口 概述 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、熔断器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务...
  • 每个网关组包括如下四项:角色值:网关应用名前缀,用于区分网关组拥有实例:网关组实例个数网关状态:网关组当前状态网关描述:网关组描述信息,可修改二、首页首页展示网关当前的运行情况。主要包含如下部分:网关...
  • Zuul 路由网关

    千次阅读 2019-02-21 22:14:41
    Zuul 路由网关
  • 本文的核心主题是关于一个优雅的支付网关的设计方案是如何设计出来的。结合项目实战,后续会将支付网关的核心逻辑从项目中剥离出来并实现开源,以供参考。 不同公司接入的第三方支付可能不一样,有的直连微信和...
  • /** * description: * java项目www.fhadmin.org */ @Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config....
  • Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例[Ing]等。 前言介绍 为什么会有路由层?因为在微服务架构设计中,往往并不会直接将服务暴漏给调用端,而是通过...
  • Spring Cloud Hoxton 版本 gateway网关路由以及高级特性

    千次阅读 热门讨论 2020-01-06 08:48:24
    Spring Cloud Gateway 为 SpringBoot 应用提供了API网关支持,具有强大的智能路由与过滤器功能,本文将对其用法进行详细介绍。 SpringCloudGateway是SpringCloud新推出的网关框架,比较于上一代Zuul,功能和性能有...
  • Zull路由网关---SpringCloud

    万次阅读 2021-01-15 20:12:51
    Zull路由网关 概述 什么是zuul? Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的...
  • Zuul网关无法路由请求

    2020-05-29 14:39:45
    最近在做的一个需求,需要对外部访问微服务的接口进行token鉴权,想来想去还是用网关合适。因为公司原来有用的zuul网关但是没有上线,所以这次我就想把原来的网关服务整合进去。以前只看过zuul的一些资料并没有动手...
  • 本文以Zuul网关为例,以后会介绍另一个Spring Cloud推出的GateWayZuul简介Zuul的主要功能是路由转发和过滤器,路由功能是微服务的一部分,比如/api/user转发...
  • 经过上一篇我们发现nacos通过配置动态路由routes-api-gateway.yaml配置json,监听动态路由变化即可实现动态路由,非常的银杏化。 那么有的小伙伴发现配置json也比较麻烦,有没有更简单更银杏的办法? 先看一下路由...
  • 上一篇使用了springcloud 一代网关 zullfilter 的拦截和路由,这一篇将使用springcloud新一代网关 gateway 来进行参数拦截,路由,限流,熔断等操作。 首先我们看下pom.xml ,不同版本,可能会有不同的坑,操作基于...
  • API网关路由功能

    2020-05-13 18:07:35
    说一下题外话,路由这个东西,大家常见的可以想到路由器。 比如我访问百度,首先本地网络会经过多层路由最终找到...步入正题,以zuul网关作为例子 Zulu.routes.api-a=serveceIdA zuul.routes.api-b=serviceIdB 可以理解
  • 过滤 路由 微服务网关概述 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的...
  • SpringCloud Gateway是SpringCloud技术栈下的网关服务框架,在基于SpringCloud的微服务环境中,外部请求会到达SpringCloud Gateway应用,该应用对请求做转发、过滤、鉴权、熔断等前置操作 Spring Cloud GateWay天⽣...
  • Spring Cloud Zuul Spring Cloud Zuul 路由是微服务架构的不可或缺的一部分,提供动态路由、监控、弹性、...在构建服务网关之前,我们先准备一下网关内部的微服务,可以直接使用前几篇编写的内容,比如: eureka pr...
  • Zuul路由网关(Zuul路由映射配置+请求过滤配置)Zuul路由网关简介及基本使用...请看上图,这里的API 路由网关服务 由Zuul实现,主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的
  • 也就是说,不是直接请求各个业务接口的微服务,而是在上层又加了一层逻辑,进行一些请求的过滤、控制、路由等。 新建一个Maven工程,加入SpringBoot和SpringCloud的依赖,并加入Zuul依赖。 新建Application...
  • 前言上文我们简单阐述了一下接入层网关的实现原理不少人对 Java 网关的实现也比较感兴趣,所以这篇文章我们来简单谈谈 Java 应用网关设计,本文将会从以下几个方面来阐述 Java 应用...
  • 网关路由Gateway网关路由(个人理解)新建一个模块`cloud-gateway`项目 网关路由(个人理解) 根据其他的Blog和官网解释自己总结: 1、如上一篇blog说写的,ribbon+resttemplate方式消费服务或者feign方式消费服务...
  • 请看上图,这里的API 路由网关服务 由Zuul实现,主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的接口细节,从来有利于保护系统的安全性; 路由配置 我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,339
精华内容 8,535
关键字:

java接口网关路由

java 订阅