1.微服务架构所面临的问题?

1)针对某个功能,客户端在微服务架构的情况下需要请求多个模块接口

2)针对于身份认证、日志、流量控制等公共模块每个微服务都需要做一遍,不利于业务与非业务的拆分

针对于这些问题,Zuul可完美解决,我们可用Zuul做:

1)客户端只需要知道网关而不需要知道具体模块的地址,所有服务由网关对外提供

2)身份认证类的东西单独抽象出来,业务模块只做业务

2.Zuul网关构建

1)在SpringBoot工程 part-1-website 中添加依赖,如下

     <!-- spring-cloud-starter-hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency><parent><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Dalston.SR1</version><relativePath /></parent>

2)在Application上添加@EnableZuulProxy注解,开启Zuul网关服务

@EnableZuulProxy
public class WebsiteApp {
}

3)设置该工程应用名称、端口号等信息

# 应用名称
spring:application:name: part-1-website
#端口
server:port: 1102

以上即成功构建应用,以下为请求路由方式

3.Zuul的几种请求路由方式

准备工作:

1)启动一个高可用的Eureka-server

2)创建一个服务应用,以对外提供接口服务

3)复制一份该服务端服务,除了端口号不一致其他都保持一致,尤其spring.application.name要保持一致,用于验证在外部请求到达时是否负载均衡

具体可参考笔者另一篇文章 Ribbon负载均衡的使用方式与配置方式详解_恐龙弟旺仔的博客-CSDN博客_ribbon设置负载方式

笔者在本示例中服务应用名称设置为 part-1-sms-interface ,全部四个应用启动后,访问eureka可看到

以上:PART-1-EUREKA即为高可用eureka-server;PART-1-SMS-INTERFACE即为对外服务应用,提供/sms/test服务

    1)传统路由

    * 单实例配置(通过zuul.routes.<route>.path和zuul.routes.<route>.url参数对的方式来配置)

在application.properties文件中添加路由规则即可

#route rule
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.url=http://localhost:1109/

注意:以上规则即说明,对当前website应用的所有以 /part-1-website开始的请求路径全部转发到http://localhost:1109上;

如果是请求localhost:1102/part-1-website/sms/test即会转发到localhost:1109/sms/test上,即实现对PART-1-SMS-INTERFACE的服务访问

    * 多实例配置(通过zuul.routes.<route>.path和zuul.routes.<route>.serviceId参数对的方式来配置)

在application.properties文件中添加如下路由规则即可

zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.serviceId=website
website.ribbon.listOfServers=http://localhost:1108/,http://localhost:1109/

注意:与单实例不同就是:通过serviceId和listOfServers来确定path和url的对应关系;

website读者可自定义,只要保持与listOfServers保持一致即可,servers值即PART-1-SMS-INTERFACE服务对应的应用IP:端口

    2)服务路由配置

通过Zuul和Eureka的整合,实现对服务实例的自动化维护

在这种情况下,我们不需要像传统路由那样为serviceId指定具体的服务实例地址,只需要将path和serviceId对应上

注意:实现这种方式,需要引入eureka依赖,并将zuul实例注册到eureka中

在application.properties文件中添加如下路由规则

zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.service-id=part-1-sms-interfaceeureka.client.service-url.defaultZone=http://eureka1:1001/eureka/

注意:service-id即为要调用的服务名称;需要将本应用注册到eureka

4.过滤器

过滤负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

Zuul的过滤器使用方式如下:

    1)创建一个类,继承com.netflix.zuul.ZuulFilter

public class AccessFilter extends ZuulFilter{@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext context = RequestContext.getCurrentContext();HttpServletRequest request = context.getRequest();//也可获取其他参数,如response、String token = request.getParameter("accessToken");if(StringUtils.isEmpty(token)){context.setSendZuulResponse(false);context.setResponseStatusCode(401);context.setResponseBody("has no accessToken");}return null;}@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}
}

注意:需实现ZuulFilter的abstract方法;

shouldFilter:true表示需要过滤;false表示不需要

filterType:

* pre 请求被路由之前被调用(一般做一些前置加工)

* route 在路由请求时调用(将外部请求转发到具体的服务实例上)

* post 路由请求返回时调用(包装加工返回信息)

* error 处理请求发生错误时调用

