Life

Friday, June 26, 2020

Spring Cloud(四):服务网关

    在分布式项目架构中,会将服务进行拆分,各个微服务负责一部分业务功能,实现软件架构层面的解耦合。同时,为提高系统健壮性、可靠性,需进行容错,提高冗余,增设多个同样的微服务,当检测到某一服务失效后,启动备份服务保证系统的正常。
    但大数量的微服务并不利于系统开发,每个服务都有不同的网络地址,客户端在请求不同的微服务需要调用不同的URL,同时维护多个URL将增加开发的成本。
     为统一管理不同微服务的URL,增强系统的维护性,采用一种解决方案:API网关。使用API网关对所有的API请求进行管理维护,为系统开放一个统一的接口,所有的外部请求只需要访问这个统一的入口即可,系统内部通过API网关映射到不同的微服务。

Zuul

Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。Spring Cloud集成了Zuul,因此我使用Zuul来实现这个微服务网关。
  • 在父工程下新建一个Module为gateWay
  • 在pom.xml文件中添加Zuul和Eureka Client依赖,Zuul也将作为一个Eureka Client在注册中心完成注册。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在resources路径下创建配置文件application.yml,添加网关的相关配置。
server:
  port: 8030

spring:
  application:
    name: gateWay
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    provider: /p/**
说明:zuul.routes.*:自定义微服务的访问路径,例如这里的zuul.routes.provider: /p/**,就是将provider微服务映射到gateWay的/p/**路径下。
  • 在java路径下床见启动类GateWayApplication。
@EnableZuulProxy
@EnableAutoConfiguration
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
}
@EnableZuulProxy是@EnableZuulServer的超集,拥有@EnableZuulServer中的所有过滤器。此外还加入了@EnableCircuitBreaker与@EnableDiscoveryClient。@EnableCircuitBreaker 是实现熔断处理的注解,@EnableDiscoveryClient注解是将服务注册到服务中心,并发现服务的。
  • 依次启动注册中心、服务提供者provider,运行GateWayApplication。启动成功后访问http://localhost:8761.
  • 可以发现服务提供者provider和网关gateway都已完成注册,接下来便通过http://localhost:8030/p/**访问provider提供的服务了,如通过Postman测试http://localhost:8030/p/actor/findAll
  • 实际情况下我的服务可能多达十多个,那我是不是需要在zuul:routes 下面去一一配置呢?其实不必。Spring Cloud Zuul提供了默认配置,Zuul会代理所有注册到Eureka Server的微服务,并根据路由规则{http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**}进行转发。
      将关于路由的配置注释:
server:
  port: 8030

spring:
  application:
    name: gateWay
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
#zuul:
#  routes:
#    provider: /p/**
重新启动后,访问http://localhost:8030/provider/actor/findAll。得到同样的结果,说明Spring Cloud Zuul默认提供了转发功能。

       至此一个简单的使用Zuul实现服务网关的例子就完成了。当然实例中展示的是最简单的路由功能,实际上为了做安全限制,需要添加过滤器和拦截器对请求进行过滤。Zuul可以配置复杂的路由过滤规则,如自带的前置过滤器PreDecorationFilter;路由过滤器RibbonRoutingFilter、SimpleHostRoutingFilter。如果觉得这些过滤器不符合要求,还可以通过继承ZuulFilter 类来自定义过滤器。



版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2020/06/spring-cloud_26.html

1 comment:

  1. Betway Casino: Safe or Scam? - DrmCD
    Are you on edge over your gaming 화성 출장마사지 cage? 전주 출장안마 Or just 남양주 출장마사지 looking for an alternative to some casino? Our experts explain. 정읍 출장샵 Rating: 4.1 · 안동 출장안마 ‎2 votes

    ReplyDelete