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.一点点重要的事情

Spring Cloud实战之初级入门(六)— 服务网关zuul的更多相关文章

  1. Spring Cloud实战之初级入门(四)— 利用Hystrix实现服务熔断与服务监控

    目录 1.环境介绍 2.服务监控 2.1 加入依赖 2.2 修改配置文件 2.3 修改启动文件 2.4 监控服务 2.5 小结 3. 利用hystrix实现消费服务熔断 3.1 加入服务熔断 3.2 ...

  2. Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新

    目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...

  3. Spring Cloud学习笔记【八】服务网关 Zuul(过滤器)

    在上篇文章中我们了解了 Spring Cloud Zuul 作为网关所具备的最基本功能:路由(Router),下面我们将关注 Spring Cloud Zuul 的另一核心功能:过滤器(Filter) ...

  4. Spring Cloud学习笔记【七】服务网关 Zuul(路由)

    Spring Cloud Zuul 路由是微服务架构的不可或缺的一部分,提供动态路由.监控.弹性.安全等的边缘服务.Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器. 准 ...

  5. Spring Cloud系列(五):服务网关Zuul

    在前面的篇章都是一个服务消费者去调用一个服务提供者,但事实上我们的系统基本不会那么简单,如果真的是那么简单的业务架构我们也没必要用Spring Cloud,直接部署一个Spring Boot应用就够了 ...

  6. Spring Cloud架构教程 (三)服务网关(基础)

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

  7. Spring Cloud架构教程 (五)服务网关(过滤器)

    过滤器的作用 通过上面所述的两篇我们,我们已经能够实现请求的路由功能,所以我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了.但是,每个客户端用户请求微服务应用提供的接口时,它们 ...

  8. Spring Cloud架构教程 (四)服务网关(路由配置)

    传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由. 没有Eureka和Consul的服 ...

  9. SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心

    目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...

随机推荐

  1. chromium 安裝 flash

    CentOS yum install chromium-pepper-flash Debian apt-get install chromium-pepper-flash archlinux pacm ...

  2. uC/OS-II 函数之内存管理相关函数

    上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC ...

  3. Python爬取网上车市[http://www.cheshi.com/]的数据

    #coding:utf8 #爬取网上车市[http://www.cheshi.com/]的数据 import requests, json, time, re, os, sys, time,urlli ...

  4. 使用cookie下次自动登录

    登录时勾选了自动登录处理: 1.加密账号和IP,保存在cookie中,cookie('auto', $value, $time) 2.解密cookie,取出账号和上次IP,判断上次IP==当前IP.账 ...

  5. AlvinZH掉坑系列讲解(背包DP大作战H~M)

    本文由AlvinZH所写,欢迎学习引用,如有错误或更优化方法,欢迎讨论,联系方式QQ:1329284394. 前言 动态规划(Dynamic Programming),是一个神奇的东西.DP只能意会, ...

  6. jquery 实现动画效果(各种方法)

    1.show()和hide()和toggle()(这是show和hide的一个综合,一个按钮就实现显示和隐藏) 效果: 代码: <button type="button" c ...

  7. Angular material mat-icon 资源参考_Toggle

    ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ...

  8. 洛谷 P3204 [HNOI2010]公交线路

    题面 luogu 题解 矩阵快速幂\(+dp\) 其实也不是很难 先考虑朴素状压\(dp\) \(f[i][S]\) 表示最慢的车走到了\(i\),\([i, p+i-1]\)的覆盖情况 状态第一位一 ...

  9. Linux 高级安全SELinux的关闭

    Linux有一个高级安全组件,如果开启会输出打了的日志文件messages.如下: 导致/var/log/messages 达到11g root@cpp11 ~]# df -l文件系统         ...

  10. 微信 vue中使用video.js播放m3u8视频,解决安卓自动全屏的问题。

    最近一个项目中需要在微信中播放m3u8格式的视频,刚开始用了 vue-video-player 这个插件,在IOS手机体验良好,本以为完事了, 结果安卓手机一点播放就自动全屏,心态略崩.查了资料说是安 ...