想要了解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网关