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. Django-05模型层之单表操作1

    7.1 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开 ...

  2. 基于DALN方案C/S架构运用

    今天闲来无事,看到笔记本的蓝牙设备想着:可不可以实现电脑端播放手机端的音频. 刚刚开始想着基于蓝牙,尝试多次无解(主要原因是没有找到支持此功能的软件) 最后:有朋友建议可以研究下DALN方案解决这个需 ...

  3. Angular2 内置指令 NgFor 和 NgIf 详解

    http://www.jb51.net/article/89781.htm 在这一章节中,我们来学习如何使用Angular2来展示数据,以及如何使用它的内置指令NgFor和NgIf 首先要确保你有一个 ...

  4. webpack2的一些使用入门

    首先创建一个webpack文件夹我取名叫webpackVue(为了后续把vue集成进来) 1.首先用npm初始化一下,在这个目录下,执行npm init 2.npm install webpack - ...

  5. redis中存储小数

    在做一个活动的需求时,需要往redis中有序的集合中存储一个小数,结果发现取出数据和存储时的数据不一致 zadd test_2017 1.1 tom (integer) zrevrange test_ ...

  6. 北航软院2012级C#期末考试部分考题解答

    博主注:本渣渣水平有限,文中若有不对的地方敬请指出,谢谢. 本文中大部分图片来自老师的PPT,感谢邵老师,想要的可以点击右边QQ联系我:) 一.选择题(2*15=30) 1.In C# what is ...

  7. python学习,day3:函数式编程,带return

    return的主要作用就是,在调用的时候,能知道函数的运行情况,相当于打个标签 # coding=utf-8 # Author: RyAn Bi def test1(): print('in the ...

  8. App功能测试的注意点

    好几个月没有写博客记录学习心得了,这次回老家深夜闲来无事写一篇记录下这段时间的面试心得,这次面试过程很多面试官都问APP的有关测试,下面我就自己的认识和工作中的经验来谈谈自己对APP测试的认识: 1. ...

  9. C#集合之不变的集合

    如果对象可以改变其状态,就很难在多个同时运行的任务中使用.这些集合必须同步.如果对象不能改变器状态,就很容易在多个线程中使用. Microsoft提供了一个新的集合库:Microsoft Immuta ...

  10. 织梦dedecms5.7手机站页面首页正常其他页面显示pc页面解决方法

       最近遇到的问题,用的是织梦的dedecms从以前的版本升级上来的最新版5.7sp2,客户需要手机版的,要做一个百度的验证.   这个站首页显示算是基本正常,点开里面随便一个页面会跳转到pc页面上 ...