SpringCloud学习成长之路 五 路由器网关
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:
注意: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学习成长之路 五 路由器网关相关推荐
- SpringCloud学习成长之路七 高可用配置中心
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...
- 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)
学习 成长之路(初章 ) 三个月 建成微信小程序商城 .ArcEngine C# GIS开发入门 自我简介 先简单介绍一下,我是Domen,是一个彻彻底底的新手 . 大一 大学大一没好好学习,搞这搞那 ...
- 电子工程师学习成长之路
背景故事 这段时间趁国庆假期,回家接了个婚,所以没时间更新文章了,也没带电脑,就给大家分享一下电子工程师的学习成长之路吧,希望能让大家受益. 学习建议 对于电子工程师学习成长有以下几个建议: 1 兴趣 ...
- SpringCloud学习笔记(八)Gateway 网关
目录 一.Gateway简介 1.官网 2.是什么 3.能干嘛 4.有Zuul了怎么又出来了gateway 5.Gateway特征 6.SpringCloudGateway与Zuul的区别: 7.Zu ...
- 我在亚马逊云平台的学习成长之路
前言 今年是亚马逊云科技成立的第16个年头,也是云计算行业诞生的16周年.作为云计算时代的"领头羊",亚马逊2006年推出了名为Amazon Web Services(AWS)的新 ...
- 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 ...
- 记录自己的学习成长之路!
Hello everyone 我是 BaldCub~ 自我介绍: 我来自山西,在读本科大二学生,专业是计算机科学与技术,在没有上大学的时候就突然的变成了秃秃仔 ,也刚好选择了计算机专业.哈哈哈哈哈或许 ...
- java在线学习系统源码_java学习成长之路(基础,源码,项目,实战)
获取一下学习资源请关注微信公众号:Java编程指南 我为自学编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么疑问 ...
- 秦朋 - 我的PHP学习成长之路
作为世界上最好的语言,靠着简洁.易用.学习成本低等诸多闪耀的优势,PHP俘获了众多开发者的心,然而很多PHPer在工作几年熟悉了PHP之后,觉得对业务熟悉了.没有挑战了.触到天花板了.那么PHP真的有 ...
最新文章
- 4 种数据库缓存最终一致性的优缺点对比?最终选择方案四!
- Python中Queue.get()方法阻塞
- 启动postgres
- 史陶比尔与机器人之父
- 用Python分析了20万场吃鸡数据,有不少有趣的发现
- Linux VIM 程序中有游离的‘\357’ ‘\274’错误
- 窗口闪退_今天只讲一件事,精雕软件的BUG(进浮雕闪退,笔刷变圈圈等)
- python---基础知识
- js 取得数组下标_剖析JS和Redis的数据结构设计:数组
- WPF ----在UserControl的xaml里绑定依赖属性
- ASP.NET路由系统实现原理:HttpHandler的动态映射
- jquery实现同时展示多个tab标签+左右箭头实现来回滚动
- mset redis_Redis MSET 命令
- 【泡咖啡1】linux下caffe编译以及python环境配置手记
- MySQL Workbench 已停止工作 错误模块名称: KERNELBASE.dll 异常代码: 0xe0434352 程序无法正常启动:( 0xc000007b)
- 远程开机(外网WOL远程唤醒)
- 一种基于知识图谱的新闻推荐模型
- Win10+vs2017跑yolov3
- 深度学习部署:Windows安装pycocotools报错解决方法
- 身体检查 生化全套 血常规 微量元素