filterOrder:通过数字来表示filter的执行顺序

run:做真正的逻辑处理

    2)在Application下创建@Bean,将此Filter作为一个bean注入

 @Beanpublic AccessFilter accessFilter(){return new AccessFilter();}

    3)重启应用后,发出请求,如果request中没有添加AccessToken,则会收到报错,说明Filter生效

参考:Spring Cloud微服务实战

Zuul网关服务使用详解相关推荐

  1. 微服务架构 与 Dubbo 微服务框架、SpringCloud 微服务框架 详解

    微服务架构 与 Dubbo 微服务框架.SpringCloud 微服务框架 详解 什么是微服务架构? 微服务架构就是将单体的应用程序分成多个应用程序,这一个应用程序就组成一个服务,这多个应用程序就组成 ...

  2. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  3. Linux下的samba服务配置详解

    Linux下的samba服务配置详解 一.Samba介绍 二.Samba工具及特性 三.搭建环境介绍 四.Samba配置步骤 1.服务端操作 2.在客户端操作 五.测试用户的权限情况 一.Samba介 ...

  4. Spring Cloud Eureka 入门 (三)服务消费者详解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "真正的进步 ...

  5. apache启服务命令_Linux系统重启apache服务命令详解

    Linux系统中apache是重要的一个服务,掌握基本操作尤其重要.下面由学习啦小编为大家整理了Linux系统重启apache服务命令详解,希望对大家有帮助! Linux系统重启apache服务命令详 ...

  6. Linux 创建网页服务,Linux使用Node.js建立访问静态网页的服务实例详解

    Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,: 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.j ...

  7. ElasticSearch预警服务-Watcher详解-Schedule配置

    介绍 Watcher服务详解-定时器的设定 关于Schedule配置选择,Watcher提供了丰富的时间语法支持,采用UTC时间,来我们一起看下如何设置: 支持的设置方式: hourly:按小时周期设 ...

  8. springboot+Zuul网关服务

    springboot+Zuul网关服务 点关注不迷路,欢迎再来! 精简博客内容,尽量已专业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 网关服务有效的降低维护 ...

  9. 从零开始的Nginx详解(3)【Nginx-Https服务配置详解】

    HTTP图片服务器及HTTPS 一.HTTP图片服务器 1.使用Nginx作为图片服务器 2.配置步骤 2.配置Nginx 3.测试 二.HTTPS详解 1.ssl简介: 2.HTTPS 三.Ngin ...

最新文章

  1. 判断两个图片的特征向量_响应式布局提高篇 图片正确的打开方式
  2. Windows如何打包Qt程序
  3. 4高并发服务器:UDP局域网服务器(组播)
  4. 鳞翅目动物的诅咒:玩java.time
  5. Algorithm(1) - Karatsuba multiplication
  6. 9203-1117-实现数据库的查询功能
  7. 矩池云python2.7镜像安装opendr
  8. 未来两年九大信息安全威胁
  9. python中逻辑运算_Python 逻辑运算之 'and' 和 'or'
  10. Python原理 -- 深浅拷贝
  11. 菲克扩散(第一)定律【Fick's (First) Law of Binary Diffussion】
  12. WPS Office 2019政府定制版本 2019.1.15版
  13. JVM内存模型1.8
  14. 微信小程序图标样式的引用
  15. 《思维训练500题》
  16. 快检员计算机知识,计算机检验员(初/中/高级/技师/高技)
  17. 前端实现动画的方法总结
  18. uint16 累加_在一个驱动程序中看到uint16,uint32,unit8,int8是什么意思?有何作用?...
  19. 艺展中心七夕游园雅集,梦回长安品古韵
  20. 吉大计算机专业有名的导师,2019吉林大学计算机科学与技术学院导师简介:申铉京...

热门文章

  1. ExpandableListView讲解
  2. 空气开关A型、B型、C型、D型的区别
  3. 【干货】OJ上各种术语
  4. 双软企业的税收优惠政策
  5. 28岁程序身价过亿,从字节提前“退休”,网友:你到底挣了多少钱?
  6. 微信无法下载文件如何做提示跳转到浏览器
  7. Matlab解决脚本中中文乱码问题
  8. 为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例
  9. ps 的一些常见的键位技巧
  10. C++虚函数概念及使用(基础)