springcloud(十)-Zuul微服务网关

为什么要使用微服务网关

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

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

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

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

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

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

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

编写Zuul

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.itmuch.cloud</groupId>
  <artifactId>microservice-gateway-zuul</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>microservice-gateway-zuul</name>
  <url>http://maven.apache.org</url>

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
           <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--         用于监控spring boot 端点 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
<!--             <scope>provided</scope> -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <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>
  </dependencies>
  
<!--   引入spring cloud 的依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Edgware.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  
<!--   添加spring-boot 的maven插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

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.

扫描二维码关注公众号,回复: 6062164 查看本文章

启动项目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.这里不再演示。

猜你喜欢

转载自www.cnblogs.com/fengyuduke/p/10792431.html