我们微服务架构中,各个微服务之间的调用是通过各个eureka客户端把自己注册到eureka服务端中,然后使用feignClient进行调用。这样我们就可以只关心调用的微服务的服务名而无需关心他的实际IP,端口,集群的负载均衡。那么问题来了,如果外部调用呢?前后端分离时,前端调用我们后端暴露接口,如何做到动态调整,负载均衡,并且如果直接访问后端暴露接口是否真正安全?所以今天我们来看一下Spring Cloud 给我们提供的服务网关 Zuul。
服务网关我理解就是在前端用户和后端真正进行处理的微服务之间的一道墙。让客户先访问网关,再由网关进行转发。
图:
1,后端暴露接口往往都是动态调整的,使用网关代理转发,简化前端调用的难度,可以不用考虑每个微服务的host,port以及负载和动态调整,只要知道调用的是哪个微服务即可。
2,使用网关后可以不直接暴露接口给外部,强化了后端微服务的安全性。并且可以进行token验证。
3,网关可以进行服务聚合,将一些通用请求聚合在一起,减少请求次数。
4,可以配合shiro进行一系列权限校验工作。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-zuul
1,需要将Zuul添加到eureka中进行注册。所以添加了eureka依赖
2,添加zuul依赖
spring:
application:
name: travelsky-zuul #注册到eureka中的服务名
server:
port: 8085 #端口号
#这个是zuul默认规则展示
#zuul:
# routes:
# api-a:
# path: /travelsky-producer-test/**
# serviceId: travelsky-producer-test
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8081/eureka/ #注册到eureka
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import com.travelsky.zuul.filter.TokenFilter;
@SpringBootApplication
//开启zuul网关代理
@EnableZuulProxy
//开启eureka注册
@EnableDiscoveryClient
public class TravelskyZuulApplication {
public static void main(String[] args) {
SpringApplication.run(TravelskyZuulApplication.class, args);
}
}
这时候我们的zuul已经简单的配置好了。
微服务架构中,启动顺序很重要,根据之前我们是用的eureka和spring cloud config,所以启动顺序为:
1,eureka server,端口8081。
2,spring cloud config,端口8084。
3,spring cloud zuul,端口8085。
4,服务提供者travelsky-producer-test,暴露接口:/get1/{id}
端口8050
@GetMapping("/get1/{id}")
public String get1(@PathVariable("id")String id) {
return id+"==调用测试生产者8050接口";
}
5,启动服务消费者travelsky-consumer-test,请求接口:/get1
8060
@GetMapping("/get1")
public String get1(){
return service.get1("8060");
}
启动完毕后我们打开eureka的页面查看一下:
根据zuul默认规则,我们请求时只需请求zuul+微服务名+url即可。
所以http://localhost:8085/travelsky-consumer-test/get1。
得到结果:
很明显我们的服务网关已经设置成功了。
zuul和feign框架一样,都集成了spring cloud ribbon负载均衡,他会去循环调用我们的每个微服务的多个节点,保证每个节点都可用的同时,不会出现某一个节点突然高并发。
下面我们在上面的基础上多启动几个服务,对上面的进行一下改造。
1,2,3,没有变化就不多说了。
4,服务提供者travelsky-producer-test,暴露接口:/get1/{id}
端口8050
@GetMapping("/get1/{id}")
public String get1(@PathVariable("id")String id) {
return id+"==调用测试生产者8050接口";
}
8051
@GetMapping("/get1/{id}")
public String get1(@PathVariable("id")String id) {
return id+"==调用测试生产者8051接口";
}
8052
@GetMapping("/get1/{id}")
public String get1(@PathVariable("id")String id) {
return id+"==调用测试生产者8052接口";
}
5,启动服务消费者travelsky-consumer-test,请求接口:/get1
8060
@GetMapping("/get1")
public String get1(){
return service.get1("8060");
}
8061
@GetMapping("/get1")
public String get1(){
return service.get1("8061");
}
8062
@GetMapping("/get1")
public String get1(){
return service.get1("8062");
}
全部启动完毕后,查看eureka页面
第一次请求:
第二次请求:
第三次请求:
后续不在贴了。可以证明,zuul中直接对我们的请求进行了负载均衡,每次请求到客户端都会被负载均衡到某一台服务器。然后@feignclient同样也有负载均衡。并不需要我们进行任何配置,默认进行多节点负载均衡。这样省却了我们自己手动进行ribbon的麻烦。