springcloud(十)-Zuul微服务网关

为什么要使用微服务网关

前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个微服务框架已经完成了。

我们还是少考虑了一个问题,外部的应用如何来访问内部各种各样的微服务呢?

如果让客户端直接与各个微服务通信,会有以下问题:

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  • 存在跨域请求,在一定的场景下处理相对复杂。
  • 认证复杂,每个服务都需要独立认证。
  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个微服务拆分成多个。如果客户端直接与微服务通信,那么重构将很难实施。
  • 某些微服务可能使用了对防火墙/浏览器不友好的协议,直接访问时会有一定的困难。

以上问题可借助微服务网关解决。微服务网关时介于客户端和服务端之间的中间层,所有的外部请求都会先经过微服务网关。使用微服务网关后,架构为:

springcloud(十)-Zuul微服务网关_第1张图片

微服务网关封装了应用程序的内部结构,客户端只用跟网关交互,而无须直接调用特定的微服务接口。这样,开发就可以得到简化。不仅如此,使用微服务网关还有一下优点:

  • 易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。
  • 易于认证。可在微服务网关上进行认证,然后再将请求转发到后端的微服务。
  • 减少了客户端与各个微服务之间的交互次数。

 

编写Zuul

1.创建一个Maven工程,ArtifactId是microservice-gateway-zuul,配置pom.xml文件


  4.0.0

  com.itmuch.cloud
  microservice-gateway-zuul
  0.0.1-SNAPSHOT
  jar

  microservice-gateway-zuul
  http://maven.apache.org

 
        org.springframework.boot
        spring-boot-starter-parent
        1.5.9.RELEASE
    

  
    UTF-8
    1.8
  

  
           
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.springframework.boot
            spring-boot-starter-tomcat

        
        
            org.springframework.boot
            spring-boot-devtools
            true 
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
  
  

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Edgware.RELEASE
                pom
                import
            
        
    
  

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2.在启动类上添加注解@EnableZuulProxy,声明一个Zuul代理。该代理使用Ribbon来定位注册在Eureka Server中的微服务;同时,该代理还整合了Hystrix,从而实现了容错,所有经过zuul的请求都会在Hystrix命令中执行。

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

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

3.编写配置文件application.yml.

server:
  port: 8040
spring:
  application:
    name: microservice-gateway-zuul
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8083/eureka
management:
  security:
    enabled: false

这样,一个简单的微服务网关就编写完了。从配置可知,此时仅添加了Zuul的依赖,并将Zuul注册到EurekaServer上。

测试1

启动项目microservice-discovery-eureka.

启动项目microservice-provider-user.

启动项目microservice-consumer-movie-ribbon。

启动项目microservice-gateway-zuul。

访问http://localhost:8040/microservice-consumer-movie/user/1,请求会被转发到http://loclahost:8010/user/1.

访问http://localhost:8040/microservice-provider-user/1,请求会被转发到http://localhost:8081/1。

说明在默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:

http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。

测试2

启动项目microservice-discovery-eureka.

启动多个microservice-provider-user实例。

启动项目microservice-gateway-zuul。此时,Eureka Server首页如下:

多次访问http://localhost:8040/microservie-provider-user/1,会发现两个用户微服务节点都会打印类似如下日志。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-04-29 19:30:48.253 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [98.23]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]

说明Zuul可以使用Ribbon达到负载均衡的效果。

另外,Zuul也整合了Hystrix.这里不再演示。

你可能感兴趣的:(SpringCloud)