This website requires JavaScript.

Spring Cloud初级实战教程(六)

2020年07月17日 10时54分 字数 3293 阅读 7 喜欢(0) 评论(0) 标签 Spring Cloud初级教程

目录

1.环境介绍

好了,不知不觉中我们已经来到了最后一篇文章,也来到了最一个工程"mirco-service-zuul",zuul是一个服务网关,虽然现在spring也出了spring cloud gateway,相信有很多之前就使用spring cloud的公司依然使用的是zuul;看完这六篇文章相信有点基础的小伙伴们应该能自己做点东西了,当然spring cloud这个系列远远还没有说完,后面我计划在春节前后开源一个最小化的微服务的手脚架项目,使用spring cloud来做实战演练。

2.api网关服务

因为api网关是一个比较独立的东西,基本不需要对原有的工程进行改造。

  • 配置文件中加入
server:
  port: 5001

spring:
  application:
    name: service-gateway-zuul

zuul:
  routes:
    baidu:
      url: http://www.baidu.com
      path: /api/**
  • 主要是配置文件的改动,改动后的application.yml配置文件如下
server:
  port: 5001

spring:
  application:
    name: service-gateway-zuul

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9001/eureka/
  • 启动文件改造如下:
@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class MircoServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(MircoServiceZuulApplication.class, args);
    }
}

因为服务化改造后,zuul会自动代理所有eureka上的服务,访问格式如下:
http://localhost:5001/{service-id}/{app-...

  • 这里service-id指的是应用的id,就像前面我们一直所说的,spring.application.name这个名字的重要性。
  • 这里app-path指的是你服务对应的访问目录。

api网关中,可以在请求被路由之前调用,四种状态 pre、routing、POST、error,这四种状态的意思大家可以自行去了解一下。我们要使用的是pre状态。

  1. 创建“com.example.cloud.zuul.filter.ValidateTokenFilter”类,具体实现如下:
public class ValidateTokenFilter extends ZuulFilter{

    @Override
    public boolean shouldFilter() {
        // 是否执行此过滤
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 处理过程
        RequestContext context = RequestContext.getCurrentContext() ;
        HttpServletRequest request = context.getRequest() ;

        Boolean bool = Boolean.valueOf(request.getParameter("token")) ;

        if(bool) {
            context.setSendZuulResponse(true) ; //是否路由
            context.setResponseStatusCode(200);
            context.set("isSuccess", true);

        }else {
            context.setSendZuulResponse(false) ; //是否路由
            context.setResponseStatusCode(400);
            context.set("isSuccess", false);
        }

        return null;
    }

    @Override
    public String filterType() {
        return "pre"; // 可以在请求被路由之前调用,四种状态 pre、routing、POST、error
    }

    @Override
    public int filterOrder() {
        // 执行顺序
        return 10;
    }
}
  1. 在启动文件中加入如下代码:
    @Bean
    public ZuulFilter putFilter() {
        return new ValidateTokenFilter() ;
    }
  1. 这里我们可以看到如果访问的参数中带有token,且token的值为true,api网关才会路由,如果不带token,那么路由失败,并访问状态为400的错误。
  • 如果不使用api网关,那么当我们的微服务足够多的时候,我们无法以一下统一的地址对外提供服务。
  • 没有api网关,那么我们的所有的服务需要鉴权必须要散落到每一个工程里面。无法统一管理。

3.一点点重要的事情

4.迁移后记

老易花了一点点时间把所有的在外面散落的文章迁移了回来,之所以这么做的原因是因为老易2019花了一年的时间做了视频中所说的脚手架项目叫sea微服务平台(中台),目前已经在 http://www.wuhuhai.com这个公司下部署并开始了生产。

经过2019年的沉淀,2020年老易准备开始大干一场了;微信公众号已经注册好了, 访问 就可以扫码关注了。文章从2020起不会再断更,与脚手架项目开发过程中相关的文章也将持续更新。

赞赏支持

微信赞赏码

支付宝赞赏码

相关推荐

暂无推荐文章

扫码关注”隔壁老易“