该栏目讲叙微服务概念、注册中心、负载均衡、配置中心、服务熔断、服务消费等知识
简介
1、概述
- :API 网关就像一个安检站,所有外部的请求都需要经过它的调度与过滤,然后由 API 网关根据请求标识解析出具体的微服务地址,再把请求转发到该微服务
2、场景
路由
过滤
监控
安全认证
限流
3、优点
易于监控
易于认证
减少了客户端与各个微服务之间的交互次数
Nginx 实现 API网关
下载
:http://nginx.org/en/download.html
配置规则
# 打开nginx.conf
http {
server {
listen 80;
server_name localhost;
# 路由到商品服务
localhost /api-order { # 当客户端访问这个路径时转发到proxy_pass指定的路径
proxy_pass http://localhost:7070/;
}
# 路由到订单服务
localhost /api-product { # 当客户端访问这个路径时转发到proxy_pass指定的路径
proxy_pass http://localhost:9090/;
}
}
}
Zuul 实现 API网关
1、路由配置规则
服务名称路由
zuul:
routes:
product-service: # 路由Id自定义
path: /product-service/** # 配置请求URL的映射路径
serviceId: product-service # 根据serviceId自动从注册中心获取服务地址并转发
# 当路由Id和服务名称一致时,可以省略serviceId
路由排除
zuul:
ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
# 不受路由排除影响
routes:
product-service:
path: /product-service/**
serviceId: product-service
服务名称路由
zuul:
routes:
product-service:
path: /product-service/**
serviceId: product-service
prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1
2、网关过滤器
概述
:对请求进行干预,是实现请求校验,服务聚合等功能的基础类型
描述 | 类型 |
---|---|
前置过滤 | pre |
路由后过滤 | pre |
后置过滤 | post |
异常过滤 | error |
生命周期
3、案例
配置依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
配置规则
server:
port: 9000 # 端口
spring:
application:
name: zuul-server # 应用名称
# 配置路由
zuul:
ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1
routes:
product-service: # 路由Id自定义
path: /product-service/** # 配置请求URL的映射路径
# 配置注册中心
eureka:
instance:
prefer-ip-address: true #启用IP地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port} #ip:port
client:
registry-fetch-interval-seconds: 10 # 表示客户端间隔多久向服务端摘取注册信息,默认30秒
service-url: # 设置服务注册中心
default-zone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
编写过滤器
// 用户登录过滤器
public class LoginFilter extends ZuulFilter {
// 四种类型:pre,routing,error,post
@Override
public String filterType() {
return "pre";
}
//自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行
@Override
public int filterOrder() {
return 0;
}
//控制过滤器生效不生效,可以在里面写一串逻辑来控制
@Override
public boolean shouldFilter() {
return true;
}
//执行过滤逻辑
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (token == null) {
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
context.setResponseBody("unAuthrized");
}
return null;
}
}
启动网关
@SpringBootApplication
@EnableZuulProxy
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
}