热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Springcloud之Zuul网关入门

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springcloud之Zuul网关入门相关的知识,希望对你有一定的参考价值。SpringClo

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springcloud之Zuul网关入门相关的知识,希望对你有一定的参考价值。



Spring Cloud实现微服务的架构基本成型:

  使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载。

  为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。

Zuul是Netflix开源的服务网关,可以和Eureka、Ribbon、Hystrix等组件配合使用

Zuul的核心是一系列的过滤器,完成包括:



  • 认证和安全:识别每个需要认证的资源,拒绝不符合要求的请求。

  • 性能监测:在服务边界追踪并统计数据,提供精确的生产视图。

  • 动态路由:根据需要将请求动态路由到后端集群。

  • 压力测试:逐渐增加对集群的流量以了解其性能。

  • 负载分配:预先为每种类型的请求分配容量,当请求超过容量时自动丢弃。

  • 静态资源处理:直接在边界返回某些响应,从而避免其转发到内部集群。

不管是自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。

Zuul就是服务的统一入口。

1.工程入门

1.1工程基本信息:

 

 

1.2 添加Zuul依赖:

 

 

 1.3编写application.yml配置信息


server:
port: 8090 #服务端口
spring:
application:
name: api-gateway #指定服务名

1.4编写引导类

使用@EnableZuulProxy注解开启Zuul功能


@SpringBootApplication
@EnableZuulProxy // 开启网关功能
public class ItestZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ItestZuulApplication.class, args);
}
}

1.5编写路由规则

使用Zuul来代理test-provider服务


