在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:

 
注意:A服务和B服务是可以相互调用的,作图的时候忘记了。并且配置服务也是注册到服务注册中心的。

在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),然后再到具体的服。,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理(下一篇文章讲述),配置服务的配置文件放在git仓库,方便开发人员随时改配置。

一、Zuul简介

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

zuul有以下功能:

  • Authentication
  • Insights
  • Stress Testing
  • Canary Testing
  • Dynamic Routing
  • Service Migration
  • Load Shedding
  • Security
  • Static Response handling
  • Active/Active traffic management

二、准备工作

继续使用上一节的工程。在原有的工程上,创建一个新的工程。

三、创建service-zuul工程

其pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.forezp</groupId><artifactId>service-zuul</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>service-zuul</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RC1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:

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

加上配置文件application.yml加上以下的配置代码:

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
server:port: 8769
spring:application:name: service-zuul
zuul:routes:api-a:path: /api-a/**serviceId: service-ribbonapi-b:path: /api-b/**serviceId: service-feign

首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;以/api-a/ 开头的请求都转发给service-ribbon服务;以/api-b/开头的请求都转发给service-feign服务;

依次运行这五个工程;打开浏览器访问:http://localhost:8769/api-a/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

打开浏览器访问:http://localhost:8769/api-b/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

这说明zuul起到了路由的作用

四、服务过滤

zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;

@Component
public class MyFilter extends ZuulFilter{private static Logger log = LoggerFactory.getLogger(MyFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));Object accessToken = request.getParameter("token");if(accessToken == null) {log.warn("token is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is empty");}catch (Exception e){}return null;}log.info("ok");return null;}
}

  • filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用
    • filterOrder:过滤的顺序
    • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
    • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

这时访问:http://localhost:8769/api-a/hi?name=forezp ;网页显示:

token is empty

访问 http://localhost:8769/api-a/hi?name=forezp&token=22 ; 
网页显示:

hi forezp,i am from port:8762

转载于:https://www.cnblogs.com/kuoAT/p/9144070.html

SpringCloud学习成长之路 五 路由器网关相关推荐

  1. SpringCloud学习成长之路七 高可用配置中心

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...

  2. 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)

    学习 成长之路(初章 ) 三个月 建成微信小程序商城 .ArcEngine C# GIS开发入门 自我简介 先简单介绍一下,我是Domen,是一个彻彻底底的新手 . 大一 大学大一没好好学习,搞这搞那 ...

  3. 电子工程师学习成长之路

    背景故事 这段时间趁国庆假期,回家接了个婚,所以没时间更新文章了,也没带电脑,就给大家分享一下电子工程师的学习成长之路吧,希望能让大家受益. 学习建议 对于电子工程师学习成长有以下几个建议: 1 兴趣 ...

  4. SpringCloud学习笔记(八)Gateway 网关

    目录 一.Gateway简介 1.官网 2.是什么 3.能干嘛 4.有Zuul了怎么又出来了gateway 5.Gateway特征 6.SpringCloudGateway与Zuul的区别: 7.Zu ...

  5. 我在亚马逊云平台的学习成长之路

    前言 今年是亚马逊云科技成立的第16个年头,也是云计算行业诞生的16周年.作为云计算时代的"领头羊",亚马逊2006年推出了名为Amazon Web Services(AWS)的新 ...

  6. WebRTC学习进阶之路 --- 五、WebRTC网络知识详解(三)(最全流媒体协议(RTP/RTCP/RTSP/RTMP/MMS/HLS/HTTP/ HTTP-FLV(HDL)/SDP)

    WebRTC学习进阶之路系列总目录:https://blog.csdn.net/xiaomucgwlmx/article/details/103204274 RTP:实时传输协议(Real-time ...

  7. 记录自己的学习成长之路!

    Hello everyone 我是 BaldCub~ 自我介绍: 我来自山西,在读本科大二学生,专业是计算机科学与技术,在没有上大学的时候就突然的变成了秃秃仔 ,也刚好选择了计算机专业.哈哈哈哈哈或许 ...

  8. java在线学习系统源码_java学习成长之路(基础,源码,项目,实战)

    获取一下学习资源请关注微信公众号:Java编程指南 我为自学编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么疑问 ...

  9. 秦朋 - 我的PHP学习成长之路

    作为世界上最好的语言,靠着简洁.易用.学习成本低等诸多闪耀的优势,PHP俘获了众多开发者的心,然而很多PHPer在工作几年熟悉了PHP之后,觉得对业务熟悉了.没有挑战了.触到天花板了.那么PHP真的有 ...

最新文章

  1. 4 种数据库缓存最终一致性的优缺点对比?最终选择方案四!
  2. Python中Queue.get()方法阻塞
  3. 启动postgres
  4. 史陶比尔与机器人之父
  5. 用Python分析了20万场吃鸡数据,有不少有趣的发现
  6. Linux VIM 程序中有游离的‘\357’ ‘\274’错误
  7. 窗口闪退_今天只讲一件事,精雕软件的BUG(进浮雕闪退,笔刷变圈圈等)
  8. python---基础知识
  9. js 取得数组下标_剖析JS和Redis的数据结构设计:数组
  10. WPF ----在UserControl的xaml里绑定依赖属性
  11. ASP.NET路由系统实现原理:HttpHandler的动态映射
  12. jquery实现同时展示多个tab标签+左右箭头实现来回滚动
  13. mset redis_Redis MSET 命令
  14. 【泡咖啡1】linux下caffe编译以及python环境配置手记
  15. MySQL Workbench 已停止工作 错误模块名称: KERNELBASE.dll 异常代码: 0xe0434352 程序无法正常启动:( 0xc000007b)
  16. 远程开机(外网WOL远程唤醒)
  17. 一种基于知识图谱的新闻推荐模型
  18. Win10+vs2017跑yolov3
  19. 深度学习部署:Windows安装pycocotools报错解决方法
  20. 身体检查 生化全套 血常规 微量元素

热门文章

  1. 解决vscode之前好好的能连接上linux服务器,后来报错,窗口出现故障
  2. 获取cookie,删除cookie,添加cookie
  3. HTTP和HTTPS的了解
  4. 乘法运算-快速傅里叶变换
  5. Ubuntu16.04-LTS升级到18.04
  6. Qt5.2 for Android 配置及部署到手机运行
  7. mysql表去掉回车、换行
  8. hdfs web_ui深入讲解、服务启动日志分析、NN SNN关系
  9. 关闭本机的代理服务(Proxy)
  10. 双系统,重装windows后修复linux的grub启动