zoukankan      html  css  js  c++  java
  • Spring Cloud实战之初级入门(六)— 服务网关zuul

    1.环境介绍

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

    2.api网关服务

    2.1 创建工程

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

    • 配置文件中加入
    server:
      port: 5001
    
    spring:
      application:
        name: service-gateway-zuul
    
    zuul:
      routes:
        baidu:
          url: http://www.baidu.com
          path: /api/**
    
    • 为启动文件加入@EnableZuulProxy注解
    • 启动服务,访问http://localhost:5001/api/,你会看到页面重定向到百度了。那么我们zuul的配置就完了。

    2.2 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-path}

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

    2.3 api网关中使用token机制

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

    • 创建“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;
    	}
    }
    
    • 在启动文件中加入如下代码:
    	@Bean
    	public ZuulFilter putFilter() {
    		return new ValidateTokenFilter() ;
    	}
    
    • 这里我们可以看到如果访问的参数中带有token,且token的值为true,api网关才会路由,如果不带token,那么路由失败,并访问状态为400的错误。

    2.4 测试

    • 访问http://localhost:5001/service-consumer/consumerHelloWorld?name=rose,我们可以看到访问被拒绝。
    • 访问http://localhost:5001/service-consumer/consumerHelloWorld?name=rose&token=true,我们就可以看到访问的效果。

    2.5 小结

    • 如果不使用api网关,那么当我们的微服务足够多的时候,我们无法以一下统一的地址对外提供服务。
    • 没有api网关,那么我们的所有的服务需要鉴权必须要散落到每一个工程里面。无法统一管理。

    3.一点点重要的事情

  • 相关阅读:
    快速排序(详解)
    14.linux-platform机制实现驱动层分离(详解)
    13.Linux键盘按键驱动 (详解)
    Linux-hexdump命令调试event驱动—详解(13)
    Android开发final的用法
    Android控件RecyclerView的基本用法
    搜索关键词分析——以个人博客网站为例
    java.net.SocketException: Software caused connection abort: socket write error
    Android layout属性大全
    java中 label 配合 break continue 使用方法
  • 原文地址:https://www.cnblogs.com/yb2020/p/10269649.html
Copyright © 2011-2022 走看看