栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring cloud 使用Zuul 实现API网关服务问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring cloud 使用Zuul 实现API网关服务问题

通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统。比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现;

通过Spring Cloud Ribbon或Feign进行负载均衡;通过Spring Cloud Hystrix进行服务容错保护以避免故障蔓延。微服务搭建好了之后我们肯定会提供给外部系统一些统一的RESTFul API服务接口进行调用,

但是当外部系统调用我们的RESTful API的时候,怎么确定它需要的功能具体是哪个服务提供的呢?这个就涉及到一个路由规则和服务实例列表的维护问题。

这就引入了我们今天的主角--Spring Cloud Zuul,它是基于Netflix Zuul实现的API网关组件。它可以解决两个大问题:

  • 就是我们上面提到的路由规则和服务实例的维护问题
  • 对于一些校验(比如登录校验等)冗余问题。 按照我们的习惯的做法,是在每个服务中都需要加入这些校验,但是这样会导致代码冗余并且维护也比较麻烦,有了Spring Cloud Zuul这个网关服务之后,我们可以将这些共通的校验放到网关里面统一维护。

好,接下来我们就来看下怎么实现这个网关服务。

一、构建网关,配置路由

 这里我们还是需要使用到前面的hello-service和feign-consumer服务。我们之前把feign-consumer作为服务消费者,但是别忘了在eureka体系里面,每个服务既是服务提供者又是服务消费者,所以feign-consumer也是一个服务提供者,并且http://localhost:9001/feign-consumer等接口就是它提供的服务。

接下来我们构建一个网关服务,代码结构如下:

代码实现步骤:

新建maven工程api-gateway

修改POM文件


 4.0.0
 com.sam
 api-gateway
 0.0.1-SNAPSHOT
 
  org.springframework.boot
  spring-boot-starter-parent
  1.5.1.RELEASE
 
 
  1.8
 
 
 
  
   
    org.springframework.cloud
    spring-cloud-dependencies
    Camden.SR6
    pom
    import
   
  
 
 
  
  
   org.springframework.cloud
   spring-cloud-starter-zuul
  
 

新建启动类


@EnableZuulProxy
@SpringCloudApplication
public class GateWayApp {

 public static void main(String[] args) {
  SpringApplication.run(GateWayApp.class, args);
 }
}

新建application.properties

server.port=5555
spring.application.name=api-gateway
#增加路由规则的配置
#通过zuul.routes..path和zuul.routes..url进行配置,为路由的名字,可以任意指定,但是一组path和url的路由名要相同
#如下面的例子:所有满足/api-a
public class AccessFilter extends ZuulFilter {
 Logger logger = LoggerFactory.getLogger(AccessFilter.class);
 
 @Override
 public boolean shouldFilter() {
  return true;
 }
 
 @Override
 public Object run() {
  RequestContext context = RequestContext.getCurrentContext();
  HttpServletRequest request = context.getRequest();
  Object accessToken = request.getParameter("accessToken");
  logger.info("send {} request to {}", request.getMethod(),request.getRequestURL().toString());
  if(accessToken == null) {
   context.setSendZuulResponse(false);
   context.setResponseStatusCode(401);
  }
  return null;
 }
 
 @Override
 public String filterType() {
  return "pre";
 }
 
 @Override
 public int filterOrder() {
  return 0;
 }
}

修改启动类


@EnableZuulProxy
@SpringCloudApplication
public class GateWayApp {
 //追加bean的是实现
 @Bean
 public AccessFilter accessFilter() {
  return new AccessFilter();
 }
 
 public static void main(String[] args) {
  SpringApplication.run(GateWayApp.class, args);
 }
}

测试

)访问http://localhost:5555/hello-service/hello,访问失败

)访问http://localhost:5555/hello-service/hello?accessToken=token,正常访问

修改后的代码结构:

 五、拓展延伸

其实路由功能在真正运行时,他的路由映射和请求转发都是由几个不同的过滤器完成的。

路由映射主要通过pre类型的过滤器完成,他将请求路径与配置的路由规则进行匹配,找到需要转发的目标地址。

而请求转发的部分则是由route类型的过滤器完成的,对pre类型过滤器获取的路由地址进行转发。

所以,过滤器可以说是Zuul实现API网关功能最为核心的部件,每一个进入Zuul的HTTP请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。

总结

以上所述是小编给大家介绍的spring cloud 使用Zuul 实现API网关服务问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/140939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号