原创

如何使用spring-cloud-zuul实现spring-cloud路由管理

什么是zuul

官方原话是这样说的:

Zuul is the front door for all requests from devices and web sites to 
the backend of the Netflix streaming application. 
As an edge service application, Zuul is built to enable dynamic routing, monitoring, 
resiliency and security. It also has the ability to route requests to 
multiple Amazon Auto Scaling Groups as appropriate.

直白的说:

Zuul,微服务系统的网关组件。通过动态路由映射,达到整合所有微服务功能的目的,简单方便安全可靠便于监控。

如何使用zuul

为了达成基础的测试需求,我们需要三个微服务一个是zuul本身,端口80;一个是eureka注册中心,端口1000;一个是网站门户的首页,端口2000,我们将这三个微服务模块全部放到一个parent工程内。

创建父工程,并配置pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>project-parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>module-project-eureka</module>
        <module>module-project-portal</module>
        <module>module-project-zuul</module>
    </modules>
    <packaging>pom</packaging>

    <!--配置在父工程中管理的依赖-->
    <dependencyManagement>
        <dependencies>
            <!--spring cloud 需要的依赖信息-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring boot 需要的依赖信息-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

配置eureka注册中心

eureka的pom文件依赖引入

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

eureka的主启动类

@EnableEurekaServer // 启动Eureka注册中心的server端
@SpringBootApplication
public class EurekaMainApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMainApp.class, args);
    }
}

eureka的application.yml配置文件

server:
  port: 1000

spring:
  application:
    name: project-eureka # 注册微服务的名称

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false  # 自己不需要注册
    fetch-registry: false # 自己不需要去注册中心取回信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

编写门户网站微服务

portal的pom文件依赖引入

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--配置thymeleaf一会便于测试-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!--eureka的客户端依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

portal的主启动类

@EnableEurekaClient // 部分低版本的springboot可能需要这个注解开启eureka的client支持
@SpringBootApplication
public class PortalMainApp {
    public static void main(String[] args) {
        SpringApplication.run(PortalMainApp.class, args);
    }
}

portal的application.yml配置文件

server:
  port: 2000
  
spring:
  application:
    name: project-portal
  thymeleaf: # thymeleaf配置引擎识别html文件的前后缀
    prefix: classpath:/templates/
    suffix: .html

eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

portal的Controller控制器

@Controller
public class PortalController {
    @RequestMapping("/")
    public String portal() {
        return "portal";
    }
}

因为模板引擎中已经配置类存储HTML的根文件夹为templates,所以我们需要在resources目录下创建一个templates文件夹,然后新建一个portal.html文件(/resources/templates/portal.html)

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<p th:text='portal首页,测试zuul'></p>
</body>
</html>

配置zuul

zuul的主启动文件

@EnableZuulProxy // 启用zuul代理
@SpringBootApplication
public class ZuulMainApp {
    public static void main(String[] args) {
        SpringApplication.run(ZuulMainApp.class, args);
    }
}

zuul的application.yml配置文件

server:
  port: 80
  
spring:
  application:
    name: project-zuul
    
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

zuul:
  routes:
    portal: # 自定义路由名称
      service-id: project-portal # 映射的微服务名称
      path: /** # 需要路由的路径,/**的目的是/后面的多层路径的文件都支持访问
  ignored-services: "*" # 忽略原本的微服务名称,达到的效果就是只允许使用path访问,不允许使用service-id进行访问

启动微服务进行测试

启动微服务理论上要先启动eureka注册中心,这样其他微服务启动后可以直接注册进来,如果不这么做,当eureka注册中心没有启动时,其他微服务启动后会因为找不到注册中心而报错,但并不影响使用。而这个报错直到eureka注册中心启动之后,eureka的客户端再次寻找注册中心从而完成注册后消失。

当服务启动后,我们访问localhost即可直接访问portal的首页。

java学习笔记
框架知识
微服务开发
  • 作者:JackLiu
  • 发表时间:2020-12-09 03:46:00
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公共号二维码

评论列表