当外部的应用如何来访问内部各种各样的微服务时,当然可以直接用ip端口加服务来进行访问,但是这样就不能实现负载均衡。当然我们可以将外部应用也加入到eureka中,这样也就可以通过eureka实现负载均衡。但是实际情况下我们不能将所有的请求端都加入eureka中(千万级访问量我们不可能将千万个客户端都加进来),在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。
使用zuul的好处:
1、简化客户端调用复杂度
在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。
2、数据裁剪以及聚合
通常而言不同的客户端对于显示时对于数据的需求是不一致的,比如手机端或者Web端又或者在低延迟的网络环境或者高延迟的网络环境。因此为了优化客户端的使用体验,API Gateway可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验
3、多渠道支持
当然我们还可以针对不同的渠道和客户端提供不同的API Gateway,对于该模式的使用由另外一个大家熟知的方式叫Backend for front-end, 在Backend for front-end模式当中,我们可以针对不同的客户端分别创建其BFF
4、其他
API网关主要为了服务本身对外的调用该怎么调用来解决的,还有解决权限校验的问题,你可以在这里整合调用一系列过滤器的,例如整合shiro,springsecurity之类的东西。
下面我们来试一试zuul
首先再pom里面加入依赖:spring-cloud-starter-netflix-zuul
<?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">
<parent>
<artifactId>parent</artifactId>
<groupId>com.cjc.spring.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cjc.spring.cloud</groupId>
<artifactId>eureka-zuul</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
然后在启动类里面加入@EnableZuulProxy注解
package com.cjc.spring.cloud.zuul.main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ApplicationMain {
public static void main(String arg[]){
SpringApplication.run(ApplicationMain.class);
}
}
最后在application.yml中加入
server:
port: 8085
spring:
application:
name: eureka-zuul
eureka:
client:
register-with-eureka: true #false表示不向注册中心注册自己。
fetch-registry: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
serviceUrl:
defaultZone: http://localhost:8081/eureka/
zuul:
routes:
route-action: #路由名称自己定义
serviceId: eureka-user #访问服务的服务名
path: /** #将访问此地址的请求转发给上面的服务
这时候我们就已经实现负载均衡了,当访问任意一个请求时候,会转发给eureka-user服务处理,如果eureka里面有多个eureka-user服务,zuul就会通过轮询服务列表进行负载均衡转发请求。
启动eureka-server,eureka-user(8001),eureka-user(8002),eureka-zuul
访问 http://localhost:8085/getConfig
这个时候我们就发现请求转发到eureka-user服务的getConfig请求上了,多访问几次,会发现一会访问8001一会访问8002,这样便实现了服务的路由转发和负载均衡。