SpringCloud 学习(5) --- Zuul(一)基本概念、配置

[TOC]

Spring Cloud

  • eureka:注册中心
    • 服务端:提供注册
    • 客户端:进行注册
  • ribbon:负载均衡(集群)
  • Hystrix:熔断器,执行备选方案
  • Feign:远程调用
  • Zuul:网关,统一入口。

1.1、一夫当关,万夫莫开---Zuul网关

  • 网关:程序统一入口。主要功能:服务分发(动态路由),服务鉴权等

    • Zuul是Netflix孵化的一个致力于"网关"的解决方案的开源组件

    • Zuul在动态路由、监控、弹性、服务治理、安全等方面有着重要作用。

    • Zuul底层是Servlet,本质组件是一系列Filter构成的责任链

Zuul具备的功能

  • 认证、鉴权
  • 压力控制
  • 灰度发布
  • 动态路由
  • 负载削减
  • 静态响应处理
  • 主动流量控制

1.2、Zuul入门案例--路由转发

  • 需求
//已有访问路径
http://localhost:8080/user
//通过网关希望访问路径
http://localhost:10010/service/user 

面向服务的路由

创建zuul_demo

pom

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--添加eureka客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> 

yml

server:
  port: 10010
spring:
  application: name: zuuldemo2 #网关配置:访问路径 和 服务路径 对应关系 zuul: preifx: /api routes: userservice: path: /userservice/** #访问路径 #url: http://localhost:8080 #服务路径 serviceId: userservice #服务名称时 #eureka配置 eureka: client: service-url: defaultZone: http://localhost:10086/eureka 

开启网关代理注解@EnableZuulProxy

package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; /** * @author 庭前云落 * @Date 2019/12/12 17:01 * @description */ @SpringBootApplication @EnableZuulProxy //开启zuul代替 @EnableEurekaClient //开启eureka客户端 public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class,args); } } 

1.3、路由前缀

  • 路由前缀:用于维护版本号或项目名

  • 修改yml文件,进行配置

    zuul:
      prefix: /api
    

路由通配符

规则 解释 示例
/** 匹配任意数据量的路径与字符 /client/aa,/client/aa/bb/cc
/* 匹配任意数量的字符 /client/aa,/client/aaaaaaaaaaaaaa
/? 匹配单个字符 /client/a,/client/b,/client/c

1.4、Zuul过滤器

1.4.1概述

  • 编写过滤器,继承父类:ZuulFilter
  • 常见方法:
    • filterType() 过滤器类型,取值:"pre"
    • filterOrder() 过滤器顺序,取值:1
    • shouldFilter() 是否执行,取值:true
    • run() 执行业务逻辑

1.4.2自定义过滤器

  • 将过滤器的实现,添加到spring容器中,zuul将自动启用过滤器

    • 过滤器父类:ZuulFilter

    • 工具类(请求上下文对象):RequestContext

    • 特殊请求头:Authorization

package com.czxy.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * @author 庭前云落 * @Date 2019/12/12 18:07 * @description */ @Component public class LoginFilter extends ZuulFilter { @Override public String filterType() { return "pre"; //路由之前执行 } @Override public int filterOrder() { return 1; //排序 } @Override public boolean shouldFilter() { return true; //是否进行过滤,true将执行run()方法 } @Override public Object run() throws ZuulException { //获得一个特殊请求头,判断是否有值:有返回null(放行),没有 响应状态码401 //1 获得工具类 (获得上下文对象) RequestContext requestContext = RequestContext.getCurrentContext(); //2 通过工具类 获得请求对象 HttpServletRequest request = requestContext.getRequest(); //3 通过request对象获得特殊请求头 String token = request.getHeader("authorization"); //判断 if(token == null || "".equals(token)) { //没有token返回401,关闭响应 requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(401); } //放行 return null; } } 
 来源: SEO公司

猜你喜欢

转载自www.cnblogs.com/1994jinnan/p/12037483.html
今日推荐