SpringCloud学习系列之六 ----- 路由网关Zuul使用教程

栏目: Java · 发布时间: 5年前

内容简介:在上篇中介绍了Spring Cloud Zuul 主要的功能是提供负载均衡、反向代理、权限认证、动态路由、监控、弹性、安全等的边缘服务。其主要作用是为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。通俗一点来说,就是对服务提供一层保护,对外界的请求进行过滤转发到后端服务中。

在上篇中介绍了 SpringCloud Config 的完美使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关(SpringCloud Zuul)的使用教程。

SpringCloud Zuul

介绍

Spring Cloud Zuul 主要的功能是提供负载均衡、反向代理、权限认证、动态路由、监控、弹性、安全等的边缘服务。其主要作用是为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

通俗一点来说,就是对服务提供一层保护,对外界的请求进行过滤转发到后端服务中。

这里我们可以通过几张简单的示例图来进行了解.。

不使用路由网关的示例图:

SpringCloud学习系列之六 ----- 路由网关Zuul使用教程

使用路由网关的示例图:

SpringCloud学习系列之六 ----- 路由网关Zuul使用教程

使用路由网关并且加上注册中心的示例图:

SpringCloud学习系列之六 ----- 路由网关Zuul使用教程

从上述的示例图中,我们发现加了路由网关之后,实际上是将一对多的关系转变成了一对一的关系,这样的好处是我们可以在网关层进行数据合法校验、权限认证、负载均衡等统一处理,这样可以在很大的程度上节省的人力和物力,但是这种方式也有一定的弊端,就是以后新增了服务或者在服务中新增方法,就会使得网关层可能需要进行改动。幸好在Spring Cloud 有 Zuul 这样一个组件,通过eureka将网关和微服务之间相互关联起来,都会在eureka上进行注册,这样Zuul就能感知到哪些服务在线,并且可以通过配置路由规则将请求自动转发到指定的后端微服务上,这样即使后续新增了服务或者在服务中新增了某些方法,那么只需在Zuul层进行简单配置即可。

开发准备

开发环境

  • JDK :1.8
  • SpringBoot :2.0.6.RELEASE
  • SpringCloud :Finchley.SR2

注:不一定非要用上述的版本,可以根据情况进行相应的调整。需要注意的是SpringBoot2.x以后,jdk的版本必须是1.8以上!

服务端

由于我们这里是使用的第三种模式,所以需要使用到Eureka注册中心,因此这里我们也顺便弄一个注册中心服务。

注册中心这块配置和代码和之前 springcloud-config 配置基本一样即可。注册中心新项目的的名称为 springcloud-zuul-eureka

注册中心 pom 配置、 application.properties 配置和代码如下:

pom:

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

application.properties:

spring.application.name=springcloud-zuul-eureka
server.port=8006
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

代码:

@EnableEurekaServer
@SpringBootApplication
public class ZuulApplication {
  public static void main(String[] args) {
      SpringApplication.run(ZuulApplication.class, args);
      System.out.println("zuul注册中心服务启动...");
  }
}

注册中心服务配置完成之后,我们在新增一个Zuul服务,该服务的 pom 配置、 application.properties 配置和代码如下:

pom:

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

application.properties:

spring.application.name=springcloud-zuul-gateway
server.port = 9009
eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/

zuul.routes.hello.path = /hello/**
zuul.routes.hello.url = http://localhost:9010/hello
zuul.routes.hi.path = /hi/**
zuul.routes.hi.url = http://localhost:9011/hi

代码:

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy   
public class ZuulApplication {
	public static void main(String[] args) {
		SpringApplication.run(ZuulApplication.class, args);
		 System.out.println("zuul 服务启动...");
	}
}

客户端

客户端这边在之前 springcloud-config-client 项目中进行改造,新项目的的名称为 springcloud-config-bus-client ,在pom文件中新增如下配置:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

spring-boot-starter-actuator 表示对该程序进行监控,可以通过http接口得到该程序的各种信息,详细的使用可以查看我的这个项目 springboot-actuator ,可以在注释中查询各种接口的使用。

然后再到配置文件 application.properties 中添加如下配置:

management.endpoints.web.exposure.include=refresh

该配置表示暴露刷新的地址为refresh。

注:如果是SpringBoot1.x的版本,那么配置改成 management.security.enabled=false 即可。

最后在客户端的Controller增加一个 @RefreshScope 注解,该注解表示在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。

@RestController
@RefreshScope
public class ClientController {
	
	@Value("${word}")
	private String word;
	
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return name+","+this.word;
    }
}

测试

完成上述的代码开发后,我们来进行测试Spring-Config是否可以进行配置实时更新。

首先依次启动 springcloud-config-bus-eurekaspringcloud-config-bus-serverspringcloud-config-bus-client 这三个项目。其中9005是服务端 springcloud-config-bus-server 的端口,9006是第一个客户端 springcloud-config-bus-client 的端口。

启动成功之后,在浏览器输入:

http://localhost:9010/hello/pancm

界面返回:

pancm,hello world!!

输入:

http://localhost:9011/hi?name=pancm

界面返回:

pancm,hi!

输入:

http://localhost:9009/hello/pancm

界面返回:

pancm,Hello World!

输入:

http://localhost:9009/hi?name=pancm

界面返回:

pancm,hi!

示例图:

SpringCloud学习系列之六 ----- 路由网关Zuul使用教程 SpringCloud学习系列之六 ----- 路由网关Zuul使用教程 SpringCloud学习系列之六 ----- 路由网关Zuul使用教程 SpringCloud学习系列之六 ----- 路由网关Zuul使用教程

SpringCloud学习系列之六 ----- 路由网关Zuul使用教程


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何构建敏捷项目管理团队

如何构建敏捷项目管理团队

丽萨·阿金斯 / 徐蓓蓓、白云峰、刘江华 / 电子工业出版社 / 2012-6 / 49.00元

《敏捷项目管理系列丛书•PMI-ACPSM考试指定教材•如何构建敏捷项目管理团队:ScrumMaster、敏捷教练与项目经理的实用指南》结合作者的亲身经历告诉读者如何建立一个高性能的敏捷项目管理团队,以及最终成为一名优秀的敏捷教练。作者将敏捷教练定义为导师、协助者、老师、问题解决者、冲突领航员、协作指挥者,正是这种不同角色之间的细微区别才使敏捷教练的工作富有深度。《敏捷项目管理系列丛书•PMI-A......一起来看看 《如何构建敏捷项目管理团队》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器