我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载。为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。
在该架构中,我们的服务集群包含:内部服务Service A和Service B,他们都会注册与订阅服务至Eureka Server,而Open Service是一个对外的服务,通过均衡负载公开至服务调用方。我们把焦点聚集在对外服务这块,直接暴露我们的服务地址,破坏了服务无状态特点。无法直接复用既有接口(对外需要权限控制,对内不需要权限控制,对于同一个接口就需要写两个一样接口 )。 而网关就解决了这一问题。
简介
1、Zuul包含了对请求的路由和过滤两个最主要的功能:
(1)其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
(2)Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由,均衡负载,他还具备权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样一个角色,为微服务架构提供了前门保护的作用,同时将权限控制比较重的非业务逻辑内容迁移到服务器路由层面上。
注意:Zuul服务最终还是会注册Erueka
网关存在的意义就是将自己暴露给外部,对于微服务的调用都要通过网关进行访问。
加入zuul网关后的架构图
Zuul中默认就已经集成了Ribbon负载均衡和Hystix熔断机制。但是所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了。因此建议我们手动进行配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 设置hystrix的超时时间为6000ms
参数配置
pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
yml配置
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
# 映射规则
zuul:
routes:
service-provider: # 这里是路由id,随意写
path: /service-provider/** # 这里是映射路径
url: http://127.0.0.1:8081 # 映射路径对应的实际url地址
服务启动配置
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
@EnableDiscoveryClient
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
}