zoukankan      html  css  js  c++  java
  • spring cloud 网关

    想要了解spring cloud网关 就要先了解一下跨域访问

    跨域访问就是不在一个端口调用了另一个端口下的服务

    就比如我端口号为10001的微服务的页面调用了端口号为10002微服务的方法 

    显然是不合理的 系统会认为这样很危险 所以当然不允许调用 想要调用的话需要在被调用方的被调用方法上加上两句话

    当然 这样显得很繁琐 spring提供了一个注解 @CrossOrigin 加上这个注解就相当于加上了这两句话 就可以进行跨域访问

    这样做也不安全 这样就相当于把你的微服务公布到了公网 所有端口都可以进行调用

    看一下我10001端口调用10002端口服务的代码

    就是直接通过端口号/方法名来调用 虽然我们加上跨域访问后这样也能成功 但它还是有两个问题

    第一 端口号写死了 这样明显不好 

    第二 这样一来这个方法所有的端口都能调用 没有一点验证

    网关以及网关的拦截器就可以解决这两个问题

    网关就相当于路由器  

    手机和电脑都可以连接路由器发出的信号 就能进行上网 网关在分布式项目中就担任了这样一角色 

    这个例子 微服务1想要调用微服务2 我们可以直接进行调用 就像上面那种方法 但那种方法明显不好 

    如果使用网关 那么微服务1会先把请求发到网关 然后网关再查看注册中心中微服务2对应的ip地址以及项目名

    然后就会把请求发到微服务2 这就是所谓的分布式网关

    使用网关 需要先新建一个模块 gate-way 

    1.添加依赖

        compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-zuul' // 网关的依赖
        compile 'org.springframework.cloud:spring-cloud-starter-eureka' // 由于网关也是eureka的客户端 所以也需要添加eureka依赖 

    2.配置

    server:
      port: 15000 //端口号
    spring:
      application:
        name: project-gateway //项目名
    eureka:
        client:
          service-url:
            defaultZone: http://localhost:8888/eureka/
        instance:
          prefer-ip-address: true //eureka的配置 这个不多说 不会的可以参考我之前的博客 《spring cloud eureka注册中心》
    zuul:
      routes:
          project-solr:
            path: /ps/**
            serviceId: project-poppy-solr
            #url: http://localhost:10001 //这个配置是查找项目名是project-poppy-solr的项目 然后可以使用ps来访问 为什么不使用url 因为如果使用url就会写死 显然不好 这个配置也是可有可无

    3.启动类上的注解

    @SpringBootApplication //运行项目
    @EnableDiscoveryClient //使用注册中心
    @EnableZuulProxy //使用网关

    然后我们调用别的端口的方法就变成了这样

    访问就是先通过网关的端口 运行看一下 

    访问成功 但这样别人就可以通过你的网关来调用你所有的微服务 比较危险 所以就需要使用拦截器来做必须的身份验证等 

    想要调用别的微服务有三个步骤 

    1.微服务1发送请求到网关  2.网关把请求转发到对应微服务 3.微服务返回结果 

    了解了访问的步骤 来看一下拦截器怎么写 

    package org.poppy.gateway.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    
    @Component
    public class PoppyFilter extends ZuulFilter { //拦截器需要继承ZuulFilter 
        //拦截器拦截请求的那一步
        @Override
        public String filterType() {
    
            //pre 在请求被路由拿到之前拦截
            //route 路由请求服务端时拦截
            //post 服务端返回结果到路由时拦截
            //error 服务端返回结果到路由器并发生异常时拦截
            return "pre";
        }
    
        //可能一个项目会有很多拦截器 拦截器执行的顺序 数值越小越先执行
        @Override
        public int filterOrder() {
            return 0;
        }
    
        //拦截器是否启动
        @Override
        public boolean shouldFilter() {
            return true;
        }
     
        //拦截后做的事情 这个方法就是判断你是否登陆了 如未登陆就显示401
        @Override
        public Object run() {
            RequestContext ctx=RequestContext.getCurrentContext();
            HttpServletRequest request=ctx.getRequest();
            String accessToken= request.getParameter("");
            if(accessToken==null){
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(401);
            }
            return null;  //这里它返回值是什么都无所谓 因为spring还未实现
        }
    }

     之后需要在zuul的启动类上写上一个引入拦截器的方法

    @Bean
        public PoppyFilter accessFilter(){
            return  new PoppyFilter();
        }

    就可以正常运行拦截器了 

    再运行上面的方法就会显示401 没有权限

    这样拦截器就生效了

    以上就springcloud网关

  • 相关阅读:
    win10-wifi无线共享自动关闭解决
    可用的nlog配置
    cmake 常用指令,变量
    window时间服务
    命令行配置服务启动类型
    boost流gzip压缩
    mysql 查询某表的所有列,获取毫秒时间戳
    system进程占用80端口
    centos8重新分区(减小/home空间,增大root空间)
    emqx使用data_to_webservice方式配置规则引擎简单实践
  • 原文地址:https://www.cnblogs.com/wangkee/p/9324819.html
Copyright © 2011-2022 走看看