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. DatagridView 控件列顺序与设置的不一样

    解决方案如下 : 1. dataGridView1.AutoGenerateColumns = false; 2. 绑定的dataSource 中所有的列都要写进去(列一定是绑定的模型中属性) 先在界 ...

  2. 【Oracle】安装注意事项

    装了卸载,卸载装,一会儿缺少配置功能,一会对一些莫名的命令操作不能顺利执行.于是还是选择了重装系统.(策略,与其纠结那些个抛错命令和那些烦人的长长的日志,不如重新装系统,这个绝对是最省时间的) 1.安 ...

  3. [ActionScript 3.0] 与C#通信方法fscommand

    与C#通信的方法之一 flash.system.fscommand(command:String, args:String=""):void, command 传递给主机应用程序的 ...

  4. <转>jmeter JDBC Request之Query Type

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  5. CF765F Souvenirs 离线+线段树+主席树

    $ \color{#0066ff}{ 题目描述 }$ A县旁,连绵着一条长度为 n 的山脉,这条山脉由 n 座山峰组成,第 i 座山 峰的高度为 ai.作为著名的旅游县城,每天来到山脉游玩的旅客络绎不 ...

  6. QQ第三方登陆示例

    先上图 若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现.注册方法可参考链接http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E ...

  7. 基础篇:6)形位公差标注(GD&T标准)-总章

    本章目的:理解GD&T概念,读懂和绘制GD&T图纸.本章是GD&T指引章节. 1.GD&T概念 GD&T  是 Geometric  Dimensioning ...

  8. 描边shader(法线外拓)

    描边的思路是需要两个pass.第一个pass让顶点沿着法线方向延伸出去,使得模型变大一圈.第二个pass正常渲染,让正常渲染的模型挡在第一个pass之上,这样就会露出延伸出去的部分,延伸出去的就是我们 ...

  9. ubuntu 16.04 tensorboard 学习

    一.新建tensorboard的文件夹,并在该文件夹下打开终端进入python输入以下代码 ////////新建文件夹取名tensorboard 在该目录下打开终端 import tensorflow ...

  10. DataBind()方法实现数据绑定

    在为.aspx页上的对象设置了特定数据源之后,必须将数据绑定到这些数据源上.可以使用“Page.DataBind()”或“控件.DataBind()”方法将数据绑定到数据源上. 主要差别在于:调用Pa ...