server:
port: 8090 #服务端口
spring:
application:
name: api-gateway #指定服务名
zuul:
routes:
test-provider: # 这里是路由id,随意写
path: /test-provider/** # 这里是映射路径
url: http://127.0.0.1:8081 # 映射路径对应的实际url地址

将符合  path  规则的一切请求,都代理到 url参数指定的地址

测试

2面向服务的路由

对itest-zuul工程修改优化

2.1.添加Eureka客户端依赖


<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

2.2添加Eureka配置,获取服务信息


eureka:
client:
registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
service-url:
defaultZone: http://127.0.0.1:8086/eureka

2.3在启动类中添加Eureka客户端发现功能


@SpringBootApplication
@EnableZuulProxy
// 开启Zuul的网关功能
@EnableDiscoveryClient
public class TestZuulApplication {
public static void main(String[] args) {
SpringApplication.run(TestZuulApplication.
class, args);
}
}

2.4修改映射配置,通过服务名称获取

因为已经有了Eureka客户端,直接可以从Eureka获取服务的地址信息,因此映射时无需指定IP地址,而是通过服务名称来访问,而且Zuul已经集成了Ribbon的负载均衡功能。


zuul:
routes:
test-provider: # 这里是路由id,随意写
path: /test-provider/** # 这里是映射路径
serviceId: test-provider # 指定服务名称

简化配置



  • zuul.routes..path=/xxx/**: 来指定映射路径。是自定义的路由名



  • zuul.routes..serviceId=service-provider:来指定服务名。



大多数情况下路由名称和服务名会写成一样的。

因此Zuul就提供了一种简化的配置语法:

zuul.routes.=


zuul:
routes:
test-provider: /test-provider/** # 这里是映射路径

2.5 Zuul指定了默认的路由规则:

默认情况下,一切服务的映射路径就是服务名本身。例如服务名为:test-provider,则默认的映射路径就 是:/test-provider/**


zuul:
routes:
service-provider: /service-provider/**
service-consumer: /service-consumer/**
prefix: /api # 添加路由前缀

通过zuul.prefix=/api来指定了路由的前缀,这样在发起请求时,路径就要以/api开头。

3过滤器:

Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

3.1ZuulFilter

ZuulFilter是过滤器的顶级父类。其中定义的4个最重要的方法:


public abstract ZuulFilter implements IZuulFilter{
abstract public String filterType();
abstract public int filterOrder();

boolean shouldFilter();// 来自IZuulFilter

Object run()
throws ZuulException;// IZuulFilter
}



  • shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。



  • run:过滤器的具体业务逻辑。



  • filterType:返回字符串,代表过滤器的类型。包含以下4种:



    • pre:请求在被路由之前执行,一般用于请求认证、负载均衡和日志记录。



    • route:在路由请求时调用。这里使用Apache HttpClient或Netflix Ribbon构造对目标的HTTP请求。



    • post:在route和errror过滤器之后调用,般会在此步骤添加响应头、收集统计和性能数据等。



    • error:处理请求时发生错误调用。





  • filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。



 

Zuul Filter有以下几个特征:

 



  • Type:用以表示路由过程中的阶段(内置包含PRE、ROUTING、POST和ERROR)

  • Execution Order:表示相同Type的Filter的执行顺序

  • Criteria:执行条件

  • Action:执行体

 

Zuul提供了动态读取、编译和执行Filter的框架。各个Filter间没有直接联系,但是都通过RequestContext共享一些状态数据。

 

 

3.2过滤器的生命周期

 

 

3.1正常流程:



  • 请求到达首先会经过pre类型过滤器,而后到达route类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。



3.2异常流程:



  • 整个过程中,pre或者route过滤器出现异常,都会直接进入error过滤器,在error处理完毕后,会将请求交给POST过滤器,最后返回给用户。



  • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,将最终结果返回给请求客户端。



  • 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和route不同的是,请求不会再到达POST过滤器了。



3.3过滤器使用场景:



  • 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了



  • 异常处理:一般会在error类型和post类型过滤器中结合来处理。



  • 服务调用时长统计:pre和post结合使用。



4.自定义过滤器

模拟一个登录的校验。

基本逻辑:如果请求中有access-token参数,则认为请求有效,放行。

4.1定义过滤器类package:filter.LoginFilter


@Component
public class LoginFilter extends ZuulFilter {
/**
* 过滤器类型,前置过滤器

*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤器的执行顺序

*/
@Override
public int filterOrder() {
return 1;
}
/**
* 该过滤器是否生效

*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 登陆校验逻辑
*/
@Override
public Object run() throws ZuulException {
// 获取zuul提供的上下文对象
RequestContext cOntext= RequestContext.getCurrentContext();
// 从上下文对象中获取请求对象
HttpServletRequest request = context.getRequest();
// 获取token信息
String token = request.getParameter("access-token");
// 判断
if (StringUtils.isBlank(token)) {
// 过滤该请求,不对其进行路由
context.setSendZuulResponse(false);
// 设置响应状态码,401
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
// 设置响应信息
context.setResponseBody("{\\"status\\":\\"401\\", \\"text\\":\\"request error!\\"}");
}
// 校验通过,把登陆信息放入上下文信息,继续向后执行
context.set("token", token);
return null;
}
}

5.Zuul中的负载均衡和熔断

Zuul中默认就已经集成了Ribbon负载均衡和Hystix熔断机制。

但是所有的超时策略都是走的默认值,如熔断超时时间只有1S,很容易就触发了。

建议我们手动进行配置:


hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 设置hystrix的超时时间为6000ms

相关结束。

 



推荐阅读
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • BPM是什么软件?1、BPM是BusinessProcessManagement的简称,译为业务流程管理,它是一种以规范化的构造端到端的卓越业务流程为中心以持续的提高组织业务绩效为 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • 提供:ZStack云计算原创2016-12-26张鑫讲师介绍张鑫ZStack总架构师、联合创始人《系统虚拟化》主要作者,曾任职Intel开源软件技术中心 ... [详细]
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 使用Docker安装和运行Nexus
    本文介绍了使用Docker安装和运行Nexus的方法,包括docker-compose.yml配置和启动时可能出现的权限问题解决方法。同时提供了登录控制台验证安装的地址和登录信息。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
author-avatar
荧光绿的包包
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有