一个应用中可能包含PC、APP等等终端产品,如果使用单一服务入口的话,发生故障后,整个架构服务将不能提供服务。因此我们可以对不同的服务,配置不同的网关策略,正如nginx一样,可以负载均衡。
服务网关的要素:
稳定性,高可用;安全性;性能,并发性;扩展性;
一般api网关的实现方法有这么几种:
1、Nginx
2、zuul
3、Kong,专门提供微服务API管理平台(底层也是基于Nginx)
API网关的好处:
避免将内部信息暴露给外部;
统一入口;
为微服务添加额外的安全层;
支持混合通信协议;
降低构建微服务的复杂性;
微服务模拟与虚拟化;
缺点:
在架构上需要额外考虑更多编排和管理;
路由逻辑配置要进行统一的管理;
可能引发单点故障;
接下来,我们介绍下springboot整合zuul的过程,
Zuul的特点是:
路由+过滤器=zuul,它的核心是一系列的过滤器。有前置过滤器,可以限流、鉴权、参数校验、请求转发等等。
后置过滤器,可以统计业务、记录日志。生产环境中,我们要配置多台zuul,多个zuul节点注册到Eureka Server,实现高可用。
对应springcloud微服务来说,多个eureka server的zuul服务,可以在多台server互相注册,获取数据。
pom.xml引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
Application.class
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
application.yml
#记住每个属性和值之间,要在冒号后面加一个空格
#指定启用端口
server:
port: 8766
eureka:
instance:
hostname: peer3
client:
registerWithEureka: false
fetchRegistry: true
serviceurl:
defaultZone: http://peer1:8761/eureka/
spring:
application:
name: zuul
#zuul配置,这里配置了两条http和weath
zuul:
routes:
http:
path: /htp/**
serviceId: weather-api
weath:
path: /weath/**
serviceId: weather
zuul还可以设置某些路径,不暴露给请求客户端,使用属性ignored-patterns排除某些路由,此外
加上zuul网关,默认服务器端是不会接受cookie的,所以我们也是添加属性sensitiveHeaders,设置为空就可以。
如果网关路由有更改,那么是不是要重启服务呢?这里我们可以结合springcloud config的自动更新,把配置存储到
springcloud config server,结合消息队列实现动态路由更新。
使用/weath/**访问