springCloud 三. 集成Zuul路由网关控制

1. Zuul 路由网关介绍

其实我们可以吧zuul看成,是公司的前台,我在在做使用zureka做完分布式操作之后呢,我们会发现这些端口我们都可以直接连接,那么既然能直接连接肯定不行,所以我们需要统一管理这些端口,用一个端口去调用这些端口,而Zuul就是解决这个问题的.

具体功能:

  • 外部访问统一入口
  • 过滤功能

也即以后的访问微服务都是通过Zuul跳转后获得

所以我们也需要把zuul注册Eureka

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zl5ykcm9-1570769868038)(8D8C02577D8145C5AD0DCE9889147BFC)]

2.统一管理功能

2.1 依赖配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2.2 application.yml配置

server:
  port: 9000

#注册到eureka上的服务名
spring:
  application:
    name: ms-zuul

eureka:
  client:
    #表示是否从注册中心抓取服务
    fetch-registry: true
    # 是否将我这个服务注册到注册中心
    register-with-eureka: false
    # 表示注册中心的地址(自己的eureka)
    service-url:
      defaultZone: http://localhost:7961/eureka/

2.3 启动类配置

加上 @EnableZuulProxy 这个注解

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
    public static void main( String[] args ) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

接下来我们就可以直接通过zuul的端口去调用euerka注册的类了

具体流程↓

http://localhost:9000/shop-provider/ticket/23

记得端口后面跟注册的服务名,接着注册的网名

从上面的结果我们可看出zuul基本配置成功,但是同时会有一个问题,就是服务名暴露出来了,所以下面我们来看看统一网关设置

3 网关过滤

3.1 application.yml配置

server:
  port: 9000

#注册到eureka上的服务名
spring:
  application:
    name: ms-zuul

eureka:
  client:
    #表示是否从注册中心抓取服务
    fetch-registry: true
    # 是否将我这个服务注册到注册中心
    register-with-eureka: false
    # 表示注册中心的地址
    service-url:
      defaultZone: http://localhost:7961/eureka/
      
      
#过滤部分↓  
zuul:
  routes:
    shop-provider:   #这个名字可以随便命名,通常定义为每个微服务中的spring.application.name的值
      serviceId: shop-provider  #该值必须为spring.application.name的值
      path: /tk/**              #可以通过该路径访问服务
    shop-consumer:
      serviceId: shop-consumer
      path: /us/**
  prefix: /v1   #前缀
  ignored-services: "*" #通过该服务名访问不了
  

3.2 实现方法

写一个类 继承 ZuulFilter 实现具体过滤方法

注意: 我这里给了一个判断值需要在headers 中给定这个token 不然一样还是会被拒绝

@Component
public class ZuulFilterImpl extends ZuulFilter {

    /**
     * pre     在达到具体的服务之前
     * post    在达到具体的服务之后
     * error   抛出异常
     * route   具体服务在执行的过程中
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 执行顺序  越小越前
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否开启过滤
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤具体内容
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        // token
        //获取RequestContext对象,目的是只能通过该对象来获取 request、response对象
        RequestContext context = RequestContext.getCurrentContext();

        HttpServletRequest request = context.getRequest();
        HttpServletResponse response = context.getResponse();

        String token = request.getHeader("token");

        if(token == null || "".equals(token.trim())) {
            // 如果判断满足就false, 目的是用我们自己定义的响应格式
            context.setSendZuulResponse(false);

            // 返回的数据 可以是json数据 用来回复
            context.setResponseBody("一个不合法的请求.");

            // 返回状态码 例如 404 500 等等
            context.setResponseStatusCode(HttpStatus.FORBIDDEN.value());

            //修改编码方式  (可有可无 如果有乱码建议可以来一个,但是不一定有用 ( =A =~ ) )
            response.setCharacterEncoding("gbk");
        }
        return null;
    }
}

 课程目标:你将对研发框架的代码封装和开发规范制定的底层实现逻辑有所掌握,并形成自己的开发封装套路,告别CRUD课程简介:   1. 课程背景: 能帮你解决什么问题?企业中通常由架构师搭建好开发框架,里面包含了很多封装好的基础结构,日志规范以及响应的异常统一处理,还有相应的参数校验等。很多初中高级开发工程师没有机会接触这部分代码的逻辑,而这部分代码逻辑又是非线性的,单纯看代码逻辑是看不出来执行顺序的,需要大量调试总结。不像mvc代码结构,你知道从Controller层看到Service再到Dao层,而这样底层的基础性代码则像积木,不熟悉的前提下需要一块块的插入拔出,不断总结,而沿着本课程的顺序梳理与实战你将会豁然开朗。市面上的大多文章结构较散,并且处理不够全面,比如返回结构通常是 具体的正例与反例日志统一处理 统一异常处理及特殊的情况处理 参数优雅校验 1基础的校验 2. 自定义校验 3.分组校验最重要的是给大家捋顺了一个清晰的实现结构以上在我们后面章节Spring Boot HelloWorld的至少10个可扩展点里有更多的相关介绍,在核心章节里有更细致的讲解实现。理解框架升级底层逻辑: 全网首套基于Spring Boot 3.x+Java 17开发系列 SpringBoot3的升级背景和路线逻辑掌握代码重构及编码效率提升技巧学习基于最为前沿的Spring Boot 3.x 和 Java 17 开发代码依赖于Spring Boot 3.x Java 17环境开发穿插相应新版本的变化讲解可编写完成一个生产级开发规范框架的制定 包含不限于 统一响应结构统一异常处理基于ThreadLocal处理请求RequestId基于日志框架的MDC 统一记录日志统一状态码处理Filter中的异常及状态码处理,以及日志的完整性处理自定义优雅参数校验学习源码剖析方式方法等等 3. 课程规划1.  课程章节规划 2. 讲课方式代码实战为主+图文演示为辅例如说明后端校验的重要性 以一张图清晰明了的展示说明解答了为何前端有了前端校验还要后端校验的问题 3. 特别说明本课程所有代码使用版本会随着Spring Boot 3.x的开发进度而更新,直到Spring Boot 3.x的正式版本发布,可放心食用本课程的重点会侧重放在研发框架的基础规范编码上,并非专注于SpringBoot3.x和Java17的新特性上讲解。主要是两点原因,1课程的方向侧重点, 2. SpringBoot3.x 官方尚处于MileStone/Snapshot版并未Release,所以大家可关注本人编程燃风后续的产品课程。本课程代码同样适用于Spring Boot 1.x 2.x 只需微调API和相关库版本的即可(注意1.x已经归档不维护) 常见问题:问:是否讲解Java17和SpringBoot3新特性答:本课程的重点会侧重放在研发框架的基础规范编码上,并非专注于SpringBoot3.x和Java17的新特性上讲解。主要是两点原因,1课程的方向侧重点是框架基础规范编码实战 2. SpringBoot3.x 官方尚处于MileStone/Snapshot版并未Release,所以大家可关注本人编程燃风后续的讲解课程。问:代码仅限于SpringBoot3吗? SpringBoot2和SpringBoot1是否适用?答:本课程代码同样适用于Spring Boot 1.x 2.x 只需微调API和相关库版本的即可(注意1.x已经归档不维护)。另外本课程重点讲解代码封装和底层实现逻辑和具体API版本关联不大,只是基于最新的SpringBoot3和Java17实现而已,请放心使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值