前面所有的微服务都是通过Eureka找到的,但是在很多开发中为了规范微服务的使用,提供有一个处理控制器Zuul。Zuul其实是一个API网关,类似于设计模式里面的Facade门面模式,他的存在就像是整个微服务的门面,所有的外部客户端访问都需要经过它来进行调度与过滤。
代码Git地址:https://gitee.com/hankin_chj/springcloud-micro-service.git
一、zuul的基本使用
1、新建模块springcloud-micro-zuul-gateway
1.1、springcloud-micro-zuul-gateway的pom文件如下
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
1.2、zuul-gateway修改application.yml文件
server:
port: 9501
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://admin:admin@eureka1:7001/eureka,http://admin:admin@eureka2:7002/eureka,http://admin:admin@eureka3:7003/eureka
register-with-eureka: false
spring:
application:
name: springcloud-micro-zuul-gateway
1.3、zuul-gateway创建启动类
@SpringBootApplication
@EnableZuulProxy
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class,args);
}
}
1.4、运行启动报错:
发现启动报错,其实这是因为zuul目前对springboot2.1.2及以上版本的支持并不好,这也是zuul最近一直被人诟病的地方,为了解决这个问题只好降低springboot的版本至2.0.7及以下。
1.5、降低系统的springboot版本为2.0.7.RELEASE
springcloud-micro-service修改父工程pom文件,降低springboot版本为2.0.7.RELEASE
<!-- 进行SpringCloud依赖包的导入处理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud离不开SpringBoot,所以必须要配置此依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<!--<version>2.1.3.RELEASE</version>-->
<version>2.0.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
注意:
因为zuul的使用问题降低了springboot的版本,这个使用要注意将数据库的驱动名称也做相应的修改:
# 配置MySQL的驱动程序类,注意springboot降低版本以后不能使用com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
重新启动ZuulApp:
正常访问用户服务:http://localhost:8090/user/get/1
使用zuul代理访问用户服务:http://localhost:9501/springcloud-micro-user/user/get/1
2、Zuul配置路由
前面以及简单的使用了zuul,但你会发现访问地址还必须知道程序的名称,如果不知道这个名称是无法访问的,但如果让用户知道了这名称,那么使用zuul就是去它的实际意义的,我们可以通过名称直接调用。既然是使用代理,那么代理的功能就是不能让用户看到真实的操作,屏蔽真实的调用地址,这个时候就需要自己增加zuul的路由规则配置了。
2.1、zuul-gateway修改application.yml配置文件,增加路由配置
# 使用zuul代理
zuul:
routes:
springcloud-micro-user: /user-proxy/**
这个时候就可以通过/users-proxy 来访问springcloud-micro-user服务
访问地址:http://localhost:9501/user-proxy/user/get/1,可以正常返回结果。
2.2、忽略掉用户服务的名称
但是还会发现,虽然现在以及开启了路由访问的支持,但依然通过应用程序的名称还是能访问
访问地址:http://localhost:9501/microcloud-provider-users/users/get/1
zuul-gateway修改application.yml文件,忽略掉用户服务的名称:
# 使用zuul代理
zuul:
routes:
springcloud-micro-user: /user-proxy/**
ignored-services: springcloud-micro-user
做完后,就可以进行代理的安全使用,但真实情况下,一般会有很多微服务,如果完全按照上面的配置方式会非常的麻烦,所有最加到的做法是可以采用一个通配符“*”的模式来统一完成。
2.3、zuul-gateway修改application.yml文件
# 使用zuul代理
zuul:
routes:
springcloud-micro-user: /user-proxy/**
#ignored-services: springcloud-micro-user
ignored-services: "*"
重新启动访问:http://localhost:9501/user-proxy/user/get/1,正常返回数据。
访问:http://localhost:9501/springcloud-micro-user/user/get/1,则无法访问。
2.4、zuul中另外一种配置方式
除开上面这一种访问模式以外,在zuul中还有另外一种配置方式,修改application.yml文件:
zuul: # zuul的另外一只配置方式
routes:
user.path: /user-proxy/**
user.serviceId: springcloud-micro-user
ignored-services:
"*"
其中在配置文件中出现的user其实是一个逻辑名称,这个名称主要作用是将path与serviceId绑定在一起。
2.5、zuul-gateway脱离eureka进行访问
zuul-gateway模块如果说不想通过eureka进行访问,对于zuul来说也是可以实现的,但是在真实的开发环境中,基本不会使用,yml配置如下所示:
# zuul-gateway脱离eureka进行访问
zuul:
routes:
user:
path: /user-proxy/**
serviceId: springcloud-micro-user
user2:
path: /user2-proxy/**
url: http://localhost:8090/
ignored-services: