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. ocp题库更新,052最新考试题及答案整理-31

    31.Which two events always request the LGWR to write? A) when LGWR is notified by a server process t ...

  2. 2019中山大学程序设计竞赛(重现赛) Clumsy Keke

    Problem Description Keke is currently studying engineering drawing courses, and the teacher has taug ...

  3. zTree API中刷新树没效果

    想刷新树,但是根据API来的refresh无效 ---------------------------------------------------------------------------- ...

  4. adb命令之pm

    常用的用法: 查看已经安装的包 pm list packages 查看已经安装的包以及apk路径(-3:只看第三方应用: -s:只看系统应用) -f: see their associated fil ...

  5. 利用Logstash plugins做更多的事情

    1. 引言 之前一篇文章<Logstash 介绍及linux下部署>,我们实现了logstash的安装以及简单的控制台标准输入输出测试,那么logstash能不能做更多的事情呢?答案是肯定 ...

  6. Python报错信息收集(1)

    UnboundLocalError: local variable 'count' referenced before assignment 局部变量错误:赋值之前引用的本地变量'count' ,un ...

  7. 关于Socket通讯中的Close_wait状态

    关于Socket通讯中的Close_wait状态 文/转 编辑 编者按:使用Socket通讯,有时我们查看端口状态的时候,经常会发现Socket处于close_wait状态,从而影响系统性能,此文或许 ...

  8. javascript 私有化属性,和公共属性

    function TestClassA(name, number) { this.name = name; //public this.number = number; //public var ac ...

  9. P1117 [NOI2016]优秀的拆分

    $ \color{#0066ff}{ 题目描述 }$ 如果一个字符串可以被拆分为\(AABB\)的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串\(aab ...

  10. iOS 循环轮播框架思路

    使用3个imageview实现无线轮播的大致原理 将3个imageview添加到scrollview上面,scrollview的contensize是3个imageview的宽度,设置scrollvi ...