在一个实际业务当中通常都会调用多个服务接口,而每个服务接口的ip/端口or域名都不一样,这样在实际调用中会变得十分繁琐,而且当服务接口ip/端口or域名修改后,业务系统也需要进行相应的修改,大大增加了开发维护成本,所以一般的做法都是在多个服务接口上游再添加一层,我们通常称之为网关。网关能够实现多种功能,比如反向代理,负载均衡,拦截器。在拦截器中我们还可以实现身份验证,反网络爬虫等等功能。
在Spring Cloud中,可以使用Zuul来实现网关层。
服务调用者向Zuul服务发送调用请求,Zuul服务通过各种filter进行身份验证,反爬虫等等操作后,根据配置信息从Eureka服务注册中心获取到调用的服务的实际ip/端口等信息,然后将请求发向服务提供者。
PS:本片内容都基于Spring Boot 2.X
这里继续在上篇中的项目基础上进行扩展。
总体为1个服务注册中心,1个配置中心,3个服务(serviceI,serviceII,serviceIII),1个网关。其中I,II两个服务为不同的服务,剩下的III服务与I服务完全一样,注册用的service id一致,只有端口和提供的服务输出不同(来验证负载均衡)。
整体代码下载:Spring Cloud Zuul服务示例
一.服务注册中心
SpringCloudServiceCenter项目继续维持不变,启动。(端口8761)
二.配置中心
SpringCloudConfig项目也继续维持不变,启动。(端口8091)
同时新建myServiceII-dev.properties和myServiceII-prod.properties(内容和myServiceI对应的相同即可),并向远程git仓库推送。
三.服务I
SpringCloudServiceI项目维持不变
service id 为myServiceI,并添加了路径/myServiceI,端口为8762
四.服务II
新建SpringCloudServiceII项目,配置部分与SpringCloudServiceI大致一样。
service id 为myServiceII,并添加了路径/myServiceII,端口为8763
(1)pom.xml
<?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>com.my.serviceII</groupId>
<artifactId>SpringCloundServiceII</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringCloundServiceII</name>
<description>com.my.serviceII</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-config</artifactId>
</dependency>
<!--添加 重试机制 的依赖
因网络的抖动等原因导致config-client在启动时候访问config-server没有访问成功从而报错,
希望config-client能重试几次,故重试机制
-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</arti